Почему назначение `NaN " или "undefined" вызывает TypeError?
А. С.: вопрос о типе ошибки, а не о феномене
"use strict"
бросает TypeError, если системные переменные, такие как NaN
и undefined
изменился.
Но почему это типошибка? Почему не синтаксисошибка?
Edit: действительно, это не SyntaxError здесь, так как нет ошибок в синтаксисе фрагмента.
Но корень ошибки заключается в том, что некоторые защищенный объект не может быть изменен вручную; таким образом, это lkely в открытьошибка (таких нет, я знаю).
Тогда почему access-errors выглядят как type-ones?
4 ответов
в ES5, есть 6 различных видов собственные ошибки:
-
это исключение в настоящее время не используется в данной спецификации. Этот объект остается для совместимости с предыдущими выпусками этого спецификация.
-
указывает, что числовое значение превысило допустимое диапазон.
-
укажите, что обнаружено недопустимое ссылочное значение.
-
указывает, что произошла ошибка разбора.
-
указывает, что фактический тип операнда отличается от ожидаемого тип.
-
указывает, что одна из глобальных функций обработки 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
являются" типами данных", которые являются глобальными константами с определенным (назначенным) значением, а" строгий режим " предотвращает проблемы, не позволяя их изменять.