Странное значение переменной name в глобальном контексте
1,00
р.
р.
Заметил странность:
var name = 0 name = name || 4 console.log(name) console.log(typeof name)
Не понимаю почему выводится 0 и string, если при сравнении оба числа и 0 вроде как false. По идее, должно выводиться 4 и Number. Но если написать такую функцию:
function new1() { var name = 0 name = name || 4 console.log(name) console.log(typeof name) } new1()
То выводит всё верно: 4 и Number.
Ответ Одна из неочевидных особенностей. у объекта window, есть свойство name При выполнении данного кода в глобальном контексте, вместо переменной используется это свойство, так как при попытке определить переменную в глобальном контексте, идет попытка добавления одноименного поля в объект window. Так как в этом объекте уже есть свойство name для него просто вызывается сеттер, и ему записывается указанное значение. Далее в условии уже проверяется не число 0, а строка "0", которая не эквивалент false.
console.log(window.name) var name = 10 console.log(window.name, name, window.name === name)
Для обхода можно так же воспользоваться объявлением переменной с помощью оператора let, в этом случае не происходит добавления в глобальный объект
let name = 0 name = name || 4 console.log(name) console.log(typeof name)