使用[]
和.
访问数组或对象属性的真正区别是什么?哪一个使用?
为什么.
运算符不允许索引属性?
答案 0 :(得分:45)
使用.
访问成员称为点符号。使用[]
访问它们称为括号表示法。
点符号仅适用于有效identifier names [spec]的属性名称,因此基本上任何名称也都是有效的变量名称(有效的标识符 ,另请参阅What characters are valid for JavaScript variable names?)和任何reserved keyword [spec]。
括号表示法需要一个表达式,该表达式的计算结果为字符串(或者可以强制转换为字符串),因此您可以使用任何字符序列作为属性名称。字符串可以包含的内容没有限制。
示例:
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]
。-
),例如obj["my property"]
。使用点符号:在所有其他情况下。
关于保留关键字,有警告。虽然规范允许将它们用作属性名称并使用点表示法,但并非所有浏览器或工具都遵循这一点(特别是较旧的IE版本)。因此,我认为最好的解决方案是避免使用保留关键字作为属性名称,或者如果不能使用括号表示法。
†:这也是您只能使用括号表示法来访问数组元素的原因。标识符不能以数字开头,因此不能只包含数字。
答案 1 :(得分:6)
当您知道酒店的名称时,您应该使用.
var object = {};
object.property = 'whatever';
,当属性名称包含在变量
中时使用[]
var object = {};
var property = 'another-property';
object[property] = 'whatever';
由于@DCoder添加了某些对象属性而不使用[]
表示法,因为它们的名称会破坏语法。例如。名为class
,default
或data-prop-value
答案 2 :(得分: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
};
答案 3 :(得分:0)
点运算符和索引(括号表示法)运算符都用于访问Object的属性。通常使用点运算符访问速度非常快,因为通过窗口访问变量的速度要慢得多。但在特殊情况下 在变量中,您不能使用点运算符,因为它会给出错误。对于这种情况,我们需要使用索引运算符并将变量名称作为字符串格式传递意味着双引号,否则它将给出未定义的错误。 例如 -
var abc = {
font-size : "12px"
}
Using dot operator - abc.font-size; //it will give error (Incorrect)
Using index operator - abc["font-size"]; //12px (Correct)