Почему назначение `NaN " или "undefined" вызывает TypeError?

А. С.: вопрос о типе ошибки, а не о феномене

"use strict" бросает TypeError, если системные переменные, такие как NaN и undefined изменился.
Но почему это типошибка? Почему не синтаксисошибка?


Edit: действительно, это не SyntaxError здесь, так как нет ошибок в синтаксисе фрагмента.
Но корень ошибки заключается в том, что некоторые защищенный объект не может быть изменен вручную; таким образом, это lkely в открытьошибка (таких нет, я знаю).
Тогда почему access-errors выглядят как type-ones?

4 ответов


в ES5, есть 6 различных видов собственные ошибки:

  • EvalError

    это исключение в настоящее время не используется в данной спецификации. Этот объект остается для совместимости с предыдущими выпусками этого спецификация.

  • RangeError

    указывает, что числовое значение превысило допустимое диапазон.

  • ReferenceError

    укажите, что обнаружено недопустимое ссылочное значение.

  • SyntaxError

    указывает, что произошла ошибка разбора.

  • TypeError

    указывает, что фактический тип операнда отличается от ожидаемого тип.

  • URIError

    указывает, что одна из глобальных функций обработки URI использовалась в способ, несовместимый с его определением.

в вашем случае, ошибка возникает потому, что вы пытаетесь присвоить значение window.NaN или window.undefined, которые незаписываемый свойства.

перед назначением нового значения внутреннее [[Put]] проверка [[CanPut]], который вернет false, потому что свойство не перечисляется. И потому [[положит]] бросит.

таким образом, проблема заключается в том, что записываемость назначенной ссылки (левый операнд в выражение задание) не ожидал никто. Затем, среди 6 видов ошибок выше, наиболее подходящим кажется TypeError, даже если записываемость не совсем тип.


, потому что NaN и undefined просто читать только свойства window. Они не являются операторами (например,> или +) или ключевые слова (например,var или class).

пытается назначить что-то NaN дает следующую ошибку в Chrome:

TypeError: невозможно назначить свойство только для чтения'NaN' объекта '#<Window>'


потому что это действительный аргумент, который не имеет смысла. Но это не имеет смысла на семантическом уровне, а не на синтаксическом.

вот пример:

1+1=42

это неправильно, но это неправильно по-другому, чем, скажем:

42 1 1 + =

вы можете прочитать первый как арифметическое уравнение (один плюс один равно сорок два). Второй, ты даже читать не умеешь.

то же самое и здесь. заявление NaN=300; можно прочитать в JavaScript, как - есть! .. --3--> укажите значение 300`. Но когда парсер отправляет этот запрос движку,двигатель идет "Нет, не могу этого сделать".


синтаксис
В большинстве языков программирования и сценариев это обычно означает, что вы использовали оператор в неправильном месте.
Для получения дополнительной информации о "синтаксических ошибках", посмотрите на эту статью:https://en.wikipedia.org/wiki/Syntax_error

введите error
Они возникают, когда тип данных miss-соответствует некоторому требованию.
Дополнительные сведения о "типах данных" см. В этой статье: https://en.wikipedia.org/wiki/Data_type

Итак,введите error выбрасывается, потому что NaN и undefined являются" типами данных", которые являются глобальными константами с определенным (назначенным) значением, а" строгий режим " предотвращает проблемы, не позволяя их изменять.