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

Fra*_*ery 12 javascript

在书中Javascript的好部分,在Ch3对象的开头页面上,它指出:

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

注意:书中突出显示未定义,表示这是一个文字.

然而,在实践中,我能够做到这一点.

var a = { "name": undefined };
Run Code Online (Sandbox Code Playgroud)

我的理解有什么问题?

Chr*_*gan 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);
}
Run Code Online (Sandbox Code Playgroud)

......会给你的name.

因此,根据价值,您可能无法区分undefined和undefined,但它们在内部完全不同.

另外:他对房产名称也是错的 - a[window] = 43; a[window] == 43;很好.当然,你不能这样做a.window,但a.___只是语法糖a['___'].如评论中所述,属性名称被转换为字符串,所以我错了这一点.

  • 他对属性名称没有错,当使用括号表示法时,表达式将被转换为ToString,属性名称可以是*只有字符串*,例如:`var o = {toString:function(){return'foo'; },a = {}; a [o] ='测试'; alert(a ['foo']);`在这个例子中,访问`a [o]`会将`o`转换为字符串,产生`'foo'`作为属性名... (3认同)