2012-02-01 76 views
3

我很困惑object[foo]术语所指的是什么。任何提示?我知道bar['unique_prop']bar.unique_prop2对象[foo]术语的含义是什么?

var foo = {unique_prop: 1}; 
    var bar = {unique_prop: 2}; 
    var object = {}; 
    object[foo] = 'value'; 
    alert(object[bar]); 

code on jsfiddle

+0

对不起,我没有完全理解这个问题,它不能被撤消。 – 2012-02-01 12:30:48

+0

@ÁlvaroG.Vicario如果问题已关闭,它可以撤消。它可以重新打开。 :) – 2012-02-01 12:31:40

+0

大声笑,不用担心我甚至不知道它是你 – user784637 2012-02-01 12:32:03

回答

5

此:

var foo = 'abc'; 
object[foo] 

等同于:

object.abc 

然而这样的:

var foo = {unique_prop: 1}; 
object[foo] = 'value'; 

没有多少意义(对象属性名称不能是对象字面值)。 JS引擎将使用foo.toString()(例如"[object Object]"返回),所以实际上你这样做:

var foo = {unique_prop: 1}; 
object["[object Object]"] = 'value'; 

这显然是一个错误或误解。此行为在Member OperatorsMDN中解释:

属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。包含数字的任何非字符串对象都通过toString方法被类型化为一个字符串。

但是,您可以使用:

object[foo.unique_prop] = 'value'; 

这相当于:

object[1] = 'value'; 
+0

我很困惑,因为这是我第一次看到括号内的对象文字,这是一个mozilla网站的例子,我从https获得代码片段://developer.mozilla.org/en/JavaScript/Reference/Operators/Member_Operators – user784637 2012-02-01 12:34:32

+0

@LedZeppelin:您引用的文档解释了这种行为,我相应地更新了我的答案。 – 2012-02-01 12:37:13

2

这是一样的object.whatever_x_is其中xfoo.toString()这将是相同的bar.toString()以来(除覆盖)在通用对象上调用toString将生成一个通用的“是对象”字符串,如"[object Object]"

1
object[foo] = 'value'; 

尝试使用一个对象作为成员名称,这会导致调用.toString();

'value'被分配到object["[object Object]"],当你试图读取alert(object[bar]);相同toString()发生是由于bar也是一个对象,所以你参考object["[object Object]"]再次,回到'value”。

相关问题