diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2015-12-17 09:15:42 +0100 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2015-12-17 09:44:51 +0100 |
commit | a1789ddde42033f1b05cc4929491214ee6e79383 (patch) | |
tree | 63615735c4ddffaaabf2428946bb26f90899f7bf /resources/lib/es5-shim/es5-shim.js | |
parent | 9e06a62f265e3a2aaabecc598d4bc617e06fa32d (diff) |
Update to MediaWiki 1.26.0
Diffstat (limited to 'resources/lib/es5-shim/es5-shim.js')
-rw-r--r-- | resources/lib/es5-shim/es5-shim.js | 782 |
1 files changed, 406 insertions, 376 deletions
diff --git a/resources/lib/es5-shim/es5-shim.js b/resources/lib/es5-shim/es5-shim.js index 45959940..85f51e2d 100644 --- a/resources/lib/es5-shim/es5-shim.js +++ b/resources/lib/es5-shim/es5-shim.js @@ -1,17 +1,20 @@ /*! * https://github.com/es-shims/es5-shim - * @license es5-shim Copyright 2009-2014 by contributors, MIT License + * @license es5-shim Copyright 2009-2015 by contributors, MIT License * see https://github.com/es-shims/es5-shim/blob/master/LICENSE */ // vim: ts=4 sts=4 sw=4 expandtab -//Add semicolon to prevent IIFE from being passed as argument to concated code. +// Add semicolon to prevent IIFE from being passed as argument to concatenated code. ; // UMD (Universal Module Definition) // see https://github.com/umdjs/umd/blob/master/returnExports.js (function (root, factory) { + 'use strict'; + + /*global define, exports, module */ if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(factory); @@ -42,140 +45,144 @@ var ObjectPrototype = Object.prototype; var FunctionPrototype = Function.prototype; var StringPrototype = String.prototype; var NumberPrototype = Number.prototype; -var _Array_slice_ = ArrayPrototype.slice; +var array_slice = ArrayPrototype.slice; var array_splice = ArrayPrototype.splice; var array_push = ArrayPrototype.push; var array_unshift = ArrayPrototype.unshift; +var array_concat = ArrayPrototype.concat; var call = FunctionPrototype.call; -// Having a toString local variable name breaks in Opera so use _toString. -var _toString = ObjectPrototype.toString; +// Having a toString local variable name breaks in Opera so use to_string. +var to_string = ObjectPrototype.toString; -var isFunction = function (val) { - return ObjectPrototype.toString.call(val) === '[object Function]'; -}; -var isRegex = function (val) { - return ObjectPrototype.toString.call(val) === '[object RegExp]'; -}; -var isArray = function isArray(obj) { - return _toString.call(obj) === "[object Array]"; -}; -var isString = function isString(obj) { - return _toString.call(obj) === "[object String]"; +var isArray = Array.isArray || function isArray(obj) { + return to_string.call(obj) === '[object Array]'; }; + +var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; +var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; }; +var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; }; +var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; }; + var isArguments = function isArguments(value) { - var str = _toString.call(value); + var str = to_string.call(value); var isArgs = str === '[object Arguments]'; if (!isArgs) { - isArgs = !isArray(str) - && value !== null - && typeof value === 'object' - && typeof value.length === 'number' - && value.length >= 0 - && isFunction(value.callee); + isArgs = !isArray(value) && + value !== null && + typeof value === 'object' && + typeof value.length === 'number' && + value.length >= 0 && + isCallable(value.callee); } return isArgs; }; -var supportsDescriptors = Object.defineProperty && (function () { - try { - Object.defineProperty({}, 'x', {}); - return true; - } catch (e) { /* this is ES3 */ - return false; - } -}()); - -// Define configurable, writable and non-enumerable props -// if they don't exist. -var defineProperty; -if (supportsDescriptors) { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { return; } - Object.defineProperty(object, name, { - configurable: true, - enumerable: false, - writable: true, - value: method - }); - }; -} else { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { return; } - object[name] = method; - }; -} -var defineProperties = function (object, map, forceAssign) { - for (var name in map) { - if (ObjectPrototype.hasOwnProperty.call(map, name)) { - defineProperty(object, name, map[name], forceAssign); - } - } -}; +/* inlined from http://npmjs.com/define-properties */ +var defineProperties = (function (has) { + var supportsDescriptors = Object.defineProperty && (function () { + try { + var obj = {}; + Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); + for (var _ in obj) { return false; } + return obj.x === obj; + } catch (e) { /* this is ES3 */ + return false; + } + }()); + + // Define configurable, writable and non-enumerable props + // if they don't exist. + var defineProperty; + if (supportsDescriptors) { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + Object.defineProperty(object, name, { + configurable: true, + enumerable: false, + writable: true, + value: method + }); + }; + } else { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + object[name] = method; + }; + } + return function defineProperties(object, map, forceAssign) { + for (var name in map) { + if (has.call(map, name)) { + defineProperty(object, name, map[name], forceAssign); + } + } + }; +}(ObjectPrototype.hasOwnProperty)); // // Util // ====== // -// ES5 9.4 -// http://es5.github.com/#x9.4 -// http://jsperf.com/to-integer - -function toInteger(n) { - n = +n; - if (n !== n) { // isNaN - n = 0; - } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - return n; -} - -function isPrimitive(input) { +/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */ +var isPrimitive = function isPrimitive(input) { var type = typeof input; - return ( - input === null || - type === "undefined" || - type === "boolean" || - type === "number" || - type === "string" - ); -} + return input === null || (type !== 'object' && type !== 'function'); +}; -function toPrimitive(input) { - var val, valueOf, toStr; - if (isPrimitive(input)) { - return input; - } - valueOf = input.valueOf; - if (isFunction(valueOf)) { - val = valueOf.call(input); - if (isPrimitive(val)) { - return val; +var ES = { + // ES5 9.4 + // http://es5.github.com/#x9.4 + // http://jsperf.com/to-integer + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */ + ToInteger: function ToInteger(num) { + var n = +num; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); } - } - toStr = input.toString; - if (isFunction(toStr)) { - val = toStr.call(input); - if (isPrimitive(val)) { - return val; + return n; + }, + + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */ + ToPrimitive: function ToPrimitive(input) { + var val, valueOf, toStr; + if (isPrimitive(input)) { + return input; } - } - throw new TypeError(); -} + valueOf = input.valueOf; + if (isCallable(valueOf)) { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toStr = input.toString; + if (isCallable(toStr)) { + val = toStr.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); + }, + + // ES5 9.9 + // http://es5.github.com/#x9.9 + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */ + ToObject: function (o) { + /*jshint eqnull: true */ + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert " + o + ' to object'); + } + return Object(o); + }, -// ES5 9.9 -// http://es5.github.com/#x9.9 -var toObject = function (o) { - if (o == null) { // this matches both null and undefined - throw new TypeError("can't convert " + o + " to object"); + /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */ + ToUint32: function ToUint32(x) { + return x >>> 0; } - return Object(o); -}; - -var ToUint32 = function ToUint32(x) { - return x >>> 0; }; // @@ -186,20 +193,20 @@ var ToUint32 = function ToUint32(x) { // ES-5 15.3.4.5 // http://es5.github.com/#x15.3.4.5 -function Empty() {} +var Empty = function Empty() {}; defineProperties(FunctionPrototype, { bind: function bind(that) { // .length is 1 // 1. Let Target be the this value. var target = this; // 2. If IsCallable(Target) is false, throw a TypeError exception. - if (!isFunction(target)) { - throw new TypeError("Function.prototype.bind called on incompatible " + target); + if (!isCallable(target)) { + throw new TypeError('Function.prototype.bind called on incompatible ' + target); } // 3. Let A be a new (possibly empty) internal list of all of the // argument values provided after thisArg (arg1, arg2 etc), in order. // XXX slicedArgs will stand in for "A" if used - var args = _Array_slice_.call(arguments, 1); // for normal call + var args = array_slice.call(arguments, 1); // for normal call // 4. Let F be a new native ECMAScript object. // 11. Set the [[Prototype]] internal property of F to the standard // built-in Function prototype object as specified in 15.3.3.1. @@ -209,6 +216,7 @@ defineProperties(FunctionPrototype, { // 15.3.4.5.2. // 14. Set the [[HasInstance]] internal property of F as described in // 15.3.4.5.3. + var bound; var binder = function () { if (this instanceof bound) { @@ -230,7 +238,7 @@ defineProperties(FunctionPrototype, { var result = target.apply( this, - args.concat(_Array_slice_.call(arguments)) + array_concat.call(args, array_slice.call(arguments)) ); if (Object(result) === result) { return result; @@ -259,7 +267,7 @@ defineProperties(FunctionPrototype, { // equiv: target.call(this, ...boundArgs, ...args) return target.apply( that, - args.concat(_Array_slice_.call(arguments)) + array_concat.call(args, array_slice.call(arguments)) ); } @@ -278,7 +286,7 @@ defineProperties(FunctionPrototype, { // specified in 15.3.5.1. var boundArgs = []; for (var i = 0; i < boundLength; i++) { - boundArgs.push("$" + i); + boundArgs.push('$' + i); } // XXX Build a dynamic function with desired amount of arguments is the only @@ -287,7 +295,7 @@ defineProperties(FunctionPrototype, { // for ex.) all use of eval or Function costructor throws an exception. // However in all of these environments Function.prototype.bind exists // and so this code will never be executed. - var bound = Function("binder", "return function (" + boundArgs.join(",") + "){return binder.apply(this,arguments)}")(binder); + bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder); if (target.prototype) { Empty.prototype = target.prototype; @@ -325,19 +333,6 @@ defineProperties(FunctionPrototype, { // us it in defining shortcuts. var owns = call.bind(ObjectPrototype.hasOwnProperty); -// If JS engine supports accessors creating shortcuts. -var defineGetter; -var defineSetter; -var lookupGetter; -var lookupSetter; -var supportsAccessors; -if ((supportsAccessors = owns(ObjectPrototype, "__defineGetter__"))) { - defineGetter = call.bind(ObjectPrototype.__defineGetter__); - defineSetter = call.bind(ObjectPrototype.__defineSetter__); - lookupGetter = call.bind(ObjectPrototype.__lookupGetter__); - lookupSetter = call.bind(ObjectPrototype.__lookupSetter__); -} - // // Array // ===== @@ -359,7 +354,7 @@ defineProperties(ArrayPrototype, { return array_splice.apply(this, arguments); } } -}, spliceNoopReturnsEmptyArray); +}, !spliceNoopReturnsEmptyArray); var spliceWorksWithEmptyObject = (function () { var obj = {}; @@ -370,13 +365,13 @@ defineProperties(ArrayPrototype, { splice: function splice(start, deleteCount) { if (arguments.length === 0) { return []; } var args = arguments; - this.length = Math.max(toInteger(this.length), 0); + this.length = Math.max(ES.ToInteger(this.length), 0); if (arguments.length > 0 && typeof deleteCount !== 'number') { - args = _Array_slice_.call(arguments); + args = array_slice.call(arguments); if (args.length < 2) { args.push(this.length - start); } else { - args[1] = toInteger(deleteCount); + args[1] = ES.ToInteger(deleteCount); } } return array_splice.apply(this, args); @@ -419,8 +414,8 @@ defineProperties(Array, { isArray: isArray }); // Check failure of by-index access of string characters (IE < 9) // and failure of `0 in boxedString` (Rhino) -var boxedString = Object("a"); -var splitString = boxedString[0] !== "a" || !(0 in boxedString); +var boxedString = Object('a'); +var splitString = boxedString[0] !== 'a' || !(0 in boxedString); var properlyBoxesContext = function properlyBoxed(method) { // Check node 0.6.21 bug where third parameter is not boxed @@ -433,6 +428,7 @@ var properlyBoxesContext = function properlyBoxed(method) { method.call([1], function () { 'use strict'; + properlyBoxesStrict = typeof this === 'string'; }, 'x'); } @@ -440,24 +436,30 @@ var properlyBoxesContext = function properlyBoxed(method) { }; defineProperties(ArrayPrototype, { - forEach: function forEach(fun /*, thisp*/) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - thisp = arguments[1], - i = -1, - length = self.length >>> 0; + forEach: function forEach(callbackfn /*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var i = -1; + var length = self.length >>> 0; + var T; + if (arguments.length > 1) { + T = arguments[1]; + } // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(); // TODO message + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.forEach callback must be a function'); } while (++i < length) { if (i in self) { // Invoke the callback function with call, passing arguments: // context, property value, property key, thisArg object - // context - fun.call(thisp, self[i], i, object); + if (typeof T !== 'undefined') { + callbackfn.call(T, self[i], i, object); + } else { + callbackfn(self[i], i, object); + } } } } @@ -467,21 +469,28 @@ defineProperties(ArrayPrototype, { // http://es5.github.com/#x15.4.4.19 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map defineProperties(ArrayPrototype, { - map: function map(fun /*, thisp*/) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - length = self.length >>> 0, - result = Array(length), - thisp = arguments[1]; + map: function map(callbackfn/*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var length = self.length >>> 0; + var result = Array(length); + var T; + if (arguments.length > 1) { + T = arguments[1]; + } // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(fun + " is not a function"); + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.map callback must be a function'); } for (var i = 0; i < length; i++) { if (i in self) { - result[i] = fun.call(thisp, self[i], i, object); + if (typeof T !== 'undefined') { + result[i] = callbackfn.call(T, self[i], i, object); + } else { + result[i] = callbackfn(self[i], i, object); + } } } return result; @@ -492,23 +501,26 @@ defineProperties(ArrayPrototype, { // http://es5.github.com/#x15.4.4.20 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter defineProperties(ArrayPrototype, { - filter: function filter(fun /*, thisp */) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - length = self.length >>> 0, - result = [], - value, - thisp = arguments[1]; + filter: function filter(callbackfn /*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var length = self.length >>> 0; + var result = []; + var value; + var T; + if (arguments.length > 1) { + T = arguments[1]; + } // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(fun + " is not a function"); + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.filter callback must be a function'); } for (var i = 0; i < length; i++) { if (i in self) { value = self[i]; - if (fun.call(thisp, value, i, object)) { + if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) { result.push(value); } } @@ -521,19 +533,22 @@ defineProperties(ArrayPrototype, { // http://es5.github.com/#x15.4.4.16 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every defineProperties(ArrayPrototype, { - every: function every(fun /*, thisp */) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - length = self.length >>> 0, - thisp = arguments[1]; + every: function every(callbackfn /*, thisArg*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var length = self.length >>> 0; + var T; + if (arguments.length > 1) { + T = arguments[1]; + } // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(fun + " is not a function"); + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.every callback must be a function'); } for (var i = 0; i < length; i++) { - if (i in self && !fun.call(thisp, self[i], i, object)) { + if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { return false; } } @@ -545,19 +560,22 @@ defineProperties(ArrayPrototype, { // http://es5.github.com/#x15.4.4.17 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some defineProperties(ArrayPrototype, { - some: function some(fun /*, thisp */) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - length = self.length >>> 0, - thisp = arguments[1]; + some: function some(callbackfn/*, thisArg */) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var length = self.length >>> 0; + var T; + if (arguments.length > 1) { + T = arguments[1]; + } // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(fun + " is not a function"); + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.some callback must be a function'); } for (var i = 0; i < length; i++) { - if (i in self && fun.call(thisp, self[i], i, object)) { + if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { return true; } } @@ -573,19 +591,19 @@ if (ArrayPrototype.reduce) { reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object'; } defineProperties(ArrayPrototype, { - reduce: function reduce(fun /*, initial*/) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - length = self.length >>> 0; + reduce: function reduce(callbackfn /*, initialValue*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var length = self.length >>> 0; // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(fun + " is not a function"); + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.reduce callback must be a function'); } // no value to return if no initial value and an empty array - if (!length && arguments.length === 1) { - throw new TypeError("reduce of empty array with no initial value"); + if (length === 0 && arguments.length === 1) { + throw new TypeError('reduce of empty array with no initial value'); } var i = 0; @@ -601,14 +619,14 @@ defineProperties(ArrayPrototype, { // if array contains no values, no initial value to return if (++i >= length) { - throw new TypeError("reduce of empty array with no initial value"); + throw new TypeError('reduce of empty array with no initial value'); } } while (true); } for (; i < length; i++) { if (i in self) { - result = fun.call(void 0, result, self[i], i, object); + result = callbackfn(result, self[i], i, object); } } @@ -624,22 +642,23 @@ if (ArrayPrototype.reduceRight) { reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object'; } defineProperties(ArrayPrototype, { - reduceRight: function reduceRight(fun /*, initial*/) { - var object = toObject(this), - self = splitString && isString(this) ? this.split('') : object, - length = self.length >>> 0; + reduceRight: function reduceRight(callbackfn/*, initial*/) { + var object = ES.ToObject(this); + var self = splitString && isString(this) ? this.split('') : object; + var length = self.length >>> 0; // If no callback function or if callback is not a callable function - if (!isFunction(fun)) { - throw new TypeError(fun + " is not a function"); + if (!isCallable(callbackfn)) { + throw new TypeError('Array.prototype.reduceRight callback must be a function'); } // no value to return if no initial value, empty array - if (!length && arguments.length === 1) { - throw new TypeError("reduceRight of empty array with no initial value"); + if (length === 0 && arguments.length === 1) { + throw new TypeError('reduceRight of empty array with no initial value'); } - var result, i = length - 1; + var result; + var i = length - 1; if (arguments.length >= 2) { result = arguments[1]; } else { @@ -651,7 +670,7 @@ defineProperties(ArrayPrototype, { // if array contains no values, no initial value to return if (--i < 0) { - throw new TypeError("reduceRight of empty array with no initial value"); + throw new TypeError('reduceRight of empty array with no initial value'); } } while (true); } @@ -662,7 +681,7 @@ defineProperties(ArrayPrototype, { do { if (i in self) { - result = fun.call(void 0, result, self[i], i, object); + result = callbackfn(result, self[i], i, object); } } while (i--); @@ -675,23 +694,23 @@ defineProperties(ArrayPrototype, { // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1; defineProperties(ArrayPrototype, { - indexOf: function indexOf(sought /*, fromIndex */ ) { - var self = splitString && isString(this) ? this.split('') : toObject(this), - length = self.length >>> 0; + indexOf: function indexOf(searchElement /*, fromIndex */) { + var self = splitString && isString(this) ? this.split('') : ES.ToObject(this); + var length = self.length >>> 0; - if (!length) { + if (length === 0) { return -1; } var i = 0; if (arguments.length > 1) { - i = toInteger(arguments[1]); + i = ES.ToInteger(arguments[1]); } // handle negative indices i = i >= 0 ? i : Math.max(0, length + i); for (; i < length; i++) { - if (i in self && self[i] === sought) { + if (i in self && self[i] === searchElement) { return i; } } @@ -704,21 +723,21 @@ defineProperties(ArrayPrototype, { // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf var hasFirefox2LastIndexOfBug = Array.prototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1; defineProperties(ArrayPrototype, { - lastIndexOf: function lastIndexOf(sought /*, fromIndex */) { - var self = splitString && isString(this) ? this.split('') : toObject(this), - length = self.length >>> 0; + lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) { + var self = splitString && isString(this) ? this.split('') : ES.ToObject(this); + var length = self.length >>> 0; - if (!length) { + if (length === 0) { return -1; } var i = length - 1; if (arguments.length > 1) { - i = Math.min(i, toInteger(arguments[1])); + i = Math.min(i, ES.ToInteger(arguments[1])); } // handle negative indices i = i >= 0 ? i : length - Math.abs(i); for (; i >= 0; i--) { - if (i in self && sought === self[i]) { + if (i in self && searchElement === self[i]) { return i; } } @@ -735,37 +754,40 @@ defineProperties(ArrayPrototype, { // http://es5.github.com/#x15.2.3.14 // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation -var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'), - hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'), +var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString'), + hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'), + hasStringEnumBug = !owns('x', '0'), dontEnums = [ - "toString", - "toLocaleString", - "valueOf", - "hasOwnProperty", - "isPrototypeOf", - "propertyIsEnumerable", - "constructor" + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' ], dontEnumsLength = dontEnums.length; defineProperties(Object, { keys: function keys(object) { - var isFn = isFunction(object), + var isFn = isCallable(object), isArgs = isArguments(object), isObject = object !== null && typeof object === 'object', isStr = isObject && isString(object); if (!isObject && !isFn && !isArgs) { - throw new TypeError("Object.keys called on a non-object"); + throw new TypeError('Object.keys called on a non-object'); } var theKeys = []; var skipProto = hasProtoEnumBug && isFn; - if (isStr || isArgs) { + if ((isStr && hasStringEnumBug) || isArgs) { for (var i = 0; i < object.length; ++i) { theKeys.push(String(i)); } - } else { + } + + if (!isArgs) { for (var name in object) { if (!(skipProto && name === 'prototype') && owns(object, name)) { theKeys.push(String(name)); @@ -815,14 +837,14 @@ defineProperties(Object, { // The time zone is always UTC, denoted by the suffix Z. If the time value of // this object is not a finite Number a RangeError exception is thrown. var negativeDate = -62198755200000; -var negativeYearString = "-000001"; +var negativeYearString = '-000001'; var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; defineProperties(Date.prototype, { toISOString: function toISOString() { var result, length, value, year, month; if (!isFinite(this)) { - throw new RangeError("Date.prototype.toISOString called on non-finite value."); + throw new RangeError('Date.prototype.toISOString called on non-finite value.'); } year = this.getUTCFullYear(); @@ -835,8 +857,8 @@ defineProperties(Date.prototype, { // the date time string format is specified in 15.9.1.15. result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()]; year = ( - (year < 0 ? "-" : (year > 9999 ? "+" : "")) + - ("00000" + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6) + (year < 0 ? '-' : (year > 9999 ? '+' : '')) + + ('00000' + Math.abs(year)).slice((0 <= year && year <= 9999) ? -4 : -6) ); length = result.length; @@ -845,37 +867,34 @@ defineProperties(Date.prototype, { // pad months, days, hours, minutes, and seconds to have two // digits. if (value < 10) { - result[length] = "0" + value; + result[length] = '0' + value; } } // pad milliseconds to have three digits. return ( - year + "-" + result.slice(0, 2).join("-") + - "T" + result.slice(2).join(":") + "." + - ("000" + this.getUTCMilliseconds()).slice(-3) + "Z" + year + '-' + result.slice(0, 2).join('-') + + 'T' + result.slice(2).join(':') + '.' + + ('000' + this.getUTCMilliseconds()).slice(-3) + 'Z' ); } }, hasNegativeDateBug); - // ES5 15.9.5.44 // http://es5.github.com/#x15.9.5.44 // This function provides a String representation of a Date object for use by // JSON.stringify (15.12.3). -var dateToJSONIsSupported = false; -try { - dateToJSONIsSupported = ( - Date.prototype.toJSON && - new Date(NaN).toJSON() === null && - new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && - Date.prototype.toJSON.call({ // generic - toISOString: function () { - return true; - } - }) - ); -} catch (e) { -} +var dateToJSONIsSupported = (function () { + try { + return Date.prototype.toJSON && + new Date(NaN).toJSON() === null && + new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && + Date.prototype.toJSON.call({ // generic + toISOString: function () { return true; } + }); + } catch (e) { + return false; + } +}()); if (!dateToJSONIsSupported) { Date.prototype.toJSON = function toJSON(key) { // When the toJSON method is called with argument key, the following @@ -883,24 +902,23 @@ if (!dateToJSONIsSupported) { // 1. Let O be the result of calling ToObject, giving it the this // value as its argument. - // 2. Let tv be toPrimitive(O, hint Number). - var o = Object(this), - tv = toPrimitive(o), - toISO; + // 2. Let tv be ES.ToPrimitive(O, hint Number). + var O = Object(this); + var tv = ES.ToPrimitive(O); // 3. If tv is a Number and is not finite, return null. - if (typeof tv === "number" && !isFinite(tv)) { + if (typeof tv === 'number' && !isFinite(tv)) { return null; } // 4. Let toISO be the result of calling the [[Get]] internal method of // O with argument "toISOString". - toISO = o.toISOString; + var toISO = O.toISOString; // 5. If IsCallable(toISO) is false, throw a TypeError exception. - if (typeof toISO !== "function") { - throw new TypeError("toISOString property is not callable"); + if (!isCallable(toISO)) { + throw new TypeError('toISOString property is not callable'); } // 6. Return the result of calling the [[Call]] internal method of // toISO with O as the this value and an empty argument list. - return toISO.call(o); + return toISO.call(O); // NOTE 1 The argument is ignored. @@ -918,20 +936,23 @@ if (!dateToJSONIsSupported) { // based on work shared by Daniel Friesen (dantman) // http://gist.github.com/303249 var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15; -var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')); -var doesNotParseY2KNewYear = isNaN(Date.parse("2000-01-01T00:00:00.000Z")); +var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z')); +var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z')); if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) { // XXX global assignment won't work in embeddings that use // an alternate object for the context. + /*global Date: true */ + /*eslint-disable no-undef*/ Date = (function (NativeDate) { - + /*eslint-enable no-undef*/ // Date.length === 7 - function Date(Y, M, D, h, m, s, ms) { + var DateShim = function Date(Y, M, D, h, m, s, ms) { var length = arguments.length; + var date; if (this instanceof NativeDate) { - var date = length === 1 && String(Y) === Y ? // isString(Y) + date = length === 1 && String(Y) === Y ? // isString(Y) // We explicitly pass it through parse: - new NativeDate(Date.parse(Y)) : + new NativeDate(DateShim.parse(Y)) : // We have to manually make calls depending on argument // length here length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) : @@ -942,41 +963,40 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt length >= 2 ? new NativeDate(Y, M) : length >= 1 ? new NativeDate(Y) : new NativeDate(); - // Prevent mixups with unfixed Date object - date.constructor = Date; - return date; + } else { + date = NativeDate.apply(this, arguments); } - return NativeDate.apply(this, arguments); - } + // Prevent mixups with unfixed Date object + defineProperties(date, { constructor: DateShim }, true); + return date; + }; // 15.9.1.15 Date Time String Format. - var isoDateExpression = new RegExp("^" + - "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + + var isoDateExpression = new RegExp('^' + + '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign + // 6-digit extended year - "(?:-(\\d{2})" + // optional month capture - "(?:-(\\d{2})" + // optional day capture - "(?:" + // capture hours:minutes:seconds.milliseconds - "T(\\d{2})" + // hours capture - ":(\\d{2})" + // minutes capture - "(?:" + // optional :seconds.milliseconds - ":(\\d{2})" + // seconds capture - "(?:(\\.\\d{1,}))?" + // milliseconds capture - ")?" + - "(" + // capture UTC offset component - "Z|" + // UTC capture - "(?:" + // offset specifier +/-hours:minutes - "([-+])" + // sign capture - "(\\d{2})" + // hours offset capture - ":(\\d{2})" + // minutes offset capture - ")" + - ")?)?)?)?" + - "$"); - - var months = [ - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 - ]; - - function dayFromMonth(year, month) { + '(?:-(\\d{2})' + // optional month capture + '(?:-(\\d{2})' + // optional day capture + '(?:' + // capture hours:minutes:seconds.milliseconds + 'T(\\d{2})' + // hours capture + ':(\\d{2})' + // minutes capture + '(?:' + // optional :seconds.milliseconds + ':(\\d{2})' + // seconds capture + '(?:(\\.\\d{1,}))?' + // milliseconds capture + ')?' + + '(' + // capture UTC offset component + 'Z|' + // UTC capture + '(?:' + // offset specifier +/-hours:minutes + '([-+])' + // sign capture + '(\\d{2})' + // hours offset capture + ':(\\d{2})' + // minutes offset capture + ')' + + ')?)?)?)?' + + '$'); + + var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; + + var dayFromMonth = function dayFromMonth(year, month) { var t = month > 1 ? 1 : 0; return ( months[month] + @@ -985,25 +1005,31 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt Math.floor((year - 1601 + t) / 400) + 365 * (year - 1970) ); - } + }; - function toUTC(t) { + var toUTC = function toUTC(t) { return Number(new NativeDate(1970, 0, 1, 0, 0, 0, t)); - } + }; // Copy any custom methods a 3rd party library may have added for (var key in NativeDate) { - Date[key] = NativeDate[key]; + if (owns(NativeDate, key)) { + DateShim[key] = NativeDate[key]; + } } // Copy "native" methods explicitly; they may be non-enumerable - Date.now = NativeDate.now; - Date.UTC = NativeDate.UTC; - Date.prototype = NativeDate.prototype; - Date.prototype.constructor = Date; + defineProperties(DateShim, { + now: NativeDate.now, + UTC: NativeDate.UTC + }, true); + DateShim.prototype = NativeDate.prototype; + defineProperties(DateShim.prototype, { + constructor: DateShim + }, true); // Upgrade Date.parse to handle simplified ISO 8601 strings - Date.parse = function parse(string) { + DateShim.parse = function parse(string) { var match = isoDateExpression.exec(string); if (match) { // parse months, days, hours, minutes, seconds, and milliseconds @@ -1020,7 +1046,7 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt // (ES 5.1 bug) // see https://bugs.ecmascript.org/show_bug.cgi?id=112 isLocalTime = Boolean(match[4] && !match[8]), - signOffset = match[9] === "-" ? 1 : -1, + signOffset = match[9] === '-' ? 1 : -1, hourOffset = Number(match[10] || 0), minuteOffset = Number(match[11] || 0), result; @@ -1059,8 +1085,9 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt return NativeDate.parse.apply(this, arguments); }; - return Date; - })(Date); + return DateShim; + }(Date)); + /*global Date: false */ } // ES5 15.9.4.4 @@ -1071,7 +1098,6 @@ if (!Date.now) { }; } - // // Number // ====== @@ -1080,10 +1106,10 @@ if (!Date.now) { // ES5.1 15.7.4.5 // http://es5.github.com/#x15.7.4.5 var hasToFixedBugs = NumberPrototype.toFixed && ( - (0.00008).toFixed(3) !== '0.000' - || (0.9).toFixed(0) !== '1' - || (1.255).toFixed(2) !== '1.25' - || (1000000000000000128).toFixed(0) !== "1000000000000000128" + (0.00008).toFixed(3) !== '0.000' || + (0.9).toFixed(0) !== '1' || + (1.255).toFixed(2) !== '1.25' || + (1000000000000000128).toFixed(0) !== '1000000000000000128' ); var toFixedHelpers = { @@ -1092,10 +1118,11 @@ var toFixedHelpers = { data: [0, 0, 0, 0, 0, 0], multiply: function multiply(n, c) { var i = -1; + var c2 = c; while (++i < toFixedHelpers.size) { - c += n * toFixedHelpers.data[i]; - toFixedHelpers.data[i] = c % toFixedHelpers.base; - c = Math.floor(c / toFixedHelpers.base); + c2 += n * toFixedHelpers.data[i]; + toFixedHelpers.data[i] = c2 % toFixedHelpers.base; + c2 = Math.floor(c2 / toFixedHelpers.base); } }, divide: function divide(n) { @@ -1126,13 +1153,14 @@ var toFixedHelpers = { }, log: function log(x) { var n = 0; - while (x >= 4096) { + var x2 = x; + while (x2 >= 4096) { n += 12; - x /= 4096; + x2 /= 4096; } - while (x >= 2) { + while (x2 >= 2) { n += 1; - x /= 2; + x2 /= 2; } return n; } @@ -1147,14 +1175,14 @@ defineProperties(NumberPrototype, { f = f !== f ? 0 : Math.floor(f); if (f < 0 || f > 20) { - throw new RangeError("Number.toFixed called with invalid number of decimals"); + throw new RangeError('Number.toFixed called with invalid number of decimals'); } x = Number(this); // Test for NaN if (x !== x) { - return "NaN"; + return 'NaN'; } // If it is too big or small, return the string value of the number @@ -1162,14 +1190,14 @@ defineProperties(NumberPrototype, { return String(x); } - s = ""; + s = ''; if (x < 0) { - s = "-"; + s = '-'; x = -x; } - m = "0"; + m = '0'; if (x > 1e-21) { // 1e-21 < x < 1e21 @@ -1225,7 +1253,6 @@ defineProperties(NumberPrototype, { } }, hasToFixedBugs); - // // String // ====== @@ -1250,38 +1277,38 @@ var string_split = StringPrototype.split; if ( 'ab'.split(/(?:ab)*/).length !== 2 || '.'.split(/(.?)(.?)/).length !== 4 || - 'tesst'.split(/(s)*/)[1] === "t" || + 'tesst'.split(/(s)*/)[1] === 't' || 'test'.split(/(?:)/, -1).length !== 4 || ''.split(/.?/).length || '.'.split(/()()/).length > 1 ) { (function () { - var compliantExecNpcg = /()??/.exec("")[1] === void 0; // NPCG: nonparticipating capturing group + var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group StringPrototype.split = function (separator, limit) { var string = this; - if (separator === void 0 && limit === 0) { + if (typeof separator === 'undefined' && limit === 0) { return []; } // If `separator` is not a regex, use native split - if (_toString.call(separator) !== "[object RegExp]") { + if (!isRegex(separator)) { return string_split.call(this, separator, limit); } - var output = [], - flags = (separator.ignoreCase ? "i" : "") + - (separator.multiline ? "m" : "") + - (separator.extended ? "x" : "") + // Proposed for ES6 - (separator.sticky ? "y" : ""), // Firefox 3+ + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.extended ? 'x' : '') + // Proposed for ES6 + (separator.sticky ? 'y' : ''), // Firefox 3+ lastLastIndex = 0, // Make `global` and avoid `lastIndex` issues by working with a copy separator2, match, lastIndex, lastLength; - separator = new RegExp(separator.source, flags + "g"); - string += ""; // Type-convert + var separatorCopy = new RegExp(separator.source, flags + 'g'); + string += ''; // Type-convert if (!compliantExecNpcg) { // Doesn't need flags gy, but they don't hurt - separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); + separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags); } /* Values for `limit`, per the spec: * If undefined: 4294967295 // Math.pow(2, 32) - 1 @@ -1290,46 +1317,50 @@ if ( * If negative number: 4294967296 - Math.floor(Math.abs(limit)) * If other: Type-convert, then use the above rules */ - limit = limit === void 0 ? + var splitLimit = typeof limit === 'undefined' ? -1 >>> 0 : // Math.pow(2, 32) - 1 - ToUint32(limit); - while (match = separator.exec(string)) { - // `separator.lastIndex` is not reliable cross-browser + ES.ToUint32(limit); + match = separatorCopy.exec(string); + while (match) { + // `separatorCopy.lastIndex` is not reliable cross-browser lastIndex = match.index + match[0].length; if (lastIndex > lastLastIndex) { output.push(string.slice(lastLastIndex, match.index)); // Fix browsers whose `exec` methods don't consistently return `undefined` for // nonparticipating capturing groups if (!compliantExecNpcg && match.length > 1) { + /*eslint-disable no-loop-func */ match[0].replace(separator2, function () { for (var i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === void 0) { + if (typeof arguments[i] === 'undefined') { match[i] = void 0; } } }); + /*eslint-enable no-loop-func */ } if (match.length > 1 && match.index < string.length) { - ArrayPrototype.push.apply(output, match.slice(1)); + array_push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = lastIndex; - if (output.length >= limit) { + if (output.length >= splitLimit) { break; } } - if (separator.lastIndex === match.index) { - separator.lastIndex++; // Avoid an infinite loop + if (separatorCopy.lastIndex === match.index) { + separatorCopy.lastIndex++; // Avoid an infinite loop } + match = separatorCopy.exec(string); } if (lastLastIndex === string.length) { - if (lastLength || !separator.test("")) { - output.push(""); + if (lastLength || !separatorCopy.test('')) { + output.push(''); } } else { output.push(string.slice(lastLastIndex)); } - return output.length > limit ? output.slice(0, limit) : output; + return output.length > splitLimit ? output.slice(0, splitLimit) : output; }; }()); @@ -1339,9 +1370,9 @@ if ( // then the output array is truncated so that it contains no more than limit // elements. // "0".split(undefined, 0) -> [] -} else if ("0".split(void 0, 0).length) { +} else if ('0'.split(void 0, 0).length) { StringPrototype.split = function split(separator, limit) { - if (separator === void 0 && limit === 0) { return []; } + if (typeof separator === 'undefined' && limit === 0) { return []; } return string_split.call(this, separator, limit); }; } @@ -1357,7 +1388,7 @@ var replaceReportsGroupsCorrectly = (function () { if (!replaceReportsGroupsCorrectly) { StringPrototype.replace = function replace(searchValue, replaceValue) { - var isFn = isFunction(replaceValue); + var isFn = isCallable(replaceValue); var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source); if (!isFn || !hasCapturingGroups) { return str_replace.call(this, searchValue, replaceValue); @@ -1366,7 +1397,7 @@ if (!replaceReportsGroupsCorrectly) { var length = arguments.length; var originalLastIndex = searchValue.lastIndex; searchValue.lastIndex = 0; - var args = searchValue.exec(match); + var args = searchValue.exec(match) || []; searchValue.lastIndex = originalLastIndex; args.push(arguments[length - 2], arguments[length - 1]); return replaceValue.apply(this, args); @@ -1382,48 +1413,47 @@ if (!replaceReportsGroupsCorrectly) { // normalized across all browsers // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE var string_substr = StringPrototype.substr; -var hasNegativeSubstrBug = "".substr && "0b".substr(-1) !== "b"; +var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; defineProperties(StringPrototype, { substr: function substr(start, length) { - return string_substr.call( - this, - start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start, - length - ); + var normalizedStart = start; + if (start < 0) { + normalizedStart = Math.max(this.length + start, 0); + } + return string_substr.call(this, normalizedStart, length); } }, hasNegativeSubstrBug); // ES5 15.5.4.20 // whitespace from: http://es5.github.io/#x15.5.4.20 -var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + - "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + - "\u2029\uFEFF"; +var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + + '\u2029\uFEFF'; var zeroWidth = '\u200b'; -var wsRegexChars = "[" + ws + "]"; -var trimBeginRegexp = new RegExp("^" + wsRegexChars + wsRegexChars + "*"); -var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + "*$"); +var wsRegexChars = '[' + ws + ']'; +var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*'); +var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$'); var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim()); defineProperties(StringPrototype, { // http://blog.stevenlevithan.com/archives/faster-trim-javascript // http://perfectionkills.com/whitespace-deviations/ trim: function trim() { - if (this === void 0 || this === null) { - throw new TypeError("can't convert " + this + " to object"); + if (typeof this === 'undefined' || this === null) { + throw new TypeError("can't convert " + this + ' to object'); } - return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + return String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, ''); } }, hasTrimWhitespaceBug); // ES-5 15.1.2.2 if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) { + /*global parseInt: true */ parseInt = (function (origParseInt) { var hexRegex = /^0[xX]/; - return function parseIntES5(str, radix) { - str = String(str).trim(); - if (!Number(radix)) { - radix = hexRegex.test(str) ? 16 : 10; - } - return origParseInt(str, radix); + return function parseInt(str, radix) { + var string = String(str).trim(); + var defaultedRadix = Number(radix) || (hexRegex.test(string) ? 16 : 10); + return origParseInt(string, defaultedRadix); }; }(parseInt)); } |