鍍金池/ 問答/HTML/ js這段利用apply合并數(shù)組的代碼沒看懂

js這段利用apply合并數(shù)組的代碼沒看懂

求大佬詳細(xì)說下下面代碼的運(yùn)行機(jī)制。
(這讓我想到了好像以前就是利用apply來實(shí)現(xiàn)es6里面的...運(yùn)算符?)

// `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"]
回答
編輯回答
硬扛

apply的文檔

第二個(gè)參數(shù):argsArray
一個(gè)數(shù)組或者類數(shù)組對象,其中的數(shù)組元素將作為單獨(dú)的參數(shù)傳給 fun 函數(shù)。如果該參數(shù)的值為null 或 undefined,則表示不需要傳入任何參數(shù)。從ECMAScript 5 開始可以使用類數(shù)組對象。

所以

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

實(shí)質(zhì)上會(huì)將b中三個(gè)元素4,5,6當(dāng)作a.push的參數(shù),這里的a不是apply左邊的a,而是傳給apply的第一個(gè)參數(shù)。換句話說,apply會(huì)將第二個(gè)類數(shù)組參數(shù)拆分成一個(gè)個(gè)單獨(dú)項(xiàng)。
而與之對應(yīng)的有個(gè)call方法。

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

雖然支持超過2個(gè)參數(shù),但需要將參數(shù)都列出來,在數(shù)組操作上比apply要弱上許多。

2018年5月4日 07:33
編輯回答
放開她

首先你要知道apply是干啥的,apply會(huì)改變方法的this指向?yàn)榈谝粋€(gè)參數(shù),第二個(gè)參數(shù)是個(gè)數(shù)組

2017年9月30日 15:44
編輯回答
浪蕩不羈
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]

與之對應(yīng)的ES6:擴(kuò)展運(yùn)算符

let a = [1,2,3],b=[4,5,6];
a.push(...b) // 6
a // [1, 2, 3, 4, 5, 6]
2017年1月13日 13:53