Почему присваивание Infinity в JavaScript не выдает ошибку, но не работает?

Почему бесконечность не выдает ошибку при попытке переназначения, но не назначаема?

var x = 3;

x = 1; // good, normal
true = 3; // error, normal

Infinity = 4; // no error

console.log(Infinity); // Infinity

person Sapphire_Brick    schedule 27.09.2019    source источник
comment
Поскольку Infinity доступен только для чтения, если вы будете использовать строгий режим и попытаетесь объявить переменную с именем Infinity, это вызовет ошибку.   -  person Teemu    schedule 28.09.2019
comment
Всегда используйте строгий режим. Всегда.   -  person Bergi    schedule 28.09.2019


Ответы (1)


Как вы можете прочитать здесь:

Бесконечность — это свойство глобального объекта, или, другими словами, переменная в глобальной области действия.

Поскольку это глобальное свойство, вы можете получить к нему доступ и присвоить любое значение. Однако присвоение значения свойству, не доступному для записи, не вызывает никаких исключений, когда вы находитесь в не строгом режиме, и не изменить значение свойства.

Если вы используете «строгий режим», будет возбуждено исключение.

"use strict"

Infinity = 4;

person Christos    schedule 27.09.2019
comment
как насчет Number или String? ни один из них не генерирует ошибку в строгом режиме? - person ; 29.09.2019
comment
@SapphireBrick Действительно, они не выдают ошибку. И Number, и String являются указателями, указывающими на функцию-конструктор Number и функцию-конструктор String. Вы можете убедиться в этом, если откроете консоль и просто напишете Number, тогда будет вывод: ƒ Number() { [собственный код]. Дополнительную информацию об этом объекте см. на странице разработчика. .mozilla.org/en-US/docs/Web/JavaScript/Reference/. Теперь попробуйте сделать это let a = new Number('5'), а затем проверьте это a instanceof Number, выводит true. - person Christos; 29.09.2019
comment
Если вы присвоите Number значение 4. Вы можете сделать это... это просто ссылка на объект. Затем, если вы попробуете это let b = new Number('4), вы получите сообщение об ошибке VM802:1 Uncaught TypeError: Number не является конструктором в ‹anonymous›:1:5 По сути, вы изменили ссылку, на которую указывает Number. В основном это означает, что Number является записываемым свойством. К сожалению, у меня нет ссылки на это, но это видно из вышеизложенного. Примечание: проверьте приведенный выше код как в строгом, так и в нестрогом режиме. Вы не заметите никакой разницы. - person Christos; 29.09.2019
comment
То же самое верно и для String. Надеюсь, это поможет. - person Christos; 29.09.2019