Почему такая конструкция отработает корректно?
var a = NaN = "asdf"
или
var a = Infinity = "asdf"
Дело в том, что в нестрогом режиме присваивание readonly-свойств просто игнорируется. А именно такими свойствами и являются NaN
, Infinity
и undefined
. Подробнее про отличия строгого и нестрого режима можно прочитать в соответствующем вопросе.
var obj = { get x() { return 42 } }
function nonStrict() {
console.log(obj.x = 10)
console.log(obj.x)
}
function strict() {
'use strict'
console.log(obj.x = 10)
console.log(obj.x)
}
nonStrict()
strict()
function nonStrict() {
console.log(NaN = 10)
}
function strict() {
'use strict'
console.log(NaN = 10)
}
console.log(Object.getOwnPropertyDescriptor(window, "NaN"))
nonStrict()
strict()
.as-console-wrapper.as-console-wrapper { max-height: 100vh }
Думаю дело в том, что NaN
и Infinity
не являются управляющими конструкциями языка, как if
и подобные и не являются константами.
Если взглянуть на описание NaN и Infinity, то там чётко написано, что это свойство глобального объекта window. А раз это свойство, то имя переменной с таким же именем? объявленное через var
вполне себе допустимо и никак не конфликтует ни с чем и не выбрасывает ошибок.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пытаюсь научится пользоватся AnimeJS
Я уже задавал вопрос по этому проекту (В какой-то момент, отскакивающий от краёв канваса мяч, попадает в баг и ведет себя аномально), код тот...