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

除了明显的事实,即第一种forms可以使用variables而不只是一个string,是否有任何理由相互使用,如果是的话,在哪种情况下?

在代码中:

// Given: var foo = {'bar': 'baz'}; // Then var x = foo['bar']; // vs. var x = foo.bar; 

上下文:我写了一个代码生成器,生成这些expression式,我想知道哪个更好。

(来自这里 )

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

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

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

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

围捕:

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

不能用点符号使用的字符的另一个例子是属性名称本身包含一个点

例如,一个JSON响应可能包含一个名为bar.Baz的属性。

 var foo = myResponse.bar.Baz; // incorrect syntax var foo = myResponse["bar.Baz"]; // correct syntax 

括号表示法允许您按名称访问存储在variables中的属性:

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

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

一般来说,他们做同样的工作。
尽pipe如此,括号符号给你机会做你不能用点符号做的东西,比如

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

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

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

我有这样的代码:

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

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

 app.users['new'] = { // some code } 

使用这些符号时要小心:例如。 如果我们想要访问窗口父窗口中的函数。 在IE中:

 window['parent']['func'] 

不等于

 window.['parent.func'] 

我们可以使用:

 window['parent']['func'] 

要么

 window.parent.func 

访问它

括号符号可以使用variables,所以在点符号不起作用的两个实例中它是有用的:

1)当属性名称是dynamic确定的(当确切的名字直到运行时才知道)。

2)使用for..in循环来遍历一个对象的所有属性。

来源: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

如果属性名称包含特殊字符,则需要使用括号:

 var foo = { "Hello, world!": true, } foo["Hello, world!"] = false; 

除此之外,我想这只是一个品味问题。 恕我直言,点符号更短,它使它更明显,它是一个属性,而不是一个数组元素(当然,JavaScript没有关联数组)。

在JavaScript中访问属性的两种最常见的方式是带点和方括号。 value.x and value[x]可以访问属性的值,但不一定是相同的属性。 区别在于x是如何解释的。 使用点时,点之后的部分必须是有效的variables名,并直接命名该属性。 使用方括号时,括号内的expression式将被评估以获取属性名称。 鉴于value.x获取名为“x”的值的属性,value [x]尝试计算expression式x并将结果用作属性名称。

所以如果你知道你感兴趣的属性被称为“长度”,你说value.length 。 如果你想提取由variablesi保存的值命名的属性,你可以说value[i] 。 而且由于属性名称可以是任何string,如果要访问名为“2”“John Doe”的属性,则必须使用方括号: value[2] or value["John Doe"] 。 即使您事先知道属性的确切名称,也是如此,因为“2” nor “John Doe”都不是有效的variables名,所以不能通过点符号来访问。

在arrays的情况下

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

情况[]符号是有帮助的:

如果您的对象是dynamic的,并且可能会有一些随机值,如number[]或任何其他特殊字符,例如 –

var a = { 1 : 3 };

现在,如果你尝试像a.1那样访问它,它会通过一个错误,因为它期望在那里有一个string。

让我再添加一些方括号表示法的用例。 如果你想访问一个属性,说一个对象的x-proxy ,那么将被错误地解释。 他们还有一些其他的情况,如空间,点等,点操作不会帮助你。 另外,如果你有一个variables的关键字,那么只有通过括号表示法才能访问对象中的键值。 希望你得到更多的上下文。