19

[]使用和.访问数组或对象属性的真正区别是什么?使用哪一个?

另外为什么.运营商不允许索引属性?

4

4 回答 4

46

访问成员.称为点表示法。访问它们[]称为括号表示法

点符号仅适用于作为有效标识符名称 [spec]的属性名称,因此基本上任何名称也是有效变量名称(有效标识符,另请参阅What characters are valid for JavaScript variable names?)和任何保留关键字[规格]

括号表示法需要一个计算结果为字符串(或可以强制为字符串)的表达式,因此您可以使用任何字符序列作为属性 name。字符串可以包含的内容没有限制。

例子:

obj.foo;  // valid
obj.else  // valid, reserved keywords are valid identifier names
obj.42    // invalid, identifier names cannot start with numbers
obj.3foo  // invalid,                ""
obj.foo-bar // invalid, `-` is not allowed in identifier names

obj[42]   // valid, 42 will be coerced to "42"
obj["--"] // valid, any character sequence is allowed
obj[bar]  // valid, will evaluate the variable `bar` and 
          // use its value as property name

使用括号表示法:

  • 当属性名称包含在变量中时,例如obj[foo].
  • 属性名称包含标识符中不允许使用的字符,例如以数字†</sup> 开头,或包含空格或破折号 ( -),例如obj["my property"]

使用点表示法:在所有其他情况下。

关于保留关键字有一个警告。虽然规范允许将它们用作属性名称并使用点表示法,但并非所有浏览器或工具都尊重这一点(尤其是较旧的 IE 版本)。因此,我认为最好的解决方案是避免使用保留关键字作为属性名称,或者如果不能使用括号表示法。


†:这也是您只能使用方括号表示法访问数组元素的原因。标识符不能以数字开头,因此不能仅由数字组成。

于 2013-06-19T11:16:40.997 回答
6

.当您知道属性的名称时,您应该使用

var object = {};
object.property = 'whatever';

,[]当属性的名称包含在变量中时使用

var object = {};
var property = 'another-property';
object[property] = 'whatever';

正如@DCoder 添加的那样,某些对象属性如果不使用该符号就无法访问,[]因为它们的名称破坏了语法。例如,名为classdefault或 data-prop-value 的属性

于 2013-06-19T11:10:43.460 回答
5

还有为什么不。运算符允许索引属性?我真的想要充分的理由。谢谢你。

好吧,如果可能的话,请考虑:

var a = 0.5;

您是指数字0.5还是访问数字的5元素?看:

Number.prototype[5] = 3;

0[5] //3
0.5 // 0.5

如果您允许语法0.5等于0[5],那么您怎么知道您的意思?

然而,可以直接将数字与对象文字一起使用:

var a = {
    0: 3,
    1: 5
};
于 2013-06-19T11:16:41.670 回答
0

点运算符和索引(括号符号)运算符都用于访问对象的属性。通常使用点运算符访问会更快,因为通过窗口访问变量要慢得多。但是如果变量中有特殊字符,则不能使用点运算符,因为它会出错。对于这种情况,我们需要使用索引运算符并将变量名作为字符串格式传递,这意味着双引号,否则会给出未定义的错误。例如-

var abc = {
    font-size : "12px"
} 
Using dot operator - abc.font-size;           //it will give error (Incorrect)
Using index operator - abc["font-size"];      //12px (Correct)
于 2017-03-27T11:57:30.623 回答