Первый пример - это объявление. Вы объявили переменную с идентификатором foo
. Вы еще не дали ему значение, поэтому оно будет undefined
:
var foo;
console.log(foo); //undefined
Второй пример - это объявление и присвоение. Вы присвоили пустой литерал объекта переменной с идентификатором foo
. Как отмечено в комментариях, это фактически сокращение от:
var foo;
console.log(foo); //undefined
foo = {};
console.log(foo); //Object
Третий пример - другое объявление и другое присвоение. Вы присвоили другой литерал объекта foo
.
Редактировать (см. Комментарии)
Поведение вашего кода немного отличается в зависимости от того, планировали ли вы каждый пример как независимую программу или как написанную (одну программу).
Если вы относитесь так, как написано:
Поскольку объявления переменных в JavaScript поднимаются до верхней части области, в которой они появляются, переопределение переменных не имеет никакого эффекта. Итак, первая строка объявляет переменную foo
.
Вторая строка назначает пустой литерал объекта для foo
, а третья строка назначает другой литерал объекта для foo
. Оба эти назначения относятся к одному и тому же foo
.
Что действительно происходит, так это:
var foo;
foo = {}; //No `var` keyword
foo = {first:"number_one"}; //No `var` keyword
Если вы обрабатываете каждую строку как отдельную программу:
Первая программа объявляет переменную с именем foo
. Это значение undefined
.
Вторая программа объявляет переменную с именем foo
, а затем присваивает ей литерал пустого объекта.
Третья программа объявляет переменную с именем foo
, а затем назначает литерал объекта с одним свойством.