16.07.2012, 10:06
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Ещё про типы http://es5.javascript.ru/x8.html#x8
Цитата:
|
8 Типы # Ⓣ
Алгоритмы, рассматриваемые в данной спецификации, манипулируют значениями, у каждого из которых есть тип, к которому он относится. В данной главе описаны все возможные типы значений. Они делятся на две категории: языковые типы language types и типы спецификации specification types.
Языковые типы соответствуют значениям, которыми непосредственно манипулирует создатель кода на языке ECMAScript. К типам спецификации относятся: Undefined, Null, Boolean, String, Number и Object.
Типы спецификации соответствуют мета-значениям, используемым в алгоритмах для описания семантики конструкций языка ECMAScript и языковых типов ECMAScript. К ним относятся типы Reference, List, Completion, Property Descriptor, Property Identifier, Lexical Environment и Environment Record. Значения типов спецификации представляют собой артефакты спецификации, которые вовсе не обязательно соответствуют каким-либо конкретным сущностям в реализации ECMAScript. Они могут использоваться для описания промежуточных результатов вычисления выражения ECMAScript, при этом такие значения не могут храниться как свойства объектов или значения переменных языка ECMAScript.
В тексте данной спецификации выражение "Type(x)" используется в качестве сокращения для фразы "тип, к которому относится x", где "тип" означает языковой тип и тип спецификации, описываемые в данной главе.
|
Как это и приведённое выше правильно увязать между собой
|
|
16.07.2012, 17:31
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Знатоки спецификации, ответьте, пожалуйста, на этот (может быть нубский) вопрос.
|
|
16.07.2012, 18:37
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Все типы делятся на языковые типы и типы спецификации. Тип Reference является одним из типов спецификации. Любое выражение возвращает значение либо одного из языковых типов, либо ссылку.
Интерпретатор всегда знает, какого типа используемое значение.
Операторы . и [] всегда возвращают ссылку, оператор вызова функции может возвращать значение как языкового типа, так и Reference (для встроенных и юзерских объектов всегда языкового типа), все остальные операторы - только значение языкового типа. Идентификатор всегда возвращает ссылку, все остальные примитивные выражение - всегда значение языкового типа.
Правда, в ECMAScript 5.1 есть серьёзная ошибка, связанная с возможностью функций среды возвращать ссылку. Дело в том, что любую функцию можно использовать в качестве геттера или сеттера свойства объекта. Получается, что getValue можут возвращать ссылку, и putValue может принимать ссылку, что приводит к многочисленным недоразумениям.
Интерпретатор может зараннее определить, возвращает ли выражение ссылку или языковое значение, кроме одного случая: выражение является вызовом функции, завёрнутым в произвольное количество скобок (возможно, 0).
Примеры:
alert(1);
'd'++; //SyntaxError: invalid increment operand - бросает зараннее, не выполняя alert
alert(1);
String.fromCharCode(100)++; //ReferenceError: invalid assignment left-hand side - бросает во время выполения, после алерта.
Во втором случае интерпретатор не может зараннее определить, возвратит ли вызов функции языковое значение или ссылку.
Ред. Первый пример работает так, как написано только в Фаерфоксе, и это правильное поведение с точки зрения спецификации. Остальные браузеры сначала выполняют alert, а потом бросают ReferenceError.
Последний раз редактировалось oneguy, 16.07.2012 в 19:51.
|
|
16.07.2012, 18:58
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от oneguy
|
бросает зараннее, не выполняя alert
|
в опере выполняет алерт, а потом бросает исключение.
|
|
16.07.2012, 19:03
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от devote
|
в опере выполняет алерт, а потом бросает исключение.
|
Это пздц.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
|
|
16.07.2012, 19:09
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от B~Vladi
|
Это пздц.
|
от чего же?
|
|
16.07.2012, 19:23
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от devote
|
в опере выполняет алерт, а потом бросает исключение.
|
Спасибо за замечание. Действительно, так ведёт себя не только Опера, но и Хром, Сафари, ИЕ! Похоже, только Фаерфокс выполняет пункты спецификации:
Сообщение от oneguy
|
http://es5.javascript.ru/x16.html#x16
Цитата:
Реализация должна рассматривать все случаи следующих ошибок как раннюю ошибку:
...
Попытки вызвать PutValue для значения, по которому можно заранее определить, что оно не является Reference (например, при выполнении инструкции присваивания 3=4).
|
Интересно, что Опера в первом примере бросает ReferenceError: Cannot assign to 'alert', хотя, казалось бы, при чем тут 'alert'?
Последний раз редактировалось oneguy, 16.07.2012 в 19:29.
|
|
16.07.2012, 19:32
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от oneguy
|
только Фаерфокс выполняет пункты спецификации:
|
Ну об этом мало кто задумывается, для разрабов браузеров важнее скорость работы нежели тратить ЦП на предварительную проверку кода
|
|
16.07.2012, 20:04
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
oneguy, спасибо за информацию.
Итог по Reference, как я понимаю, такой:
Типом Reference обладают только значения, полученные при помощи . (точки), [] (квадратных скобок) и идентификатора (в относительно редких случаях значение типа Reference может вернуть функция).
Для использования то, что нужно, осталось только узнать: вы из спецификации эту информацию получили?
|
|
16.07.2012, 20:14
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от bes
|
Для использования то, что нужно, осталось только узнать: вы из спецификации эту информацию получили?
|
Да.
|
|
|
|