我想做一个将被执行到数组中的partial_left函数,其中包括:
array_1.map(partial_left1(equal));
function equal(x){return x;}
,但是当我将参数的变量推送到另一个数组(而不是使用Array.prototype.slice.call(arguments))时,我崩溃了。因为我想做其他方式,但当结果不同时我感到很惊讶:
var array_1=[1,2,3];
使用我的方法:结果是:[1,1,1] //仅对数组[0]进行引用
with Array,prototype.slice.call:[1,2,3] //我希望如何成为
这是我的代码,我在其中推送另一个数组中的参数值:
function concat(arg1,arg2,n){
for (var i = n; i < arg2.length; i++)
arg1.push(arg2[i]);
return arg1;
}
function partial_left1(f){
var argum_apply=[];
argum_apply=concat(argum_apply,arguments,1);
return function(){
argum_apply=concat(argum_apply,arguments,0);
return f.apply(this,argum_apply);
};
}
这是Array.prototype.slice.call的代码:
function array(a, n) { return Array.prototype.slice.call(a, n || 0); }
function partial_left2(f /*, ...*/) {
var args = arguments;
return function() {
var a = array(args, 1);
a = a.concat(array(arguments));
return f.apply(this, a);
};
}
与partial相等的简单定义:
var equal_left1=partial_left1(equal);
var equal_left2=partial_left2(equal);
以下是结果,我不知道为什么他们是不同的?
var array_1=[1,2,3];
alert(array_1.map(equal_left1));//1,1,1
alert(array_1.map(equal_left2));//1,2,3
有些人知道请解释一下&#34; Concat&#34;之间的区别。并使用&#34; Array.prototype.slice.call&#34;?
答案 0 :(得分:0)
一个糟糕的设计决策:arguments
不是数组。它是array-like
,在某种意义上它具有length
属性。
您无法调用concat
的{{1}}方法,因为它不存在。
arguments
使用数组中的Array.prototype.slice.call
方法并调用它 - 这是将slice
转换为正确数组的快速简便方法。
如果你愿意,你可以用循环做同样的事情:
array-like