除了首个表单可以使用变量而不仅仅是字符串文字这一明显事实之外,是否有任何理由优先使用其中一种表单?如果有,在哪些情况下使用?
代码中:
// Given:
var foo = {'bar': 'baz'};
// Then
var x = foo['bar'];
// vs.
var x = foo.bar;
背景:我编写了一个代码生成器,它输出这些表达式,我想知道哪个更好。
除了首个表单可以使用变量而不仅仅是字符串文字这一明显事实之外,是否有任何理由优先使用其中一种表单?如果有,在哪些情况下使用?
代码中:
// Given:
var foo = {'bar': 'baz'};
// Then
var x = foo['bar'];
// vs.
var x = foo.bar;
背景:我编写了一个代码生成器,它输出这些表达式,我想知道哪个更好。
(来源于这里。)
方括号表示法允许使用不能用于点表示法的字符:
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
var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello
obj.x
在这种情况下无法工作。
value.x
和 value[x]
都访问value对象的属性,但不一定是同一个属性。区别在于如何解释x。 当使用点时,点后面的部分必须是有效的变量名,并直接命名为属性。当使用方括号时,方括号之间的表达式被评估以获取属性名称。因此,value.x获取命名为“x”的属性值,而value[x]尝试计算表达式x并将结果用作属性名称。value.length
进行访问。如果要提取由变量持有的值命名的属性,则可以使用value[i]
进行访问。由于属性名称可以是任何字符串,如果要访问名为"2"
或"John Doe"
的属性,则必须使用方括号: value[2]
或 value["John Doe"]
。即使您事先知道属性的确切名称,也要这样做,因为"2"
或 "John Doe"
都不是有效的变量名称,因此无法通过点表示法访问。array.length
,因为这比编写array["length"]
更容易。在Internet Explorer 8中,点符号表示法无法与一些关键字(例如new
和class
)一起使用。
我有这段代码:
//app.users is a hash
app.users.new = {
// some code
}
这会触发令人恐惧的“预期标识符”错误(至少在Windows XP上的IE8中会出现此问题,我尚未尝试其他环境)。解决此问题的简单方法是切换到方括号表示法:
app.users['new'] = {
// some code
}
foo.bar
和foo["bar"]
都可以访问 foo 对象的某个属性,但不一定是同一个属性。区别在于如何解释 bar
。使用点时,点后面的单词是属性的字面名称。使用方括号时,方括号内的表达式将被计算以获取属性名称。foo.bar
获取名为"bar"
的属性值,而foo["bar"]
尝试计算表达式 "bar"
并使用结果(转换为字符串)作为属性名称。
如果我们有这个对象:
const obj = {
123: 'digit',
123name: 'start with digit',
name123: 'does not start with digit',
$name: '$ sign',
name-123: 'hyphen',
NAME: 'upper case',
name: 'lower case'
};
使用点表示法访问他们的属性
obj.123; // ❌ SyntaxError
obj.123name; // ❌ SyntaxError
obj.name123; // ✅ 'does not start with digit'
obj.$name; // ✅ '$ sign'
obj.name-123; // ❌ SyntaxError
obj.'name-123';// ❌ SyntaxError
obj.NAME; // ✅ 'upper case'
obj.name; // ✅ 'lower case'
但对于方括号表示法来说,这些都不是问题:
obj['123']; // ✅ 'digit'
obj['123name']; // ✅ 'start with digit'
obj['name123']; // ✅ 'does not start with digit'
obj['$name']; // ✅ '$ sign'
obj['name-123']; // ✅ 'does not start with digit'
obj['NAME']; // ✅ 'upper case'
obj['name']; // ✅ 'lower case'
const variable = 'name';
const obj = {
name: 'value'
};
// Bracket Notation
obj[variable]; // ✅ 'value'
// Dot Notation
obj.variable; // undefined
一般来说,它们完成相同的工作。
然而,括号表示法给了你一些用点表示法无法实现的机会,比如
var x = elem["foo[]"]; // can't do elem.foo[];
如果属性名包含特殊字符,则需要使用括号:
var foo = {
"Hello, world!": true,
}
foo["Hello, world!"] = false;
除此之外,我想这只是个人口味问题。在我看来,点表示法更短,并且它使属性与数组元素更加明显(尽管当然 JavaScript 无法使用关联数组)。
当您使用中括号表示法时 -
The property name is number.
var ob = {
1: 'One',
7 : 'Seven'
}
ob.7 // SyntaxError
ob[7] // "Seven"
The property name has special character.
var ob = {
'This is one': 1,
'This is seven': 7,
}
ob.'This is one' // SyntaxError
ob['This is one'] // 1
The property name is assigned to a variable and you want to access the property value by this variable.
var ob = {
'One': 1,
'Seven': 7,
}
var _Seven = 'Seven';
ob._Seven // undefined
ob[_Seven] // 7
使用这些符号时要小心: 例如,如果我们想访问窗口的父级中存在的函数。 在IE中:
window['parent']['func']
不等于
window.['parent.func']
window['parent']['func']
window.parent.func
访问它
方括号表示法可以使用变量,因此在以下两种情况下非常有用,此时点表示法无法工作:
1)当属性名称是动态确定的(当准确的名称直到运行时才知道)。
2)当使用for..in循环遍历对象的所有属性时。
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects