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

270
14 сентября 2018, 12: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.

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
Код работает только в режиме отладки

Код работает только в режиме отладки

Имеется код, который отсылает данные

244
Jquery UI Drag and drop. Как подключить?

Jquery UI Drag and drop. Как подключить?

Как здесь подключить sortable() для классов и идентификаторов? Спасибо

257
Ошибка в отображении Google map API JS

Ошибка в отображении Google map API JS

API-key рабочий, не понимаю, где я про*балсяБыли ли похожие ошибки? Кто сможет помочь решить проблему

344
Условие с разным url на javaScript

Условие с разным url на javaScript

День добрыйПодскажите, как сделать, чтобы пользователь переходя на определенную страницу получал сообщение,а переходя на все последующие...

231