除了第一种形式可以使用变量而不仅仅是字符串文字这一显而易见的事实之外,是否有任何理由使用其中一种而不是另一种,如果是这样,在哪些情况下?
在代码:
// 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;
上下文:我写了一个代码生成器,产生这些表达式,我想知道哪个更可取。
当前回答
使用这些符号时要小心: 如。如果我们想访问一个窗口的父函数。 在IE中:
window['parent']['func']
并不等同于
window.['parent.func']
我们可以用:
window['parent']['func']
or
window.parent.func
访问它
其他回答
括号表示法可以使用变量,所以它在两个点表示法不起作用的情况下很有用:
1)动态确定属性名时(直到运行时才知道确切的名称)。
2)当使用for..in循环遍历对象的所有属性时。
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
在ie8中,点表示法不适用于某些关键字(如new和class)。
我有这样的代码:
//app.users is a hash
app.users.new = {
// some code
}
这会触发可怕的“期望标识符”(至少在IE8和windows xp上,我还没有尝试过其他环境)。简单的解决方法是切换到括号符号:
app.users['new'] = {
// some code
}
或者当你想动态改变一个元素的classList动作时:
// Correct
showModal.forEach(node => {
node.addEventListener(
'click',
() => {
changeClass(findHidden, 'remove'); // Correct
},
true
);
});
//correct
function changeClass(findHidden, className) {
for (let item of findHidden) {
console.log(item.classList[className]('hidden'));// Correct
}
}
// Incorrect
function changeClass(findHidden, className) {
for (let item of findHidden) {
console.log(item.classList.className('hidden')); // Doesn't work
}
}
我举了另一个例子来清楚地理解用法上的差异。当使用嵌套数组和嵌套对象时
const myArray = [
{
type: "flowers",
list: [ "a", "b", "c" ],
},
{
type: "trees",
list: [ "x", "y", "z" ],
}
];
现在如果我们想要访问树列表中的第二项是y。
我们不能一直用括号
const secondTree = myArray[1]["list"][1]; // incorrect syntex
相反,我们必须使用
const secondTree = myArray[1].list[1]; // correct syntex
[]符号有用的情况:
如果您的对象是动态的,并且在键中可能有一些随机值,如number和[]或任何其他特殊字符,例如-
var a = {1:3};
如果你试图访问a。1,它会报错,因为它期待的是一个字符串。