А.С.: Вопрос о типе ошибки, а не о явлении
"use strict" выдает TypeError, если системные переменные, такие как NaN и undefined, были изменены.
Но почему это Typeошибка? Почему не Синтаксическаяошибка?
Правка: На самом деле это не SyntaxError, так как ошибок в синтаксисе сниппета нет.
Но корень ошибки кроется в том, что какой-то защищенный объект не может быть изменены вручную; так что, скорее всего, это Ошибка доступа (я знаю, что таких нет).
Тогда почему ошибки доступа выглядят как ошибки типа?
Ответ 1 · рейтинг 4 · Oriol
В ES5 существует 6 различных типов собственных ошибок:
- #P2# #P3# блочная цитата>
- #P4# #P5# блочная цитата>
- #P6# #P7# блочная цитата>
- #P8# #P9# блочная цитата>
- #P10# #P11# блочная цитата>
- #P12# #P13# блочная цитата>
В вашем случае возникает ошибка, потому что вы пытаетесь присвоить значение window.NaN или window.undefined, которые не являются записываемыми свойствами.
Перед присвоением нового значения внутренний [[Put]] метод проверяет [[CanPut]] , который вернет false, поскольку свойство не является перечисляемым. И поэтому [[Put]] выкинет.
Таким образом, проблема заключается в том, что возможность записи назначенной ссылки (левого операнда в выражение присваивания) не является ожидаемым. Затем, среди 6 вышеперечисленных типов ошибок наиболее подходящим кажется TypeError, даже если возможность записи не совсем тип.
Ответ 2 · рейтинг 2 · Michał Perłakowski
Потому что NaN и undefined являются просто свойствами window, доступными только для чтения. Они не являются операторами (например, > или +) или ключевыми словами (например, var или class).
Попытка назначить что-то NaN дает следующую ошибку в Chrome:
TypeError: невозможно назначить свойство "NaN" только для чтения объекта "#<Window>"
Ответ 3 · рейтинг 1 · Michael Bar-Sinai
Потому что это веский аргумент, который не имеет смысла. Но это не имеет смысла на СЕМАНТИЧЕСКОМ уровне, не на синтаксическом.
Вот пример:
1+1=42
Это неправильно, но неправильно по-другому, чем, скажем:
42 1 1 + =
Вы можете прочитать первое как арифметическое уравнение (один плюс один равно сорок два). Второй ты даже читать не умеешь.
То же самое и здесь. оператор NaN=300; можно прочитать в Javascript как "указать NaN на значение 300`. Но когда синтаксический анализатор отправляет этот запрос движку, движок говорит "Нет, не может этого сделать".
Ответ 4 · Community
синтаксическая ошибка
В большинстве языков программирования и сценариев это обычно означает, что вы использовали оператор не в том месте.
Дополнительную информацию о "синтаксических ошибках" см. статья: https://en.wikipedia.org/wiki/Syntax_error
ошибка типа
Это происходит, когда тип данных не соответствует некоторому требованию.
Дополнительную информацию о "типах данных" см. в этой статье: https://en.wikipedia.org/wiki/Data_type
Таким образом, возникает ошибка типа, потому что NaN и undefined являются "типами данных", которые являются глобальными константами с определенным (назначенным) значением, а "строгий режим" предотвращает проблемы, не позволяя изменять эти .