此代码是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。是否this
是null
,为什么下面需要此代码?
if (this == null) {
throw new TypeError('this is null or not defined')
}
3。为什么我们需要k in O
?而k < len
,k
始终处于O
,这是无用的条件吗?
if (k in O) {
kValue = O[k]
mappedValue = callback.call(T, kValue, k, O)
A[k] = mappedValue
}
答案 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