JavaScript,这个函数怎么可能返回空数组?

20
function whatTheHeck(obj){
  var arr = []

  for(o in obj){
    arr.concat(["what"])
  }

  return arr
}

whatTheHeck({"one":1, "two": 2})

concat函数完全没有起到任何作用。但是如果我在Firebug上在那一行设置一个断点并将该行作为监视器运行,它就可以正常工作。而且for循环会迭代两次,但最终arr仍然等于[]。


实际上,即使没有循环,它仍然失败。唯一有效的方法是直接使用 return [].concat(["what"])。世界上有些事情非常不对劲。 - Moss
1个回答

47

Array.concat会创建一个新数组,而不是修改原始数组,因此你当前的代码其实什么都没有做。它不会修改arr

所以,你需要将你的函数更改为以下内容才能看到实际效果:

function whatTheHeck(obj){
  var arr = [];

  for(o in obj){
    arr = arr.concat(["what"]);
  }

  return arr;
}

whatTheHeck({"one":1, "two": 2});

如果你只想在数组的末尾添加单个元素,.push() 是更好的方法:

function whatTheHeck(obj){
  var arr = [];

  for(o in obj){
    arr.push("what");
  }

  return arr;
}

whatTheHeck({"one":1, "two": 2});

这是我发现JavaScript数组方法有点令人困惑的事情之一。一些方法会修改原始数组,而另一些则不会,没有命名约定来知道哪个方法会修改数组,哪个不会。你只需要阅读和学习哪些方法以哪种方式工作。


哇,我真的太蠢了。那个东西在哪里解释过?有些东西会修改你的对象,有些则会创建新的对象,而我只是假设... - Moss
还要注意,基本的 for-in 循环会遍历对象的继承属性以及手动设置的属性。因此,像这样的 for-in 循环应该检查 o 是否是在 obj 上“手动”设置的属性(即在 push 之前使用 if (!obj.hasOwnProperty(o)) continue;)。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接