JavaScript 属性访问:点符号与括号?

IT技术 javascript syntax object-literal
2020-12-18 22:01:30

除了第一种形式可以使用变量而不仅仅是字符串文字这一显而易见的事实之外,是否有任何理由使用一个而不是另一个,如果是这样,在哪些情况下?

在代码中:

// Given:
var foo = {'bar': 'baz'};

// Then
var x = foo['bar'];

// vs. 
var x = foo.bar;

上下文:我编写了一个生成这些表达式的代码生成器,我想知道哪个更可取。

6个回答

(来自这里。)

方括号表示法允许使用不能与点表示法一起使用的字符:

var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax

包括非 ASCII (UTF-8) 字符,如myForm["ダ"]更多示例)。

其次,在处理以可预测方式变化的属性名称时,方括号表示法很有用:

for (var i = 0; i < 10; i++) {
  someFunction(myForm["myControlNumber" + i]);
}

围捕:

  • 点符号写起来更快,读起来更清晰。
  • 方括号表示法允许访问包含特殊字符的属性和使用变量选择属性

不能与点表示法一起使用的字符的另一个示例是本身包含点的属性名称

例如,一个 json 响应可能包含一个名为bar.Baz.

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax
点符号更快(至少对我而言)测试您的浏览器jsperf.com/dot-notation-vs-bracket-notation/2
2021-02-16 22:01:30
摘要的代码示例和措辞看起来非常熟悉。web.archive.org/web/20160304205521/http://www.dev-archive.net/...
2021-02-18 22:01:30
不需要重新发明轮子,是吗?引用它作为参考。
2021-02-18 22:01:30
@chenghuayang 当您想访问键存储在变量中的对象的属性时,不能使用点表示法。
2021-02-18 22:01:30
在 chrome 44 中,我的机器支架符号更快
2021-02-26 22:01:30

括号表示法允许您通过存储在变量中的名称访问属性:

var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello

obj.x 在这种情况下不起作用。

在 JavaScript 中访问属性的两种最常见方式是使用点和方括号。无论value.xvalue[x]value,但不一定是相同的属性访问属性。不同之处在于 x 的解释方式。使用点时,点后的部分必须是有效的变量名,直接命名属性。使用方括号时,会计算方括号之间的表达式以获取属性名称。value.x 获取名为“x”的值的属性,而 value[x] 尝试计算表达式 x 并将结果用作属性名称。

所以如果你知道你感兴趣的属性被称为“长度”,你会说value.length如果您想提取由保存在变量中的值命名的属性i,您可以说value[i]. 并且因为属性名称可以是任何字符串,如果要访问名为“2”or的属性“John Doe”,则必须使用方括号: value[2]or value["John Doe"]即使您事先知道属性的确切名称,情况也是如此,因为既不是“2”也不“John Doe”是有效的变量名,因此无法通过点表示法访问。

在数组的情况下

数组中的元素存储在属性中。因为这些属性的名称是数字,我们经常需要从变量中获取它们的名称,所以我们必须使用括号语法来访问它们。数组的长度属性告诉我们它包含多少个元素。这个属性名是一个有效的变量名,我们事先知道它的名字,所以要找到数组的长度,你通常会写,array.length因为这比array["length"].

你能详细说明array.length吗?你说通过点表示法访问的属性不会被评估,所以在 array.length 的情况下,它不会给我们“长度”字符串而不是评估值,在这种情况下是数组中的项目数?The elements in an array are stored in properties这就是让我困惑的地方。存储在属性中是什么意思?什么是属性?在我的理解中,数组只是一堆没有属性的值。如果它们存储在属性中,为什么它不是property: value/associative 数组?
2021-02-10 22:01:30
这个答案特别有value,因为它解释了两种符号之间的区别。
2021-03-04 22:01:30

点符号不适用于 Internet Explorer 8 中的某些关键字(如newclass)。

我有这个代码:

//app.users is a hash
app.users.new = {
  // some code
}

这会触发可怕的“预期标识符”(至少在 windows xp 上的 IE8 上,我还没有尝试过其他环境)。对此的简单解决方法是切换到括号表示法:

app.users['new'] = {
  // some code
}
2021-02-15 22:01:30
有用的答案。谢谢你。
2021-02-24 22:01:30

一般来说,他们做同样的工作。
尽管如此,括号表示法让您有机会做点表示法无法做的事情,例如

var x = elem["foo[]"]; // can't do elem.foo[];

这可以扩展到任何包含特殊字符的属性。