对Array.prototype.reduce

时间:2018-07-09 11:07:36

标签: javascript arrays dictionary polyfills

此代码是Mozilla开发人员网络上提供的Array.prototype.reduce的polyfill。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

// Production steps of ECMA-262, Edition 5, 15.4.4.19
// Reference: http://es5.github.io/#x15.4.4.19
if (!Array.prototype.map) {
  Array.prototype.map = function(callback /*, thisArg*/) {
    var T, A, k
    if (this == null) {
      throw new TypeError('this is null or not defined')
    }

    var O = Object(this)
    var len = O.length >>> 0

    if (typeof callback !== 'function') {
      throw new TypeError(callback + ' is not a function')
    }

    if (arguments.length > 1) {
      T = arguments[1]
    }

    A = new Array(len)
    k = 0

    while (k < len) {
      var kValue, mappedValue

      if (k in O) {
        kValue = O[k]
        mappedValue = callback.call(T, kValue, k, O)
        A[k] = mappedValue
      }
      k++
    }

    return A
  }
}

我不明白的是这两行

1。为什么不只使用this

var O = Object(this)

2。是否thisnull,为什么下面需要此代码?

if (this == null) {
  throw new TypeError('this is null or not defined')
}

3。为什么我们需要k in O?而k < lenk始终处于O,这是无用的条件吗?

if (k in O) {
    kValue = O[k]
    mappedValue = callback.call(T, kValue, k, O)
    A[k] = mappedValue
  }

1 个答案:

答案 0 :(得分:2)

  

1。为什么不只使用它?

var O = Object(this)

在第3版中,未定义或为null的thisArg替换为全局对象,并且ToObject应用于所有其他值,并且该结果作为this值传递。

所以我的猜测是,这样做的原因是为了保持一致性。

  

2。可能为null,为什么需要下面的代码?

if (this == null) {
  throw new TypeError('this is null or not defined')
}

是的,这可能为空。

在有和没有严格模式下执行以下代码。您会注意到,在严格模式下,输出为null,在其他情况下,其输出为窗口。

// "use strict";
var x = function(){
    console.log(this);
    return this;
}

x.call(null);
  

3。为什么在O中需要k?而k

if (k in O) {
    kValue = O[k]
    mappedValue = callback.call(T, kValue, k, O)
    A[k] = mappedValue
  }

不是无用的条件,因为它会检查属性是否存在。(请参见in运算符示例)

添加带有稀疏数组的示例:

var a = new Array(3);
console.log(a); // [ , , ]
console.log(a.length); // 3
console.log(a[0]); // undefined