Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个concat命令如何处理这个数组?_Javascript_Arrays_Apply - Fatal编程技术网

Javascript 这个concat命令如何处理这个数组?

Javascript 这个concat命令如何处理这个数组?,javascript,arrays,apply,Javascript,Arrays,Apply,我遇到了这个JS问题,但我不知道它是如何工作的语法,有人能帮我解释一下吗?我不理解开始时的空方括号语法,以及concat是如何与另一个空方括号一起应用的?这让我很困惑 感谢您的帮助 let arr = [[1, 2],[3, 4],[5, 6, 7, 8, 9],[10, 11, 12]]; let flattened = [].concat.apply([], arr); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ] []是一个空数组。conca

我遇到了这个JS问题,但我不知道它是如何工作的语法,有人能帮我解释一下吗?我不理解开始时的空方括号语法,以及concat是如何与另一个空方括号一起应用的?这让我很困惑

感谢您的帮助

let arr = [[1, 2],[3, 4],[5, 6, 7, 8, 9],[10, 11, 12]];

let flattened = [].concat.apply([], arr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]

[]是一个空数组。concat函数连接两个或多个数组:
[]。concat(arr[0]、arr[1]、arr[2]、arr[3])

这里的关键是要知道apply是如何工作的。apply的第二个参数是参数数组。就像这样做(如果您熟悉Destructuring的概念):
[].concat(…arr)


您可以阅读更多有关应用的信息,让我们一步一步地进行
[].concat()
只是函数,因为
apply
不是对常规元素调用的,而是对函数调用的。前面的
[]
用于调用
concat
,因为它是数组的一种方法。 该方法调用具有给定此值的函数,并以数组形式提供参数
因此,
[].concat.apply([],arr)
有三个部分:

  • concat
    -使用的功能
  • []
    -调用函数的元素(函数的第一个参数) 申请表(已提供)
  • arr
    -传递给每个所用函数的元素数组 时间
所以在引擎盖下看起来是这样的:

[].concat([1, 2]).
  .concat([3, 4])
  .concat([5, 6]) //etc
然后返回连接的数组并将其存储到展平的
中。现在,
arr
的每个子数组都已连接到另一个子数组,并生成一个简单数组
[1,2,3,4,5,6,…]

let arr = [[1, 2],[3, 4],[5, 6, 7, 8, 9],[10, 11, 12]];

let flattened = [].concat.apply([], arr);
*first array*---|                |---*second array*
           
first
数组有一个目标:

  • 使用
    this
    调用
    concat()
    方法。这里
    这个
    第二个
    数组。然后扔掉
    第一个
    数组
然后
apply()
方法将
arr
数组展平到一个级别。 您可以查看:

let foo=[0].concat([1,2,3],[1,2,3]];

console.log(foo)
谢谢@steppup那么应用函数中的空数组有什么意义呢?我知道这意味着引用一个“this”对象,但在这种情况下没有“this”对象,是吗?如果你能解释得更多,我仍然被这两组空方括号弄糊涂了。@jobe,请看我更新的答案谢谢@Steppup,如果我理解正确,调用concat后第一个[]基本上被忽略了,然后是第二组[]基本上被用于concat每个参数?所以您总是需要第二组[],不能使用null或其他任何东西。@jobe,请参阅我关于第一个数组问题的更新答案。第二个问题的答案可能是这样的:您可以使用任何您想要的类型,因为这将是上下文。这就是
apply()
的工作原理。然而,然后
concat
方法将把它作为一个参数处理,并将它放入平坦数组中。尝试测试它
console.log(Array.prototype.concat.apply({foo:'bar'},arr))谢谢@stepp我接受了你的回答。所以第一个数组的[]有点像array.prototype的缩写?是吗?你确定关于申请的解释吗?那么首先使用apply的第一个参数调用concat,它是空数组?我以为它是由参数调用的,第一个参数就是“this”上下文?这就是让我困惑的地方。把它改了一点。最初的解释不是很好。