Last active
March 18, 2017 16:35
-
-
Save zerolethanh/fcfce450e7fffac260a264f3e62310c0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Production steps of ECMA-262, Edition 5, 15.4.4.21 | |
// Reference: http://es5.github.io/#x15.4.4.21 | |
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce | |
if (!Array.prototype.reduce) { | |
Object.defineProperty(Array.prototype, 'reduce', { | |
value: function(callback /*, initialValue*/) { | |
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'); | |
} | |
// 1. Let O be ? ToObject(this value). | |
var o = Object(this); | |
// 2. Let len be ? ToLength(? Get(O, "length")). | |
var len = o.length >>> 0; | |
// Steps 3, 4, 5, 6, 7 | |
var k = 0; | |
var value; | |
if (arguments.length == 2) { | |
value = arguments[1]; | |
} else { | |
while (k < len && !(k in o)) { | |
k++; | |
} | |
// 3. If len is 0 and initialValue is not present, | |
// throw a TypeError exception. | |
if (k >= len) { | |
throw new TypeError( 'Reduce of empty array ' + | |
'with no initial value' ); | |
} | |
value = o[k++]; | |
} | |
// 8. Repeat, while k < len | |
while (k < len) { | |
// a. Let Pk be ! ToString(k). | |
// b. Let kPresent be ? HasProperty(O, Pk). | |
// c. If kPresent is true, then | |
// i. Let kValue be ? Get(O, Pk). | |
// ii. Let accumulator be ? Call( | |
// callbackfn, undefined, | |
// « accumulator, kValue, k, O »). | |
if (k in o) { | |
value = callback(value, o[k], k, o); | |
} | |
// d. Increase k by 1. | |
k++; | |
} | |
// 9. Return accumulator. | |
return value; | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment