summaryrefslogtreecommitdiff
path: root/resources/lib/es5-shim/es5-shim.js
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2016-05-01 15:32:59 -0400
committerLuke Shumaker <lukeshu@sbcglobal.net>2016-05-01 15:32:59 -0400
commit6dc1997577fab2c366781fd7048144935afa0012 (patch)
tree8918d28c7ab4342f0738985e37af1dfc42d0e93a /resources/lib/es5-shim/es5-shim.js
parent150f94f051128f367bc89f6b7e5f57eb2a69fc62 (diff)
parentfa89acd685cb09cdbe1c64cbb721ec64975bbbc1 (diff)
Merge commit 'fa89acd'
# Conflicts: # .gitignore # extensions/ArchInterWiki.sql
Diffstat (limited to 'resources/lib/es5-shim/es5-shim.js')
-rw-r--r--resources/lib/es5-shim/es5-shim.js782
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));
}