var k = 0;var arr = [1,2,3,4,5,6];var len = arr.length;while (k < len && !(k in arr)) { k++; }摘自if (!Array.prototype.reduce) { Array.prototype.reduce = function(callback /*, initialValue*/) { 'use strict'; if (this === null) { throw new TypeError('Array.prototype.reduce called on null or undefined'); } if (typeof callback !== 'function') { throw new TypeError(callback + ' is not a function'); } var t = Object(this), len = t.length >>> 0, k = 0, value; if (arguments.length == 2) { value = arguments[1]; } else { while (k < len && !(k in t)) { k++; } if (k >= len) { throw new TypeError('Reduce of empty array with no initial value'); } value = t[k++]; } for (; k < len; k++) { if (k in t) { value = callback(value, t[k], k, t); } } return value; };}
1 回答
忽然笑
TA贡献1806条经验 获得超5个赞
好吧,原来是源码抽取来的,应该是为了找到arr
中第一个值的索引
比如
arr = [1, 2, 3]
delete(arr[0])
0 in arr // false
1 in arr // true
因为把arr[0]
删掉了,arr
中第一个数字的索引值就变成1了,此时k = 1
了
因为当arguments.length != 2
的时候,意味着用户没提供reduce
的初始值,
所以就要找到arr
中的第一个有效值arr[k]
赋给value
作为初始值
题主你提供这个版本的实现应该是有bug
的,你自己试一下把你的Array.prototype.reduce
实现复制进console
,然后输入以下代码
arr = [1, 2, 3]
arr.reduce( (s, i) => s+i ) // 6
arr.reduce( (s, i) => s+i, 1 ) // 7
arr.reduce( (s, i) => s+i, 1, 2 ) // 6
然后就会发现,当arguments.length == 3
时,reduce
是会忽略你提供的初始值的
添加回答
举报
0/150
提交
取消