具体如何使用" []"作为参数工作?

时间:2015-11-09 15:14:05

标签: javascript arrays

我在网上做了一些javascript练习(codewars.com)。一个问题是要求用户获取一组数组对象并从整个数组中删除一个级别。

[] /* becomes */ []
[[1, 2, 3], ["a", "b", "c"], [1, 2, 3]] /* becomes */ [1, 2, 3, "a", "b", "c", 1, 2, 3]
[[3, 4, 5], [[9, 9, 9]], ["a,b,c"]] /* becomes */ [3, 4, 5, [9, 9, 9], "a,b,c"]

我最后了解了concat方法,但最流行的解决方案使用了这个声明......

function (arr){
  return [].concat.apply([],arr);
}

有人可以在这里解释[]的用法吗?我无法理解这是如何产生正确的结果的(并且它没有在页面上给出解释)。我知道还有很多其他时候使用空括号作为参数和标签数组,因此理解这里的用法可能有助于我将来自己使用它。

1 个答案:

答案 0 :(得分:8)

让我们将它分成多行,这样更容易描述。行D的描述具体是回答您的问题的原因

[]          // A
    .concat // B
    .apply( // C
        [], // D
        arr // E
    );
  • A数组,但在这里它只是用作Array.prototype的快捷方式,因此我们可以访问..
  • B来自Array.prototype
  • concat方法
  • C然后我们使用
  • 调用(使用apply
  • D this数组的参数,作为基础对象
  • E一个参数列表,这是我们之前的arr

因此,您可以使用Array.prototypecall重写

var new_base_arr = [];
Array.prototype.concat.call(
    new_base_arr,
    arr[0],
    arr[1],
    ...
    arr[n]
);

你可能看起来更熟悉

new_base_arr.concat(arr[0], arr[1], ..., arr[n]);

这里要解决的问题是调用具有未确定数量的参数的函数。