为了账号安全,请及时绑定邮箱和手机立即绑定

js这个while循环有什么用?

js这个while循环有什么用?

饮歌长啸 2018-10-04 10:13:34
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是会忽略你提供的初始值的

查看完整回答
反对 回复 2018-11-28
  • 1 回答
  • 0 关注
  • 677 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信