【问题标题】:javascript, how can this function possibly return an empty array?javascript,这个函数怎么可能返回一个空数组?
【发布时间】:2011-11-01 05:53:57
【问题描述】:
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"])。这个世界出了点问题。

标签: javascript arrays function loops concat


【解决方案1】:

Array.concat 创建一个新数组 - 它不会修改原始数组,因此您当前的代码实际上什么也没做。它不会修改arr

因此,您需要将您的函数更改为 this 才能看到它实际工作:

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 数组方法感到有些困惑的事情之一。有些修改原始数组,有些不修改,并且没有命名约定来知道哪些做哪些不做。您只需要阅读并了解哪些工作方式。

【讨论】:

  • 哇,这真是太愚蠢了。当这在某处被解释时,我在哪里?有些东西会修改您的对象,有些会创建新对象,我只是假设...
  • 另请注意,除了手动设置的属性之外,对象上的基本 for-in 循环还将遍历继承的属性。所以像这样的 for-in 应该检查 o 是在 obj 上“手动”设置的属性之一(即在推送之前使用 if (!obj.hasOwnProperty(o)) continue;)。
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多