Существуют ли кросс-браузерные функции JavaScript, которые не описаны в стандарте ECMAScript? - PullRequest
2 голосов
/ 08 ноября 2010

Под кросс-браузерной функцией я подразумеваю функцию, которая реализована во всех 5 основных браузерах.(Бета-версии тоже в порядке)

Примером такой функции был объект JSON, который стал кросс-браузерным с выпуском IE8, но не был стандартизирован до 5-го выпуска ECMAScript (девять месяцев спустя).

Теперь, когда 5-е издание вышло, есть ли еще какие-либо функции, которые являются кросс-браузерными (и, следовательно, могут безопасно использоваться), но не документированы стандартом ECMAScript?

Ответы [ 4 ]

3 голосов
/ 08 ноября 2010

Что-то похожее на ваш пример объекта JSON, это Array.prototype методы.

Они были реализованы многими поставщиками браузеров много времени до ES5, например Mozilla , начал реализовывать их для своей версии JavaScript (tm) 1.6, по состоянию на сентябрь 2005 года.

Другие различия между пробелами ES3-ES5, не описанные до ES5, следующие:

  • Не бросать на for (var prop in null) или undefined, в ES3 должно произойти TypeError
  • Не бросать на FunctionDeclarations внутри блоков, например:

     { function foo () {} }
    

    FunctionDeclarations разрешены на уровне Program (глобальный код вне чего-либо) или в пределах FunctionBody функции. Блоки могут содержать только операторы.

  • Строки с LineContinuations, например:

    var s = 'foo \
    bar'; // 'foo bar'
    

Существуют и другие интересные вещи, такие как не совсем восьмеричные числа Например:

var n = 08;

Выше NumericLiteral является недействительным в любой версии стандарта ECMAScript.

DecimalLiteralсинтаксис не позволяет литералу начинаться с 0 (за исключением курса 0 литерала), а грамматика OctalIntegerLiterals указывается для взятия нуля, а затем числа изОт 0 до 7 (только 0[0-7]+), поэтому литералы 08 или 09, должны производить SyntaxError

Но этого не происходит ни в одной реализации, которую я ''проверенные когда-либо, они обрабатываются так же, как DecimalLiteral, (08 производит 8).

Firefox - единственная реализация, которая покажет вам предупреждение:

08 warning

Редактировать: Еще одна широко распространенная нестандартная функция, существующая в настоящее время: Callable RegExps .

Это умениеЭто было введено Mozilla некоторое время назад, позже клонировано АО «WebKit», V8 и движком Opera JS.

В принципе вам разрешено вызывать объекты RegExp, как если бы они были функциями, просто являясь синтаксическим сахар псевдоним для RegExp.prototype.exec метода:

var re = /foo/;
re('foobar');      // ["foo"], just an alias for:
re.exec('foobar'); // ["foo"]

Эта функция полностью нестандартна, поскольку ES3 и ES5 не позволяют определять [[Call]] в RegExp экземплярах, поскольку их внутренниеметоды и семантика полностью определены.

Поскольку в этих реализациях объекты RegExp реализуют внутренний метод [[Call]], они распознаются как функции оператором typeof:

typeof /foo/; // "function" in some implementations
0 голосов
/ 08 ноября 2010

В некотором смысле, стандарты ECMAScript - это то, что фондовые аналитики назвали бы трейлинг-индикатором. То есть они отражают то, что уже произошло, а не то, что должно произойти. И в некотором смысле это хорошая вещь. Как вы сами, наверное, прекрасно знаете, все планирование в мире не может подготовить вас к неожиданностям. Мы не знали, что нам понадобится JSON, пока не узнали, что нам это нужно, и поэтому нам пришлось его изобретать. И как только оно было изобретено и использовалось и популярно и полезно , различные производители браузеров решили поддержать его. Даже Microsoft.

Хорошо, достаточно мыльницы. С практической точки зрения, учитывая ограниченное время и ресурсы, вы действительно должны знать о разработке стандартов и постоянно находить компромиссы между тем, что поддерживается сейчас, тем, что в основном поддерживается сейчас, тем, что вряд ли будет поддерживаться, и тем, что слишком чертовски большой риск. Ты должен быть осторожен. Есть много хороших идей, которые никогда не выживали. Обратите внимание на концепцию «слоев», которую использует Netscape и никто другой. Имеет ли смысл поддерживать innerText? Вы в конечном итоге делаете вызов, и в конечном итоге вы должны быть тем, кто делает вызов.

0 голосов
/ 08 ноября 2010

Геттеры и сеттеры были реализованы почти одинаково (не в IE), но не были учтены в ES3 и недавно были стандартизированы в ES5.

Все еще не учтены в ES5:

  1. объявлять функции, отличные от верхнего уровня программы или функции.Например, if (...) { function f() { ... } }
  2. Порядок ключевых итераций для циклов for (... in ...).ES5 по-прежнему не определяет порядок ключей.По-прежнему ведутся споры о том, как это следует указывать для массивов, и браузеры различаются по угловым случаям, но, похоже, все согласны с порядком вставки.
  3. Возможность экранировать произвольные символы в регулярных выражениях.Синтаксисы ES3 и ES5 запрещают регулярные выражения типа / \ $ / (так как это IdentifierPart), но это работает во всех основных интерпретаторах.
  4. Возможность взаимодействия объектов из нескольких контекстов (фреймов) JavaScript.Ни одна из спецификаций ES ничего не говорит о том, что должно происходить, когда существует несколько контекстов JavaScript, каждый из которых имеет свою собственную версию Object.prototype и других встроенных функций.
0 голосов
/ 08 ноября 2010

Может быть, но у вас нет гарантии, что это будет завтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...