js这段利用apply合并数组的代码没看懂

求大佬详细说下下面代码的运行机制。
(这让我想到了好像以前就是利用apply来实现es6里面的...运算符?)

// `b` onto `a`:
a.push.apply( a, b );
a; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]

// or `a` into `b`:
b.unshift.apply( b, a );

b; // [1,2,3,4,5,6,7,8,9,"foo","bar","baz","bam","bun","fun"]
阅读 2.4k
3 个回答

apply的文档

第二个参数:argsArray
一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。

所以

let a = [1,2,3],b=[4,5,6];
a.push.apply(a,b);

实质上会将b中三个元素4,5,6当作a.push的参数,这里的a不是apply左边的a,而是传给apply的第一个参数。换句话说,apply会将第二个类数组参数拆分成一个个单独项。
而与之对应的有个call方法。

let a = [1,2,3];
a.push.call(a,4,5,6);

虽然支持超过2个参数,但需要将参数都列出来,在数组操作上比apply要弱上许多。

首先你要知道apply是干啥的,apply会改变方法的this指向为第一个参数,第二个参数是个数组

let a = [1,2,3],b=[4,5,6];
a.push(b) // 4
a // [1,2,3,[4,5,6]]

let c = [1,2,3],d = [4,5,6];
c.push.apply(c,d); // 6
c //  [1, 2, 3, 4, 5, 6]
d.push.call(d,1,2,3) // 6
d // [4, 5, 6, 1, 2, 3]
[1,2,3].concat([4,5,6]) // [1, 2, 3, 4, 5, 6]

与之对应的ES6:扩展运算符

let a = [1,2,3],b=[4,5,6];
a.push(...b) // 6
a // [1, 2, 3, 4, 5, 6]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题