Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

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

#javascript


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



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.
    


Ответы

Ответ 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);

Комментариев нет:

Отправить комментарий