除了第一种形式可以使用变量而不仅仅是字符串文字这一显而易见的事实之外,是否有任何理由使用一个而不是另一个,如果是这样,在哪些情况下?
在代码中:
// 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
在这种情况下不起作用。
在 JavaScript 中访问属性的两种最常见方式是使用点和方括号。无论value.x
和value[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"]
.
点符号不适用于 Internet Explorer 8 中的某些关键字(如new
和class
)。
我有这个代码:
//app.users is a hash
app.users.new = {
// some code
}
这会触发可怕的“预期标识符”(至少在 windows xp 上的 IE8 上,我还没有尝试过其他环境)。对此的简单解决方法是切换到括号表示法:
app.users['new'] = {
// some code
}
一般来说,他们做同样的工作。
尽管如此,括号表示法让您有机会做点表示法无法做的事情,例如
var x = elem["foo[]"]; // can't do elem.foo[];
这可以扩展到任何包含特殊字符的属性。