Что означает crockford, когда он говорит, что undefined не может быть значением свойства?
В книге Javascript хорошие части, на первой странице Ch3 на объектах, говорится:
Объект - это контейнер свойств, где свойство имеет имя и значение. Имя свойства может быть любой строкой, включая пустую строку. Значение свойства может быть любым значением Javascript, кроме undefined.
Примечание. undefined выделяется в книге, чтобы обозначить, что это литерал.
На практике, однако, я могу это сделать.
var a = { "name": undefined };
Что не так с моим пониманием?
Ответы
Ответ 1
Я считаю, что ответ в том, что он не прав.
Как вы заметили, вы можете установить var a = { "name": undefined };
.
-
a.name === undefined
-
a.name === a.someFakeProperty
Здесь, где они разные,
-
'someFakeProperty' in a === false
-
'name' in a === true
Или, чтобы сделать это по-другому,
-
a.hasOwnProperty('someFakeProperty') === false
-
a.hasOwnProperty('name') === true
Используя несколько печально известный цикл for..in
,
for (var i in a) {
alert(i);
}
... даст вам name
.
Итак, по значению вы не сможете отличить undefined и undefined
, но они сильно отличаются друг от друга.
Дополнение: он ошибается в именах свойств тоже - a[window] = 43; a[window] == 43;
просто отлично. Конечно, вы не можете сделать a.window
, но a.___
является просто синтаксическим сахаром для a['___']
. Как отмечено в комментариях, имена свойств передаются в строку, поэтому я ошибался в этом бите.
Ответ 2
Мне не нравится терминология, которую использует Крокфорд, он, кажется, смешивает концепцию undefined
и необъявленную.
Заявление:
Значение свойства может быть любым значением Javascript, кроме undefined.
Является полностью неправильным IMO, потому что undefined
является примитивное значение.
См. также:
Ответ 3
Я думаю, что он пытается сказать, что значение свойства не может быть undefined
, потому что undefined
- это именно то, как JavaScript обозначает свойства, которые не существуют. Другими словами, если у вас есть следующий объект
var a = { "name": undefined };
Тогда a.name
есть undefined
, но это также a.someFakeProperty
. Однако, как отмечает Бен Ли в своем комментарии, name
будет отображаться, когда вы повторяете свойства a
с помощью цикла for
, а someFakeProperty
- нет. Поэтому кажется, что Крокфорд был немного неточен в передаче этой идеи здесь.
Ответ 4
Возможно, это:
var a = {"name": x}; //x is undefined, so it will cause an error.
Просто мое понимание.