Подтвердить что ты не робот

Что означает crockford, когда он говорит, что undefined не может быть значением свойства?

В книге Javascript хорошие части, на первой странице Ch3 на объектах, говорится:

Объект - это контейнер свойств, где свойство имеет имя и значение. Имя свойства может быть любой строкой, включая пустую строку. Значение свойства может быть любым значением Javascript, кроме undefined.

Примечание. undefined выделяется в книге, чтобы обозначить, что это литерал.

На практике, однако, я могу это сделать.

var a = { "name": undefined };

Что не так с моим пониманием?

4b9b3361

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

Просто мое понимание.