Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 16.07.2012, 10:06
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 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", где "тип" означает языковой тип и тип спецификации, описываемые в данной главе.
Как это и приведённое выше правильно увязать между собой
Ответить с цитированием
  #12 (permalink)  
Старый 16.07.2012, 17:31
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Знатоки спецификации, ответьте, пожалуйста, на этот (может быть нубский) вопрос.
Ответить с цитированием
  #13 (permalink)  
Старый 16.07.2012, 18:37
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 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.
Ответить с цитированием
  #14 (permalink)  
Старый 16.07.2012, 18:58
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от oneguy
бросает зараннее, не выполняя alert
в опере выполняет алерт, а потом бросает исключение.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #15 (permalink)  
Старый 16.07.2012, 19:03
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от devote
в опере выполняет алерт, а потом бросает исключение.
Это пздц.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #16 (permalink)  
Старый 16.07.2012, 19:09
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от B~Vladi
Это пздц.
от чего же?
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #17 (permalink)  
Старый 16.07.2012, 19:23
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 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.
Ответить с цитированием
  #18 (permalink)  
Старый 16.07.2012, 19:32
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от oneguy
только Фаерфокс выполняет пункты спецификации:
Ну об этом мало кто задумывается, для разрабов браузеров важнее скорость работы нежели тратить ЦП на предварительную проверку кода
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #19 (permalink)  
Старый 16.07.2012, 20:04
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

oneguy, спасибо за информацию.

Итог по Reference, как я понимаю, такой:
Типом Reference обладают только значения, полученные при помощи . (точки), [] (квадратных скобок) и идентификатора (в относительно редких случаях значение типа Reference может вернуть функция).

Для использования то, что нужно, осталось только узнать: вы из спецификации эту информацию получили?
Ответить с цитированием
  #20 (permalink)  
Старый 16.07.2012, 20:14
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от bes
Для использования то, что нужно, осталось только узнать: вы из спецификации эту информацию получили?
Да.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск