Javascript数组方法,例如forEach有一个thisArg参数,用作调用回调的上下文:
array.forEach(callback[, thisArg])
Run Code Online (Sandbox Code Playgroud)
因为这样做every,some,filter和map.但是,reduce并reduceRight没有这样的参数.这有什么特别的原因,或某些原因没有必要吗?
例如,考虑以下功能组合的实现reduceRight:
function compose () {
var fns = [].slice.call(arguments,0);
return function result() {
return fns.reduceRight(
function (prev,cur){
return [cur.apply(this,prev)];
},
arguments
)[0];
};
}
Run Code Online (Sandbox Code Playgroud)
我想使这个"知道",所以正在编写的函数compose在调用返回函数的上下文中被调用.目前,它们似乎是在全局对象的上下文中调用的.我可以var self=this;在函数的顶部执行旧的操作result,并将其用作cur.apply调用的第一个参数,我目前拥有this,但如果reduce采用thisArg参数则不需要.
我在这里遗漏了什么,有什么东西reduce可以使这不必要或无用吗?
UPDATE
@kangax是的,发生在我身上.对我来说,批评API的设计远非如此,但签名reduce似乎对我来说有点奇怪.第二个可选参数的功能与普通的可选参数不同,后者通常只有一个默认值; 相反,它的存在或不存在会改变行为,基本上会根据签名(参数计数)重载函数.当第二个参数不存在时,数组的第一个元素成为起始值,第一个对回调的调用是第二个值.在我看来,这种行为可以通过简单的调用轻松模拟
array.slice(1).reduce(fn,array[0])
Run Code Online (Sandbox Code Playgroud)
而不是为省略第二个参数的情况建立特殊规则,反过来,如果你的推定是正确的,也基本上不可能弄清楚在哪里指定thisArg参数.再说一次,我确信这些问题在规范被删除时已经有争议,这种方法可能有充分的理由.
特定
var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
Run Code Online (Sandbox Code Playgroud)
我们可以arr使用Number构造函数过滤数组中的数字项
var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)
是true和[10]预期在所得数组?如果我们替换false了true在arr
var arr = [1,2,false,4,{"abc":123},6,7,{"def":456},9,[10]]
var res = arr.filter(Number) // [1, 2, 4, 6, 7, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)
运用 Array.isArray
var res = arr.filter(Array.isArray) // [Array[1]]
Run Code Online (Sandbox Code Playgroud)
String
var res = arr.filter(String) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)
如果我们想要在arr对象,索引中过滤项目4,7我们会尝试 …