这段代码如何理解??

var singleNumber = function(nums) {
    return nums.reduce(function(prev, cur) {
        return prev ^ cur;
    });
};
singleNumber([2,3,5,6,2,3,5]) //结果是6

我太菜了理解不了reduec和prev ^ cur,网上查资料解释的不清楚,求大神通俗易懂的解释

阅读 2.5k
5 个回答

reduce这个函数 可以这样理解 将计算得到的结果作为下一次运算的参数继续参与运算;

举个例子

[1,2,3,4,5].reduce(function(prev,cur){
    return prev + cur
})
//结果就是
1+2 = 3
3+3 = 6
6+4 = 10
10+5 = 15

^ 运算符是位运算符,异或操作,简单就是将左右两个参数转换成二进制然后比对

比如 3 ^ 5 就是011 ^ 101 ,异或运算会比对参数的每一位上是否相等 如果相等则取0不等则取1,则011 ^ 101=110

然后再回头看题目
拆分就相当于

2^3 = 010^011 = 001 =1
1^5 = 001^101 = 100 =4
4^6 = 100^110 = 010 =6
2^2 = 010^010 = 000 = 0
0^3 = 000^011 = 011 = 3
3^5 = 011^101 = 110 = 6

这样会不会好理解呢?

^(异或)也就是不同为真 0和1 1和0 。1和1 0 和 0 都是假。 
2=10B 3=11B 1=01B

reduce可以变相的理解为遍历吧,有参数的话第一个是参数,没有的话,少一次循环。返回值当做参数。

学习的话可以看MDN或者阮一峰的一些文章,都是免费的

clipboard.png

泻药,每次返回按位异或的结果,又跟下一个数按位异或,相当于 2^3^5^6^2^3^5

        Array.prototype.reduce = function(fn, prev){
            prev = prev || 0;
            var i = 0, l = this.length;
            for(i; i < l; i++){
                prev = fn(prev, this[i], i, this);
            }
            return prev;
        }
        
        var rs = [1,2,3].reduce(function(a, b){
            return a + b;
        });
        
        console.log(rs);

简单模拟一下reduce的功能,这样可能你会好理解一点,当然,最好的是去文档中寻找它的详细说明

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题