Странности JS присваивание

72
09 марта 2021, 14:50

Почему такая конструкция отработает корректно?

var a = NaN = "asdf"

или

var a = Infinity = "asdf"
Answer 1

Дело в том, что в нестрогом режиме присваивание 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 }

Answer 2

Думаю дело в том, что NaN и Infinity не являются управляющими конструкциями языка, как if и подобные и не являются константами.

Если взглянуть на описание NaN и Infinity, то там чётко написано, что это свойство глобального объекта window. А раз это свойство, то имя переменной с таким же именем? объявленное через var вполне себе допустимо и никак не конфликтует ни с чем и не выбрасывает ошибок.

READ ALSO
Зашифрованый текст JS cfemail

Зашифрованый текст JS cfemail

Всем привет, на сайте есть такая запись:

114
При нажатии на мышь срабатывают сразу несколько событий из-за анимации (canvas игра)

При нажатии на мышь срабатывают сразу несколько событий из-за анимации (canvas игра)

Я уже задавал вопрос по этому проекту (В какой-то момент, отскакивающий от краёв канваса мяч, попадает в баг и ведет себя аномально), код тот...

104
Не срабатывает window.open

Не срабатывает window.open

Простая функция, которой передаётся объект blob:

90