相关疑难解决方法(0)

为什么Array.prototype.reduce没有thisObject参数?

Javascript数组方法,例如forEach有一个thisArg参数,用作调用回调的上下文:

array.forEach(callback[, thisArg])
Run Code Online (Sandbox Code Playgroud)

因为这样做every,some,filtermap.但是,reducereduceRight没有这样的参数.这有什么特别的原因,或某些原因没有必要吗?

例如,考虑以下功能组合的实现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参数.再说一次,我确信这些问题在规范被删除时已经有争议,这种方法可能有充分的理由.

javascript ecmascript-5

16
推荐指数
2
解决办法
3504
查看次数

如何使用Array.prototype.filter过滤对象?

特定

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]预期在所得数组?如果我们替换falsetruearr

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我们会尝试 …

javascript arrays ecmascript-6 ecmascript-7 ecmascript-next

6
推荐指数
1
解决办法
3846
查看次数