2016-07-16 15 views
3

次のコード、なぜ[配列] .concat()と[配列] .concat.apply()の出力が異なるのですか?

console.log([].concat.apply([2],[[99],5,6,[2,3]])); 

出力

[ 2, 99, 5, 6, 2, 3 ] 

、以下のコード、

console.log([2].concat([99]).concat([5,6,[2,3]])); 

出力

[ 2, 99, 5, 6, [ 2, 3 ] ] 

私の仮定はoutpuということでした

console.log([].concat.apply([2],[[99],5,6,[2,3]])); 

のtは

[2,[99],5,6,[2,3]] 

しかし、そのない、なぜべきか?

+0

値が配列である間に、 'apply'のように見えますが、各引数を繰り返します。しかし、もう少し深い証拠が必要です。 –

+0

両方の文が等価であるために、適用入力のまわりに別の対の括弧がありません。 – plalx

+0

ちょっと@Guedes、いいえ、問題は適用されません。このコードをチェックしてください:function abc(x、y、z){console.log(x、y、z);}ここでabc.apply(this、[3,4、[5]])は3 4 [5]を生成するのに対し、abc.apply(this、[3,4,5])は3 4 5 – Ayan

答えて

1

のため:

console.log([].concat.apply([2],[[99],5,6,[2,3]])); 

は、と等価である:

console.log([2].concat([99], 5, 6, [2,3])); 

.concatは、複数の引数を取り、そして単一の配列にすべての配列(および非配列引数)をマージ。基本的には、配列の引数は1レベルアンパックされます。

出力を取得するには、各配列要素を追加の配列にラップする必要があります。

console.log([].concat.apply([2],[[[99]],5,6,[[2,3]]])); 

おそらく.pushに基づく方法を使用することをお勧めします。

var a = [2]; 
 
a.push.apply(a, [[99],5,6,[2,3]]); 
 
console.log(a);

0

documentを見ずにあなたのことを仮定しています。ビューのあなたのコードの観点から、

Array.prototype.concat ([ item1 [ , item2 [ , … ] ] ]) 

だからあなたのコードはかろうじてに等しくされ、連結のための実際の構文は、

[].concat.apply([itm1], [itm2,itm3,itm4]...) 

を参照してください、あなたのコードは、に似て

[2].concat([99],5,6,[2,3]); 

あなたのコードを解体しましょう。

console.log([].concat.apply([2],[[99],5,6,[2,3]])); 
// 1. apply will call the function by applying the parameter supplied as an array. 
// 2. so the first parameter for apply would be this for that function 
// 3. and the second parameter for it would be the arguments in an array form. 
// 4. Hence internally apply will call the function concat as, 
// [2].concat([99],5,6,[2,3]); //[2] will be 'this' 

しかし、あなたの要件のために、あなたはapplyと一緒に行く必要はありません、callを使用することができます。だ

console.log([].concat.call([2],[[99],5,6,[2,3]])); 
//[2,[99],5,6,[2,3]] 
0

あなたはconcat MDNを参照する場合は、Array.prototype.concatの構文は

var new_array = old_array.concat(value1[, value2[, ...[, valueN]]]) 

だけではなく、価値ある見つけるだろう。配列および/または値

だから[].concat.apply([],[2,3,[6,4]])[].concat.apply([],[2,3,6,4])に等しい新たな配列に連結します。

関連する問題