Почему оператор ++ генерирует искючение, а не NaN в случае со строкой?
Почему код:
alert('d'++); генерирует ошибку, а не выводит значение NaN? |
dump,
потому что не совмещение типов вроде. Другие знаки приводят операнды к одному типу: alert('a' + 1) alert('a' * 1) alert('a' - 1) alert('a' / 1) |
Цитата:
Этот код работает: var a='d'; alert(a++); //NaN |
Цитата:
http://es5.javascript.ru/x11.html#x11.3.1 Цитата:
|
Цитата:
Дальше читаем: http://es5.javascript.ru/x16.html#x16 Цитата:
|
Спасибо за пояснение, то есть ошибка возникает не из этих пунктов
Цитата:
Цитата:
Цитата:
(исходя из приведённых пояснений, если бы строковый литерал был ссылкой, тогда ошибка возникла бы ещё на пункте Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
хотелось бы понять, как по спецификации определить, что ссылочного типа, что нет (где-то это должно быть в спецификации обозначено, а в http://es5.javascript.ru/x8.html#x8.7 не совсем понятно об этом написано) |
Цитата:
Type(lhs) равно Reference равно true IsStrictReference(lhs) равно true Type(GetBase(lhs)) равно Environment Record GetReferencedName(lhs) равно либо "eval", либо "arguments" Цитата:
|
Цитата:
Цитата:
Алгоритм выполняется последовательно, поэтому пытаемся разобрать фразу Type(lhs) равно Reference равно true: Type(lhs) Цитата:
далее этот тип сравнивается с типом Reference собственно о Reference http://es5.javascript.ru/x8.html#x8.7 Цитата:
|
Ещё про типы http://es5.javascript.ru/x8.html#x8
Цитата:
|
Знатоки спецификации, ответьте, пожалуйста, на этот (может быть нубский) вопрос.
|
Все типы делятся на языковые типы и типы спецификации. Тип 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, спасибо за информацию.
Итог по Reference, как я понимаю, такой: Типом Reference обладают только значения, полученные при помощи . (точки), [] (квадратных скобок) и идентификатора (в относительно редких случаях значение типа Reference может вернуть функция). Для использования то, что нужно, осталось только узнать: вы из спецификации эту информацию получили? |
Цитата:
|
Цитата:
PS: плюсик пока поставить не могу (надо всё-таки менять систему +/-) |
Цитата:
|
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 02:30. |