Интересно, почему у фреймворков / библиотек есть свои помощники, хотя они уже существуют изначально.
Давайте возьмем jQuery и AngularJS . У них есть свои собственные each
функции итератора:
Но у нас есть Array.prototype.forEach
.
По аналогии,
Но у нас есть JSON.parse()
функция в ванильном JavaScript.
javascript
libraries
web-framework
Джихад Турхан
источник
источник
jQuery.each
иArray.prototype.forEach
не эквивалентны.$.each
, а не использовать нативный (и быстрее)Array.prototype.forEach
?Ответы:
Потому что, когда эти библиотеки были написаны, некоторые основные браузеры не поддерживали эти функции. После написания и использования эти функции не могут быть удалены из этих библиотек, не нарушая многие приложения.
(В данном случае «основной браузер» означает браузер, который все еще имеет большую долю рынка, который включает в себя более старые версии браузеров, таких как Internet Explorer, где большое количество пользователей не обязательно обновляется до последней версии.)
источник
Array.prototype.forEach
выполняет итерацию только над массивами - обе функции библиотеки итератора могут выполнять итерацию над массивами или объектом.Потому что разные браузеры имеют разные реализации и функции, встроенные в их движок JavaScript. Один и тот же код "vanilla-JS" может работать по-разному в двух разных браузерах или даже в двух разных версиях одного и того же браузера.
Уровень абстракции, предоставляемый популярными библиотеками JS, позволяет обойти это. За кулисами он работает с различными возможностями и ограничениями браузеров и предлагает унифицированный, простой в использовании API поверх них. Это, в свою очередь, позволяет согласованным, эффективным и независимым от браузера обычным операциям, таким как получение объекта DOM или выборка данных JSON.
Это значительно облегчает жизнь разработчикам, которые теперь могут сосредоточиться на том, что должен делать код, а не на том, как он должен быть написан для работы с браузером X или Y.
источник
Array.prototype.forEach
иJSON.parse
функции, быстрый поиск по Google покажет вам , что вы не правы.JSON
объект не был поддержан в IE7 иforEach
не был определен в некоторых версиях Opera. Однако такие библиотеки, как jQuery, знали об этих ограничениях и обходили их за кулисами. Поэтому я думаю, что мой ответ остается в силе.1. Обратная совместимость
JavaScript - это реализация ECMAScript . Большинство из этих функций были введены в ECMAScript 5 (ES5), однако многие старые браузеры, которые все еще имеют достаточно значительную долю рынка, не поддерживают эти функции (см. Таблицу совместимости ECMAScript 5 ), наиболее заметной из которых является IE8.
Как правило, библиотеки возвращаются к собственной реализации, если она существует, в противном случае они используют собственный полифилл, например, давайте посмотрим на реализацию AngularJS ( angular.js L203-257 ):
Следующие строки проверяют,
forEach
существует ли метод на объекте и является ли он версией AngularJS или нет. Если нет, он использует уже указанную функцию (нативная версия):2. Удобство
В нативном JavaScript
Array.prototype.forEach
это метод, эксклюзивный для экземпляраArray
, но большинствоObject
any тоже итерируемо.По этой причине многие создатели библиотек делают свои функции полиморфными (способными принимать в качестве входных данных несколько типов). Давайте возьмем приведенный выше код AngularJS и посмотрим, какие входные данные он принимает:
Функции :
Массивы (с собственной поддержкой forEach):
Подобные массиву объекты, включая Array (без встроенной поддержки forEach), String, HTMLElement, Object с допустимым свойством длины:
Объекты:
Заключение
Как вы можете видеть, AngularJS будет перебирать практически любой объект JavaScript, хотя он работает так же, как и нативная функция, он принимает гораздо более разные типы ввода и, таким образом, является допустимым дополнением к библиотеке, а также способом вызова функций ES5. в устаревших браузерах.
источник
master
внесения изменений.