当crockford说undefined不能成为财产价值时,他的意思是什么?

时间:2010-11-15 04:08:16

标签: javascript

在书中Javascript好的部分,在Ch3对象的开头页面上,它说明了:

  

对象是属性的容器,其中属性具有名称和值。属性名称可以是任何字符串,包括空字符串。属性值可以是除undefined之外的任何Javascript值。

注意 undefined 在书中突出显示为文字。

然而,在实践中,我能够做到。

var a = { "name": undefined };

我的理解有什么问题?

4 个答案:

答案 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.nameundefined,但a.someFakeProperty也是如此。但是,正如Ben Lee在评论中指出的那样,当您使用name循环迭代a的属性时,for仍将显示,而someFakeProperty则不会。因此,看来克罗克福德在传达这个想法时有点不精确。

答案 3 :(得分:0)

也许这就是:

var a = {"name": x}; //x is undefined, so it will cause an error.

只是我的理解。