除了第一种形式可以使用变量而不仅仅是字符串文字这一显而易见的事实之外,是否有任何理由使用其中一种而不是另一种,如果是这样,在哪些情况下?

在代码:

// Given:
var foo = {'bar': 'baz'};

// Then
var x = foo['bar'];

// vs. 
var x = foo.bar;

上下文:我写了一个代码生成器,产生这些表达式,我想知道哪个更可取。


当前回答

让我再添加一些方括号符号的用例。如果你想访问一个属性,比如对象中的x-proxy,那么-将被错误地解释。还有一些其他的情况,比如空格,点,等等,点运算对你没有帮助。另外,如果你在一个变量中有键,那么在一个对象中访问键值的唯一方法是用括号符号。希望你能了解更多的背景。

其他回答

或者当你想动态改变一个元素的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
  }
}

括号表示法可以使用变量,所以它在两个点表示法不起作用的情况下很有用:

1)动态确定属性名时(直到运行时才知道确切的名称)。

2)当使用for..in循环遍历对象的所有属性时。

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

我举了另一个例子来清楚地理解用法上的差异。当使用嵌套数组和嵌套对象时

    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

在ie8中,点表示法不适用于某些关键字(如new和class)。

我有这样的代码:

//app.users is a hash
app.users.new = {
  // some code
}

这会触发可怕的“期望标识符”(至少在IE8和windows xp上,我还没有尝试过其他环境)。简单的解决方法是切换到括号符号:

app.users['new'] = {
  // some code
}

一般来说,他们做同样的工作。 尽管如此,括号符号给了你做点符号做不到的事情的机会,比如

var x = elem["foo[]"]; // can't do elem.foo[];

这可以扩展到任何包含特殊字符的属性。