在书中Javascript好的部分,在Ch3对象的开头页面上,它说明了:
对象是属性的容器,其中属性具有名称和值。属性名称可以是任何字符串,包括空字符串。属性值可以是除undefined之外的任何Javascript值。
注意: undefined 在书中突出显示为文字。
然而,在实践中,我能够做到。
var a = { "name": undefined };
我的理解有什么问题?
答案 0 :(得分:8)
我相信答案是他错了。
如您所见,您可以设置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['___']
的语法糖。
答案 1 :(得分:3)
我不喜欢Crockford使用的术语,他似乎混合了undefined
和未声明的概念。
声明:
属性值可以是除undefined之外的任何Javascript值。
IMO完全错误,因为undefined
是该语言的 primitive value。
另见:
答案 2 :(得分:2)
我认为他试图说的是,属性的值不能是undefined
,因为undefined
正是JavaScript表示不存在的属性的方式。换句话说,如果您有以下对象
var a = { "name": undefined };
然后a.name
为undefined
,但a.someFakeProperty
也是如此。但是,正如Ben Lee在评论中指出的那样,当您使用name
循环迭代a
的属性时,for
仍将显示,而someFakeProperty
则不会。因此,看来克罗克福德在传达这个想法时有点不精确。
答案 3 :(得分:0)
也许这就是:
var a = {"name": x}; //x is undefined, so it will cause an error.
只是我的理解。