Этот код является полифилом Array.prototype.reduce, предоставленным в сети разработчиков Mozilla. 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
}
var O
заключаетthis
вobject
. 2:this
может быть нулевым, так как вы можете ввести значение null. 3:Objects created from built–in constructors like Array and Object have inherited non–enumerable properties from Object.prototype
взято с сайтаfor...in statement
- person Alex   schedule 09.07.2018k in O
не имеет ничего общего сfor … in
- person Bergi   schedule 09.07.2018reduce
, но в теле вашего вопроса показан полифилл дляmap
? - person Bergi   schedule 09.07.2018k < len
,k
всегда вO
- нет, не в разреженных массивах (или любой другой объектO
, который имеетlength
без всех свойств индекса) - person Bergi   schedule 09.07.2018