2010-12-10 2 views
4

Как упоминалось в разделе JS, Good Parts, похоже, заявляет, что значение свойства не может быть неопределенным. Однако, если вы выполните следующие действия в консоли Chrome для примера:Почему «Javascript the Good Parts» утверждает, что «значение свойства может быть любым значением Javascript, кроме неопределенного»?

var foo = {} 
foo.bar = undefined 
foo 

Затем разверните объект Foo вы можете увидеть, что Foo содержит свойство бара со значением неопределенным. Конечно, со стороны Javascript вы не можете сказать разницу между возвратом foo.bar undefined и foo.unexistingproperty, возвращающим неопределенные. Но в чем смысл консоли, которая все еще цепляется за свойство, которое было установлено неопределенным?

+1

Я думаю, вы могли бы назвать это довольно бесполезной функцией Chrome «:)» – sje397 2010-12-10 10:18:32

+3

@ sje397: Не бесполезно вообще. Существует разница между существующим и неопределенным имуществом и отсутствием свойства. См. Мой ответ. – 2010-12-10 10:27:52

+0

Так, как и многие ответы, я знаю, что вы можете использовать delete, чтобы избавиться от этого свойства и так далее. Но основная идея с моим вопросом заключалась в том, почему книга утверждает, что значение не может быть неопределенным. Очевидно, это кажется неправильным заявлением Крокфорда. – Sam 2010-12-10 10:37:25

ответ

3

undefined является способ Javascript сказать вам, что значение не существует, а не бросает ошибку при доступе к свойству без блока try/catch. Хотя технически то, что показывает Chrome, неверно в учетной записи Крокфорда, это, по крайней мере, логично; свойство существует, хотя как undefined.

Если вы хотите удалить свойство, вы можете использовать delete operator:

delete foo.bar; 
4

Технически, неопределенным является допустимым значением для присвоения переменной. Это делает разницу хотя и, как правило, не полезно:

var foo = { 
    bar: undefined 
}; 

foo.hasOwnProperty("bar"); // returns true 
foo.hasOwnProperty("bat"); // returns false 

Также:

for (var n in foo) { 
    console.log(n, foo[n]); // should log "bar" and "undefined" 
} 

лично я бы следовать советование дается Crockford в этом случае. Присвоение undefined в качестве значения может привести к запутыванию кода и поэтому должно считаться плохим. Это удивляет людей, не ожидающих этого.

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

Помните, что при чтении книги Крокфорда вы читаете советы о лучших практиках и мнениях о том, как javascript должен работать по его словам. Как javascript фактически работы совсем другое дело (и, по его словам, не обязательно хорошее).

7

Существует различие между существующим и неопределенным имуществом и отсутствием свойства, поэтому Chrome здесь разумен. Если вы назначаете значение для свойства, то свойство в принципе существует в этом объекте. Отличие заключается в том, что свойство, которое было явно установлено неопределен будет отображаться в for...in цикле:

var foo = {}; 
foo.bar = undefined; 

// The following will alert "bar" 
for (var i in foo) { 
    alert(i); 
} 

Другой является то, что "bar" in foo вернется true, как будет foo.hasOwnProperty("bar").

Смежные вопросы