在下面的示例中,根据我发送的第一个应用
的参数,我会得到不同的结果代码是:
var fruitarray = [];
fruitarray[0] = ['strawberry', 'orange'];
fruitarray[1] = ['lime', 'peach', 'banana'];
fruitarray[2] = ['tangerine', 'apricot'];
var array1= fruitarray.concat.apply([], fruitarray); // in this case array1 is 'tangerine'
var array2= fruitarray.concat.apply('undefined', fruitarray); // in this case array2 is 'banana'
var array3= fruitarray.concat.apply(fruitarray , fruitarray); // in this case array3 is 'lime'
var array4= fruitarray.concat.apply(this, fruitarray); // in this case array3 is 'banana'
为什么?
****编辑:*****
对不起!!!
这是代码:
var fruitarray = [];
fruitarray[0] = ['strawberry', 'orange'];
fruitarray[1] = ['lime', 'peach', 'banana'];
fruitarray[2] = ['tangerine', 'apricot'];
var array1= fruitarray.concat.apply([], fruitarray);
console.log(array1[5]); // 'tangerine'
var array2= fruitarray.concat.apply('undefined', fruitarray);
console.log(array2[5]); // 'banana'
var array3= fruitarray.concat.apply(fruitarray , fruitarray);
console.log(array3[5]); // 'lime'
var array4= fruitarray.concat.apply(this, fruitarray);
console.log(array4[5]); // 'banana'
我正在使用Firebug 2.0.9进行测试(Firefox)
答案 0 :(得分:0)
因为不同的参数产生不同的输出!
数组this
函数的concat
参数不会被忽略,而是表示连接到的数组。你从fruitarray.concat.apply(…
得到了这个功能并不重要,你也可以选择Array.prototype.concat.apply(…
或[].concat.apply(…
。
那么你现在如何得到这些结果?
fruitarray.concat.apply([], fruitarray);
// is equivalent to
[].concat(['strawberry', 'orange'], ['lime', 'peach', 'banana'], ['tangerine', 'apricot']);
// and gives for array1
['strawberry', 'orange', 'lime', 'peach', 'banana', 'tangerine', 'apricot']
fruitarray.concat.apply(fruitarray, fruitarray);
// is equivalent to
fruitarray.concat(['strawberry', 'orange'], ['lime', 'peach', 'banana'], ['tangerine', 'apricot']);
// and gives for array3
[[…], […], […], 'strawberry', 'orange', 'lime', 'peach', 'banana', 'tangerine', 'apricot']
现在,如果传递的不是数组(例如字符串或Window
对象),会发生什么?事物被简单地包装成连接的单个数组,而不是传播。
fruitarray.concat.apply('undefined', fruitarray);
// is equivalent to
['undefined'].concat(['strawberry', 'orange'], ['lime', 'peach', 'banana'], ['tangerine', 'apricot']);
// and gives for array2
['undefined', 'strawberry', 'orange', 'lime', 'peach', 'banana', 'tangerine', 'apricot']
fruitarray.concat.apply(this, fruitarray);
// is equivalent to
[this].concat(['strawberry', 'orange'], ['lime', 'peach', 'banana'], ['tangerine', 'apricot']);
// and gives for array4
[{window}, 'strawberry', 'orange', 'lime', 'peach', 'banana', 'tangerine', 'apricot']