Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Dima ParzhitskyОтветов: 4

А.С.: Вопрос о типе ошибки, а не о явлении

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


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

  • Потому что они (для всех намерений и целей) свойства глобального объекта (иначе: переменные) Ismael Miguel 08.05.2016
  • Он не защищен. Это только для чтения. Michał Perłakowski 08.05.2016

javascripttypeerror

Ответы

Ответ 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 являются "типами данных", которые являются глобальными константами с определенным (назначенным) значением, а "строгий режим" предотвращает проблемы, не позволяя изменять эти .

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы