Какие браузеры поддерживают es6
Как я могу узнать версию движка Javascript браузера и поддержку ECMAScript 6?
Я использую navigator.appVersion просто знать версию браузера, но не версию двигателя.
функция обнаружения
я предлагаю вам использовать функция обнаружения вместо обнаружения движка браузера эвристическими методами. Сделать это вы можете просто обернуть код внутри try <..>catch (e) <. >заявление, или использовать какой-нибудь if (. ) заявления.
почему обнаружение функций лучше, чем обнаружение браузера/двигателя?
Существует несколько причин, которые делают, в большинстве из случаев, функция обнаружения лучший вариант:
вам не нужно полагаться на версию браузера, движок или специфику, а также обнаруживать их с помощью эвристических методов, которые трудно и довольно хитро реализовать.
вы не попадете в ошибки, касающиеся обнаружения спецификаций браузера / двигателя.
вам не нужно беспокоиться о специфичных для браузера функциях: например WebKit браузеры имеют различные характеристики, чем другие.
вы можете быть уверены, что, как только функция будет обнаружена, вы сможете ее использовать.
это основные причины, по которым IMHO делает обнаружение функций лучшим подходом.
обнаружение функций + резервный
при использовании функция обнаружения, очень хитрый способ работы, когда вы не уверены, какие функции вы можете/не можете использовать состоит в несколько признаков обнаружения и последующего нейтрализаций к более основным методам (или даже создание этих методов с нуля) в случае, если функции, которые вы хотите использовать, не поддерживаются.
простой пример обнаружение функций с резервным может применяться к window.requestAnimationFrame функция, которая не поддерживается всеми браузерами и имеет различные префиксы в зависимости от браузера которым вы работаете. В этом случае, вы можете легко обнаружить и откат такой:
обнаружение функций ECMAScript 6 (Harmony)
теперь перейдем к проблема: если вы хотите обнаружить поддержку ES6, вы не сможете вести себя так, как я сказал выше, потому что соответствующий диапазон функций ES6 основан на новых синтаксисах и частных словах и будет бросать SyntaxError если используется в ES5, что означает написать скрипт, который содержит ES5 и ES6 невозможны!
вот пример, чтобы продемонстрировать эту проблему; приведенный ниже фрагмент не будет работать, и он будет заблокирован перед выполнением, потому что содержит незаконный синтаксис.
теперь, так как вы не можете одновременно проверять и выполнять ES6 условно в одном скрипте, вам придется написать два разных сценария: один, который использует только ES5, и другой, который включает в себя функции ES6. С двух разных скриптов уметь импортируйте ES6 только в том случае, если он поддерживается, и не причиняя SyntaxErrors быть брошенным.
ES6 обнаружение и условное выполнение пример
теперь давайте сделаем более относительный пример, и предположим, что вы хотите использовать эти функции в своем скрипте ES6:
- новая Symbol объекты
- классы, построенные с class ключевое слово
- стрелка ( (. )=>) функции
Примечание: функция обнаружения вновь вводимых синтаксис (функции стрелы) можно сделать только с помощью eval() функции или другие аналоги (например, Function() ), потому что написание недопустимого синтаксиса остановит скрипт перед его выполнением. Это также причина, по которой вы не можете использовать if операторы для обнаружения классов и функций со стрелками: эти функции относятся к ключевым словам и синтаксису, так что eval(. ) завернут внутри try <. >catch (e) <. >блок будет работать нормально.
Итак, переходя к реальному коду:
код es5script.js сценарий:
обнаружение браузера / двигателя
как я уже сказал выше, браузер и обнаружение двигателя не являются лучшими практиками, когда Программирование некоторых сценариев JavaScript. Я собираюсь дать вам некоторые предпосылки по этой теме, просто не оставляйте мои слова как "случайное личное мнение".
цитирование из документации MDN [ссылке]:
кроме того, вы говорите, что используете navigator.appVersion , но подумайте об использовании другого подхода, потому что этот, вместе со многими другими свойствами навигатора, является устаревший, и не всегда ведет себя так, как вы думаете.
Итак, цитируя из документации MDN [ссылке] еще раз:
поставщики браузеров, которые поддерживают модули ES6, теперь предоставляют простой способ обнаружения функций:
скрипт nomodule атрибут не будет отменен браузерами, которые поддерживают
вы также можете ввести скрипт следующим образом:
Как сказал Марко Бонелли, лучший способ обнаружить синтаксис языка ECMAScript 6-использовать eval ();. Если вызов не выдает ошибку, поддерживаются" все остальные " функции, но я рекомендую
- обнаружение devicePixelRatio, которое является специальным свойством в WebKit.
- обнаружение реализации функции javaEnabled.
пока нет точного способа обнаружения ES6, но если вы протестируете его функции в текущем браузере, вы можете определить, является ли двигатель ES6. Мой хоста ESX библиотека обнаруживает версию ECMAScript, выполняя проверку синтаксических тестов и методов. Для знайте, что он может обнаружить ECMAScript 3, 5, 6 и 7 (ES7 не тестируется, но должен работать), если тест ECMAScript не соответствует, он дает null как результат.
пример использования библиотеки:
поместите несовместимый синтаксический код, например, содержащий функции стрелки, в собственный блок скрипта и заполните его совместимым синтаксическим кодом.
JavaScript сильно изменился за последние годы. Вот 12 новых возможностей, которые можно начать использовать уже сегодня!
Новые добавления в язык называются ECMAScript 6. Или ES6 или ES2015+.
Как видите, между версиями ES3, ES5 и ES6 есть пропуски длиной в 10 и 6 лет. Новая модель – делать маленькие изменения каждый год. Вместо того, чтобы накопить огромное количество изменений и выпустить их все за раз, как это было с ES6.
Все современные браузеры и среды исполнения уже поддерживают ES6!
Chrome, MS Edge, Firefox, Safari, Node и многие другие системы имеют встроенную поддержку большинства возможностей JavaScript ES6. Так что, все из этого пособия можно использовать прямо сейчас.
Все сниппеты можно вставлять в консоль браузера и запускать.
Block scope variables
В ES6 мы перешли от var к let / const .
Что не так с var ?
Проблема var в том, что переменная "протекает" в другие блоки кода, такие как циклы for или блоки условий if :
В строке test(false) можно ожидать возврат outer , но нет, мы получаем undefined . Почему?
Потому что даже не смотря на то, что блок if не выполняется, на 4й строке происходит переопределение var x как undefined .
ES6 спешит на помощь:
Изменив var на let мы откорректировали поведение. Если блок if не вызывается, то переменная x не переопределяется.
IIFE (immediately invoked function expression)
Давайте сначала рассмотрим пример:
Как видите, private протекает наружу. Нужно использовать IIFE (immediately-invoked function expression):
Если взглянуть на jQuery/lodash или любые другие проекты с открытым исходным кодом, то можно заметить, что там IIFE используется для содержания глобальной среды в чистоте. А глобальные штуки определяются со специальными символами вроде _ , $ или jQuery .
В ES6 не нужно использовать IIFE, достаточно использовать блоки и let :
Const
Можно также использовать const если переменная не должна изменяться.
- забудьте var , используйте let и const .
- Используйте const для всех референсов; не используйте var .
- Если референсы нужно переопределять, используйте let вместо const .
Template Literals
Не нужно больше делать вложенную конкатенацию, можно использовать шаблоны. Посмотрите:
С помощью бэктика ( ) и интерполяции строк $<>` можно сделать так:
Multi-line strings
Не нужно больше конкатенировать строки с + \n :
В ES6 можно снова использовать бэктики:
Оба блока кода генерируют одинаковый результат
Destructuring Assignment
ES6 destructing – полезная и лаконичная штука. Посмотрите на примеры:
Получение элемента из массива
Обмен значениями
Деструктуризация нескольких возвращаемых значений
В строке 3 можно вернуть в виде массива:
но вызывающему коду придется знать о порядке данных.
С ES6 вызывающий выбирает только нужные данные (строка 6):
Заметка: В строке 3 содержатся другие возможности ES6. Можно сократить < left: left >до < left >. Смотрите, насколько это лаконичнее по сравнению с версией ES5. Круто же?
Деструктуризация и сопоставление параметров
То же самое (но короче):
Глубокое сопоставление
То же самое (но короче):
Это также называют деструктуризацией объекта (object destructing).
Как видите, деструктуризация может быть очень полезной и может подталкивать к улучшению стиля кодирования.
- Используйте деструктуризацию для получения элементов из массива и для обмена значениями. Не нужно делать временные референсы – сэкономите время.
- Не используйте деструктуризацию массива для нескольких возвращаемых значений, вместо этого используйте деструктуризацию объекта.
Классы и объекты
В ECMAScript 6 мы перешли от “функций-конструкторов” к “классам” .
Каждый объект в JavaScript имеет прототип, который является другим объектом. Все объекты в JavaScript наследуют методы и свойства от своего прототипа.
В ES5 объектно-ориентированное программирование достигалось с помощью функций-конструкторов. Они создавали объекты следующим образом:
В ES6 есть новый синтаксический сахар. Можно сделать то же самое с меньшим кодом и с использованием ключевых слов class и construсtor . Также заметьте, как четко определяются методы: construсtor.prototype.speak = function () vs speak() :
Оба стиля (ES5/6) дают одинаковый результат.
- Всегда используйте синтаксис class и не изменяйте prototype напрямую. Код будет лаконичнее и его будет легче понять.
- Избегайте создания пустого конструктора. У классов есть конструктор по умолчанию если не задать собственный.
Наследование
Давайте продолжим предыдущий пример с классом Animal . Допустим, нам нужен новый класс Lion .
В ES5 придется немного поработать с прототипным наследованием.
Не будем вдаваться в детали, но заметьте несколько деталей:
- Строка 3, напрямую вызываем конструктор Animal с параметрами.
- Строки 7-8, назначаем прототип Lion прототипом класса Animal .
- Строка 11, вызываем метод speak из родительского класса Animal .
В ES6 есть новые ключевые слова extends и super .
Посмотрите, насколько лучше выглядит код на ES6 по сравнению с ES5. И они делают одно и то же! Win!
- Используйте встроенный способ наследования – extends .
Нативные промисы
Переходим от callback hell к промисам (promises)
Одна функция принимает callback чтобы запустить его после завершения. Нам нужно запустить ее дважды, одну за другой. Поэтому приходится вызывать printAfterTimeout во второй раз в коллбеке.
Все становится совсем плохо когда нужно добавить третий или четвертый коллбек. Давайте посмотрим, что можно сделать с промисами:
С помощью then можно обойтись без вложенных функций.
Стрелочные функции
В ES5 обычные определения функций не исчезли, но был добавлен новый формат – стрелочные функции.
В ES5 есть проблемы с this :
Нужно использовать временный this чтобы ссылаться на него внутри функции или использовать bind . В ES6 можно просто использовать стрелочную функцию!
For…of
От for переходим к forEach а потом к for. of :
ES6 for…of позволяет использовать итераторы
Параметры по умолчанию
От проверки параметров переходим к параметрам по умолчанию. Вы делали что-нибудь такое раньше?
Скорее всего да. Это распространенный паттерн проверки наличия значения переменной. Но тут есть некоторые проблемы:
- Строка 8, передаем 0, 0 получаем 0, -1
- Строка 9, передаем false , но получаем true .
Если параметр по умолчанию это булева переменная или если задать значение 0, то ничего не получится. Почему? Расскажу после этого примера с ES6 ;)
В ES6 все получается лучше с меньшим количеством кода:
Получаем ожидаемый результат. Пример в ES5 не работал. Нужно проверять на undefined так как false , null , undefined и 0 – это все falsy-значения. С числами можно так:
С проверкой на undefined все работает как нужно.
Rest-параметры
От аргументов к rest-параметрам и операции spread.
В ES5 работать с переменным количеством аргументов неудобно.
С rest . все намного проще.
Операция Spread
Переходим от apply() к spread. Опять же, . спешит на помощь:
Помните: мы используем apply() чтобы превратить массив в список аргументов. например, Math.max() принимает список параметров, но если у нас есть массив, то можно использовать apply .
В ES6 используем spread:
Мы также перешли от concat к spread'у:
JavaScript сильно изменился. Эта статья покрывает только базовые возможности, о которых должен знать каждый разработчик.
Есть такой принцип — Don't break the web, который можно раскрыть как "веб всегда старается сохранить максимальную обратную совместимость". В некоторой мере этот принцип применим и к веб сайтам и приложениям — ваш сайт должен работать не только в одном конкретном браузере, но в целом наборе разных браузеров и версий. Но в каких? Однозначно должны быть какие-то разумные пределы и IE 6 и netscape navigator поддерживать не стоит, но два вопроса остаются открытыми: какие браузеры вы поддерживаете и как это обеспечить?
Если есть обратная совместимость значит что-то меняется. Меняются в вебе три вещи: ECMAScript (javascript), CSS и различные Web API. CSS мы сегодня оставим на опушке, а пока, тропинка ведет нас в дебри современной фронтенд разработки
Так или иначе, абсолютное большинство современных и не очень браузеров поддерживают ES5, этакий greatest common denominator. Большинство библиотек пишутся или скомпилированы в ES5 и мы можем поступить также! Можно либо сразу писать в ES5 (не рекомендую) либо использовать babel или typescript
В сети есть множество туториалов о том как это делать, но позволю себе упомянуть что в babel 7, @babel/preset-es2015 является устаревшим (о чем нам любезно напоминает официальная документация) и рекомендуется использовать @babel/preset-env , которому на самом деле посвящена львиная доля статьи. Но легко поставить избушку на поляне, но мы ведь с вами не за этим здесь собрались, давайте попробуем сделать это на болоте (если почувствовали тоску, то возможно стоит поменять работу)?
Общая идея следующая — мы определяем какие браузеры мы поддерживаем и под эти браузеры настраиваем нашу конфигурацию транспиляции. Помогут нам в этом как всегда различные инструменты, но проблема тут в том, что их не два, не три, а полное лукошко! Поэтому я сначала кратко объясню что каждый из них делает, а с тем кто с кем и как взаимодействует разберемся потом:
Дисклеймер: для интеграции @babel/preset-env со стандартной конфигурацией в новый проект не требует понимания того, как эта машинерия работает, но в продакшене все как обычно сложнее и это начинается играть роль
caniuse
Наверное самый известный сайт на который разработчики ходят чтобы узнать в каких браузерах поддерживается необходимая фича. Отдельная его крутость состоит в том, что у них есть данные по использованию браузеров (в том числе и с разбивкой по странам)
browserslist
С него все начинается. browserslist (browserSlist обратите внимание на S) умеет преобразовывать запрос вида "> 0.25%, not IE11, not dead" в список браузеров, в данном случае означающий все браузеры которые имеют мировую долю использования более 0.25% кроме IE11 и браузеров не получающих обновления безопасности (на момент написания статьи IE 10, IE Mobile 11, BlackBerry 10, BlackBerry 7, Samsung Internet 4 и Opera Mobile 12.1)
corejs
Используется в babel/present-env, поддерживается и 2-я и 3 -я версии
core-js-compat
compat-table
Содержит информацию о поддержке фич ECMAScript различными браузерами (думаю понятно) и средами исполнения (nodejs, graalvm etc.)
Используется в @babel/preset-env , но с нюансом — в случае corejs@2 для полифиллов используются данные из compat-table , а в случае corejs@3 — данные из core-js-compat (они более актуальные и умные)
На практике в классическом варианте все выглядит так:
Таким образом на выходе вы получаете js код который будет верно работать во всех указанных браузерах (в разумных пределах ибо есть разные экзотические браузеры про поддержку которых данных просто нет). И наша избушка встает на ножки (или на сваи) и получает обратную совместимость!
К сожалению нет, во фронтенде все опять неспокойно. Есть ряд кочек о которые можно легко споткнуться, а то и вообще завязнуть в трясине если сойти с узкой тропинки happy path
browserslist query
Наверняка у проекта в который вы собираетесь это внедрять уже список или хотя бы понимание поддерживаемых браузеров. Если нет, то все просто: возьмите defaults (это > 0.5%, last 2 versions, Firefox ESR, not dead ) и вы покроете более 90% вообще всех браузеров (что на самом деле очень хороший результат ибо "все" это вплоть до IE 6!). Если все-таки понимание есть, но надо перевести его (понимание) в query. Это может быть не так-то просто, но главным образом нужно знать три вещи:
С этим знанием и внимательным чтением документации (а вы думали можно без этого?) вы сможете подогнать список под ваши нужды. Если будут проблемы, дайте знать в комментариях!
Невиданное-неслыханное
Как сказано выше, defaults это > 0.5%, last 2 versions, Firefox ESR, not dead . Вроде относительно понятно, но если вы посмотрите чему это соответствует то обнаружите там браузеры о существовании которых и не подозревали или не знали что они до сих пор используются. Тем не менее слепо выбрасывать их не стоит, поэтому давайте разберемся с теми которые не входят в большую шестерку с половиной (Chrome, Firefox, Edge, Opera, Safari и IE). Проценты глобального использования приведены для последней версии на момент написания статьи
UPD от Dartess
Там всё очень сложно. На одном только андроиде есть как минимум три версии движка — U2, U3, U4. Все на базе хромиума, но с большими оговорками.
U2 это ультралайтовая и ультралёгкая версия, которая отображает веб, по ощущениям, на уровне IE8. Отключено всё, что можно. В общем, не юзабельно, но возможно было актуально для ультрабюджетных андроидов лет 10 назад.
U3 тоже был направлен на быстродействие и является сильно модифицированной версией хромиума. Тоже местами урезан, но веб в целом работает. На этом браузере встречал некоторые баги, которые не мог воспроизвести ни на одной версии хрома. Отличается широкой поддержкой различных версий андроида и разных процессоров. Плюсом там есть всякие ништяки типа поддержки флеша из коробки и режима сжатия трафика.
U4 появился где-то года три назад, сейчас по умолчанию из маркета в обычной версии ставится он. Является уже самым обычным брендированным хромиумом, поэтому нормально работает и нормально (стабильно) обновляется.
Полный комментарий
UPD V1tol
По KaiOS проходила информация, что там сейчас используется движок, соответствующий Firefox 48
Что делать с ними ^ решать конечно вам, но я крайне советую стараться поддерживать как можно больше браузеров, это помогает сохранять их разнообразия и не загоняет нас в ловушку IE6 (кхе-кхе Chrome)
Это уже очень много информации, но мы все еще не коснулись таких вещей как
- autoprefixer и CSS
- Свои собственные данные по usage
- Несколько конфигураций и бандлов
- Продвинутые опции useBuiltIns
Я надеюсь мы когда-нибудь покроем это в второй части, а пока, всем peace, и пусть ваша избушка не развалится ни в одном браузере! А если вы заинтересовались курсом, то можете узнать о нем подробнее по ссылке.
Support for the ECMAScript 2015 specification. Features include Promises, Modules, Classes, Template Literals, Arrow Functions, Let and Const, Default Parameters, Generators, Destructuring Assignment, Rest & Spread, Map/Set & WeakMap/WeakSet and many more.
- 5.5 - 10 : Not supported
- 11 : Partial support
- 12 - 14 : Partial support
- 15 - 18 : Supported
- 79 - 100 : Supported
- 101 : Supported
Firefox
- 2 - 5 : Not supported
- 6 - 53 : Partial support
- 54 - 99 : Supported
- 100 : Supported
- 101 - 102 : Supported
Chrome
- 4 - 20 : Not supported
- 21 - 50 : Partial support
- 51 - 100 : Supported
- 101 : Supported
- 102 - 104 : Supported
Safari
- 3.1 - 7 : Not supported
- 7.1 - 9.1 : Partial support
- 10 - 15.3 : Supported
- 15.4 : Supported
- TP : Supported
Opera
- 9 - 12.1 : Not supported
- 15 - 37 : Partial support
- 38 - 85 : Supported
- 86 : Supported
- 87 : Supported
Safari on iOS
- 3.2 - 6.1 : Not supported
- 7 - 9.3 : Partial support
- 10 - 15.3 : Supported
- 15.4 : Supported
Opera Mini
Android Browser
- 2.1 - 4.3 : Not supported
- 4.4 - 4.4.4 : Partial support
- 101 : Supported
Opera Mobile
- 10 - 12.1 : Not supported
- 64 : Supported
Chrome for Android
Firefox for Android
UC Browser for Android
Samsung Internet
- 4 : Partial support
- 5 - 15.0 : Supported
- 16.0 : Supported
QQ Browser
Baidu Browser
KaiOS Browser
As ES6 refers to a huge specification and browsers have various levels of support, "Supported" means at least 95% of the spec is supported. "Partial support" refers to at least 10% of the spec being supported. For full details see the Kangax ES6 support table.
JavaScript был придуман Бренданом Эйхом (Brendan Eich) в 1995 году и стал стандартом ECMA в 1997 году. Официальное название стандарта — ECMA. А официальное названия языка — ECMAScript. С 2015 года версию языка ECMAScript называют по году (ECMAScript 2015).
Редакции ECMAScript
Версия | Официальное название | Описание |
---|---|---|
1 | ECMAScript 1 (1997) | Первая редакция. |
2 | ECMAScript 2 (1998) | Внесены редакционные правки. |
3 | ECMAScript 3 (1999) | Добавлены регулярные выражения. Добавлен оператор try/catch. |
4 | ECMAScript 4 | Никогда не выходил. |
5 | ECMAScript 5 (2009) | Добавлен "строгий режим". Добавлена поддержка JSON. Добавлен String.trim(). Добавлен Array.isArray(). Добавлены методы обхода элементов массива. |
5.1 | ECMAScript 5.1 (2011) | Внесены редакционные правки. |
6 | ECMAScript 2015 | Добавлены ключевые слова let и const. Добавлены значения параметров по умолчанию. Добавлен Array.find(). Добавлен Array.findIndex(). |
7 | ECMAScript 2016 | Добавлен оператор возведения в степень (**). Добавлен Array.prototype.includes. |
8 | ECMAScript 2017 | Добавлен "паддинг" строки (дополнение до нужной длины). Добавлены новые свойства объекта Object. Добавлены асинхронные функции. Добавлены разделяемая память и атомарные операции. |
9 | ECMAScript 2018 | Добавлены свойства rest / spread. Добавлены асинхронные итерации. Добавлен Promise.finally(). Добавления в объект RegExp. |
ECMAScript часто сокращается до ES.
Поддержка браузерами
ECMAScript 3 полностью поддерживается всеми браузерами.
ECMAScript 5 поддерживается всеми современными браузерами.
Поддержка браузерами ES5 (2009)
Браузер | Версия | Начиная с |
---|---|---|
Chrome | 23 | сентябрь 2012 |
Firefox | 21 | апрель 2013 |
IE | 9* | март 2011 |
IE / Edge | 10 | сентябрь 2012 |
Safari | 6 | июль 2012 |
Opera | 15 | июль 2013 |
* Internet Explorer 9 не поддерживает директиву ECMAScript 5 "use strict".
Поддержка браузерами ES6 (2015)
Браузер | Версия | Начиная с |
---|---|---|
Chrome | 58 | апрель 2017 |
Firefox | 54 | июнь 2017 |
Edge | 14 | август 2016 |
Safari | 10 | сентябрь 2016 |
Opera | 55 | август 2017 |
Internet Explorer не поддерживает ECMAScript 2015.
Поддержка браузерами ES7 (2016)
Браузер | Версия | Начиная с |
---|---|---|
Chrome | 68 | май 2018 |
Opera | 47 | июль 2018 |
JavaScript / ECMAScript
JavaScript был разработан для Netscape. Первым браузером, поддерживающим JavaScript, стал вышедший в 1996 году браузер Netscape 2. После Netscape компания Mozilla foundation продолжила разработку JavaScript для своих браузеров Firefox. Последняя версия JavaScript это 1.8.5 (идентична ECMAScript 5).
ECMAScript был разработан Ecma International после адаптации JavaScript. Первая редакция ECMAScript вышла в 1997 году.
Следующая таблица показывает, как соотносятся номера версий этих продуктов:
Год | JavaScript | ECMA | Браузер |
---|---|---|---|
1996 | 1.0 | Netscape 2 | |
1997 | ECMAScript 1 | IE 4 | |
1998 | 1.3 | Netscape 4 | |
1999 | ECMAScript 2 | IE 5 | |
2000 | ECMAScript 3 | IE 5.5 | |
2000 | 1.5 | Netscape 6 | |
2000 | 1.5 | Firefox 1 | |
2011 | ECMAScript 5 | IE 9 (за исключением "use strict") | |
2011 | 1.8.5 | Firefox 4 (за исключением начальных нулей в parseInt) | |
2012 | IE 10 | ||
2012 | Chrome 23 | ||
2012 | Safari 6 | ||
2013 | Firefox 21 | ||
2013 | Opera 15 | ||
2015 | ECMAScript 2015 | Частично поддерживается всеми браузерами |
Internet Explorer 4 и Netscape 4.06 были первыми браузерами, которые стали поддерживать ECMAScript 1.
Internet Explorer 5 был первым браузером, который стал поддерживать ECMAScript 2.
Internet Explorer 5.5 и Netscape 6 были первыми браузерами, которые стали поддерживать ECMAScript 3.
Internet Explorer 9 и Firefox 3.5 были первыми браузерами, которые стали поддерживать ECMAScript 5. При этом IE 9 не поддерживает директиву ECMAScript 5 "use strict".
Chrome 23, IE 10 и Safari 6 были первыми браузерами с полной поддержкой ECMAScript 5.
Читайте также: