对象[foo]术语是什么意思?

4

我有些困惑 object[foo] 这个术语具体指的是什么。有什么提示吗? 我知道 bar['unique_prop']bar.unique_prop 分别指向 2

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

code on jsfiddle


对于重复投票我感到抱歉,我没有完全理解问题,而且无法撤销。 - Álvaro González
@ÁlvaroG.Vicario 如果问题被关闭,它可以被撤销... 它可以重新打开。 :) - Shadow The Spring Wizard
没问题,放心吧,我甚至不会知道是你。 - user784637
3个回答

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';

这显然是一个错误或误解。成员运算符MDN 上有详细解释:

属性名必须是字符串。这意味着非字符串对象不能用作对象键。任何非字符串对象,包括数字,都会通过toString方法转换为字符串

但是你可以使用以下内容:

object[foo.unique_prop] = 'value';

这相当于:

object[1] = 'value';

这是我第一次看到用方括号表示的对象字面量,所以我感到有些困惑。这个例子是我从Mozilla网站上找到的,链接是https://developer.mozilla.org/en/JavaScript/Reference/Operators/Member_Operators。 - user784637
@LedZeppelin:你所引用的文档解释了这种行为,我已经相应地更新了我的答案。 - Tomasz Nurkiewicz

2

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


1
object[foo] = 'value';

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

'value'被分配给object["[object Object]"],当您尝试读取alert(object[bar]);时,由于bar也是一个对象,因此发生了相同的toString(),因此您再次引用object["[object Object]"]并返回'value'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接