Странное значение переменной name в глобальном контексте

287
08 августа 2017, 17:56

Заметил странность:

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.

Answer 1

Одна из неочевидных особенностей. у объекта 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);

READ ALSO
Два скроллбара на странице

Два скроллбара на странице

Помогите, пожалуйста, разобраться со скроллбарамиИмеется многоуровневое меню навигации слева id="menu" и лента с записями

367
BrowserClosureNotice как заставить работать?

BrowserClosureNotice как заставить работать?

Нашли вот такой плагин BrowserClosureNotice Но попытки заставить работать не увенчались успехом

265
Из строки получить символьный массив js

Из строки получить символьный массив js

Здравствуйте, есть переменная

536
HTML Video настроить

HTML Video настроить

Здравствуйте, есть у меня вот такая разметка

281