es5-shim-rails 2.0.5.1 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/README.md +2 -2
- data/lib/es5-shim-rails/version.rb +1 -1
- data/vendor/assets/javascripts/es5-shim/shims/es5-sham.js +124 -40
- data/vendor/assets/javascripts/es5-shim/shims/es5-sham.min.js +7 -7
- data/vendor/assets/javascripts/es5-shim/shims/es5-shim.js +742 -292
- data/vendor/assets/javascripts/es5-shim/shims/es5-shim.min.js +7 -17
- metadata +6 -13
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZWVlZGM0ODM4MGM3MjVkYjcwNzE0NWIxZTQ1NDg1MjlhMmIyNzU4Zg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YjMzNGJhZGVhNGQ1MzVlZTJjNDg2MWNjMGRjNzAzM2FjZTdlMzI0Mw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzU5YWJiYzIwYjE0NzM4ZjE1YTYzMDhlOTRkN2NiOTM0OGUyNWEyNTc1OGQ1
|
10
|
+
NmNkYjQxYzNmODZlNjlhMzcyYjFkNmMwYmYyMjJjM2MxMTliNWNmZjQ1NzU0
|
11
|
+
ODdmYjQxNjQzOTBjNWY4NjQzNTlkYzczZTBlZmY2ZDgzNDg5YzY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZWNlNzM2ZDE4M2Y5NjIzYTRmNGM3NDNjOWZhMGEwMTc5OWRkMmY1OWEzOTA5
|
14
|
+
ZmNmMGFjNDhkNjFkNTYwZDU0NDQ1MmFmNmRkYzY2MWM1OTIxN2U5MjcyYWYz
|
15
|
+
ZDdlZTAyOWMxMzg5ZTYwNWE1OWM4MGRlZjlmYTA3MzI0YzY3ZjU=
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# es5-shim asset gem for Rails
|
2
2
|
|
3
|
-
This asset gem packages [es5-shim](https://github.com/
|
3
|
+
This asset gem packages [es5-shim](https://github.com/es-shims/es5-shim) for the Rails asset pipeline.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -37,7 +37,7 @@ Add one of the folllwing lines to your application.js manifest:
|
|
37
37
|
|
38
38
|
```
|
39
39
|
|
40
|
-
Currently this version tracks es5-shim
|
40
|
+
Currently this version tracks es5-shim 4.0.1 [commit 734e4dd](https://github.com/msievers/es5-shim-rails/commit/734e4dd80a1e4cbbd3bb6947c79084e86cb1793b).
|
41
41
|
|
42
42
|
## Contributing
|
43
43
|
|
@@ -1,44 +1,114 @@
|
|
1
|
-
|
1
|
+
/*!
|
2
|
+
* https://github.com/es-shims/es5-shim
|
3
|
+
* @license es5-shim Copyright 2009-2014 by contributors, MIT License
|
4
|
+
* see https://github.com/es-shims/es5-shim/blob/master/LICENSE
|
5
|
+
*/
|
6
|
+
|
2
7
|
// vim: ts=4 sts=4 sw=4 expandtab
|
3
8
|
|
4
|
-
//
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
//Add semicolon to prevent IIFE from being passed as argument to concated code.
|
10
|
+
;
|
11
|
+
|
12
|
+
// UMD (Universal Module Definition)
|
13
|
+
// see https://github.com/umdjs/umd/blob/master/returnExports.js
|
14
|
+
(function (root, factory) {
|
15
|
+
if (typeof define === 'function' && define.amd) {
|
16
|
+
// AMD. Register as an anonymous module.
|
17
|
+
define(factory);
|
18
|
+
} else if (typeof exports === 'object') {
|
19
|
+
// Node. Does not work with strict CommonJS, but
|
20
|
+
// only CommonJS-like enviroments that support module.exports,
|
21
|
+
// like Node.
|
22
|
+
module.exports = factory();
|
13
23
|
} else {
|
14
|
-
|
15
|
-
|
16
|
-
}
|
24
|
+
// Browser globals (root is window)
|
25
|
+
root.returnExports = factory();
|
26
|
+
}
|
27
|
+
}(this, function () {
|
28
|
+
|
29
|
+
var call = Function.prototype.call;
|
30
|
+
var prototypeOfObject = Object.prototype;
|
31
|
+
var owns = call.bind(prototypeOfObject.hasOwnProperty);
|
32
|
+
|
33
|
+
// If JS engine supports accessors creating shortcuts.
|
34
|
+
var defineGetter;
|
35
|
+
var defineSetter;
|
36
|
+
var lookupGetter;
|
37
|
+
var lookupSetter;
|
38
|
+
var supportsAccessors = owns(prototypeOfObject, "__defineGetter__");
|
39
|
+
if (supportsAccessors) {
|
40
|
+
defineGetter = call.bind(prototypeOfObject.__defineGetter__);
|
41
|
+
defineSetter = call.bind(prototypeOfObject.__defineSetter__);
|
42
|
+
lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);
|
43
|
+
lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);
|
44
|
+
}
|
17
45
|
|
18
46
|
// ES5 15.2.3.2
|
19
47
|
// http://es5.github.com/#x15.2.3.2
|
20
48
|
if (!Object.getPrototypeOf) {
|
21
|
-
// https://github.com/
|
49
|
+
// https://github.com/es-shims/es5-shim/issues#issue/2
|
22
50
|
// http://ejohn.org/blog/objectgetprototypeof/
|
23
51
|
// recommended by fschaefer on github
|
52
|
+
//
|
53
|
+
// sure, and webreflection says ^_^
|
54
|
+
// ... this will nerever possibly return null
|
55
|
+
// ... Opera Mini breaks here with infinite loops
|
24
56
|
Object.getPrototypeOf = function getPrototypeOf(object) {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
57
|
+
var proto = object.__proto__;
|
58
|
+
if (proto || proto === null) {
|
59
|
+
return proto;
|
60
|
+
} else if (object.constructor) {
|
61
|
+
return object.constructor.prototype;
|
62
|
+
} else {
|
63
|
+
return prototypeOfObject;
|
64
|
+
}
|
30
65
|
};
|
31
66
|
}
|
32
67
|
|
33
|
-
//
|
34
|
-
//
|
35
|
-
|
68
|
+
//ES5 15.2.3.3
|
69
|
+
//http://es5.github.com/#x15.2.3.3
|
70
|
+
|
71
|
+
function doesGetOwnPropertyDescriptorWork(object) {
|
72
|
+
try {
|
73
|
+
object.sentinel = 0;
|
74
|
+
return Object.getOwnPropertyDescriptor(
|
75
|
+
object,
|
76
|
+
"sentinel"
|
77
|
+
).value === 0;
|
78
|
+
} catch (exception) {
|
79
|
+
// returns falsy
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
//check whether getOwnPropertyDescriptor works if it's given. Otherwise,
|
84
|
+
//shim partially.
|
85
|
+
if (Object.defineProperty) {
|
86
|
+
var getOwnPropertyDescriptorWorksOnObject = doesGetOwnPropertyDescriptorWork({});
|
87
|
+
var getOwnPropertyDescriptorWorksOnDom = typeof document === "undefined" ||
|
88
|
+
doesGetOwnPropertyDescriptorWork(document.createElement("div"));
|
89
|
+
if (!getOwnPropertyDescriptorWorksOnDom || !getOwnPropertyDescriptorWorksOnObject) {
|
90
|
+
var getOwnPropertyDescriptorFallback = Object.getOwnPropertyDescriptor;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
if (!Object.getOwnPropertyDescriptor || getOwnPropertyDescriptorFallback) {
|
36
95
|
var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a non-object: ";
|
37
96
|
|
38
97
|
Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {
|
39
|
-
if ((typeof object
|
98
|
+
if ((typeof object !== "object" && typeof object !== "function") || object === null) {
|
40
99
|
throw new TypeError(ERR_NON_OBJECT + object);
|
41
100
|
}
|
101
|
+
|
102
|
+
// make a valiant attempt to use the real getOwnPropertyDescriptor
|
103
|
+
// for I8's DOM elements.
|
104
|
+
if (getOwnPropertyDescriptorFallback) {
|
105
|
+
try {
|
106
|
+
return getOwnPropertyDescriptorFallback.call(Object, object, property);
|
107
|
+
} catch (exception) {
|
108
|
+
// try the shim if the real one doesn't work
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
42
112
|
// If object does not owns property return undefined immediately.
|
43
113
|
if (!owns(object, property)) {
|
44
114
|
return;
|
@@ -57,13 +127,21 @@ if (!Object.getOwnPropertyDescriptor) {
|
|
57
127
|
// `__proto__` so that `__lookupGetter__` will return getter only
|
58
128
|
// if it's owned by an object.
|
59
129
|
var prototype = object.__proto__;
|
60
|
-
|
130
|
+
var notPrototypeOfObject = object !== prototypeOfObject;
|
131
|
+
// avoid recursion problem, breaking in Opera Mini when
|
132
|
+
// Object.getOwnPropertyDescriptor(Object.prototype, 'toString')
|
133
|
+
// or any other Object.prototype accessor
|
134
|
+
if (notPrototypeOfObject) {
|
135
|
+
object.__proto__ = prototypeOfObject;
|
136
|
+
}
|
61
137
|
|
62
138
|
var getter = lookupGetter(object, property);
|
63
139
|
var setter = lookupSetter(object, property);
|
64
140
|
|
65
|
-
|
66
|
-
|
141
|
+
if (notPrototypeOfObject) {
|
142
|
+
// Once we have getter and setter we can put values back.
|
143
|
+
object.__proto__ = prototype;
|
144
|
+
}
|
67
145
|
|
68
146
|
if (getter || setter) {
|
69
147
|
if (getter) {
|
@@ -81,6 +159,7 @@ if (!Object.getOwnPropertyDescriptor) {
|
|
81
159
|
// If we got this far we know that object has an own property that is
|
82
160
|
// not an accessor so we set it as a value and return descriptor.
|
83
161
|
descriptor.value = object[property];
|
162
|
+
descriptor.writable = true;
|
84
163
|
return descriptor;
|
85
164
|
};
|
86
165
|
}
|
@@ -99,8 +178,11 @@ if (!Object.create) {
|
|
99
178
|
|
100
179
|
// Contributed by Brandon Benvie, October, 2012
|
101
180
|
var createEmpty;
|
102
|
-
var supportsProto =
|
103
|
-
|
181
|
+
var supportsProto = !({__proto__:null} instanceof Object);
|
182
|
+
// the following produces false positives
|
183
|
+
// in Opera Mini => not a reliable check
|
184
|
+
// Object.prototype.__proto__ === null
|
185
|
+
if (supportsProto || typeof document === 'undefined') {
|
104
186
|
createEmpty = function () {
|
105
187
|
return { "__proto__": null };
|
106
188
|
};
|
@@ -110,7 +192,7 @@ if (!Object.create) {
|
|
110
192
|
// aside from Object.prototype itself. Instead, create a new global
|
111
193
|
// object and *steal* its Object.prototype and strip it bare. This is
|
112
194
|
// used as the prototype to create nullary objects.
|
113
|
-
createEmpty =
|
195
|
+
createEmpty = function () {
|
114
196
|
var iframe = document.createElement('iframe');
|
115
197
|
var parent = document.body || document.documentElement;
|
116
198
|
iframe.style.display = 'none';
|
@@ -130,11 +212,12 @@ if (!Object.create) {
|
|
130
212
|
|
131
213
|
function Empty() {}
|
132
214
|
Empty.prototype = empty;
|
133
|
-
|
134
|
-
|
215
|
+
// short-circuit future calls
|
216
|
+
createEmpty = function () {
|
135
217
|
return new Empty();
|
136
218
|
};
|
137
|
-
|
219
|
+
return new Empty();
|
220
|
+
};
|
138
221
|
}
|
139
222
|
|
140
223
|
Object.create = function create(prototype, properties) {
|
@@ -175,7 +258,7 @@ if (!Object.create) {
|
|
175
258
|
|
176
259
|
// Patch for WebKit and IE8 standard mode
|
177
260
|
// Designed by hax <hax.github.com>
|
178
|
-
// related issue: https://github.com/
|
261
|
+
// related issue: https://github.com/es-shims/es5-shim/issues#issue/5
|
179
262
|
// IE8 Reference:
|
180
263
|
// http://msdn.microsoft.com/en-us/library/dd282900.aspx
|
181
264
|
// http://msdn.microsoft.com/en-us/library/dd229916.aspx
|
@@ -195,7 +278,7 @@ function doesDefinePropertyWork(object) {
|
|
195
278
|
// shim partially.
|
196
279
|
if (Object.defineProperty) {
|
197
280
|
var definePropertyWorksOnObject = doesDefinePropertyWork({});
|
198
|
-
var definePropertyWorksOnDom = typeof document
|
281
|
+
var definePropertyWorksOnDom = typeof document === "undefined" ||
|
199
282
|
doesDefinePropertyWork(document.createElement("div"));
|
200
283
|
if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {
|
201
284
|
var definePropertyFallback = Object.defineProperty,
|
@@ -210,10 +293,10 @@ if (!Object.defineProperty || definePropertyFallback) {
|
|
210
293
|
"on this javascript engine";
|
211
294
|
|
212
295
|
Object.defineProperty = function defineProperty(object, property, descriptor) {
|
213
|
-
if ((typeof object
|
296
|
+
if ((typeof object !== "object" && typeof object !== "function") || object === null) {
|
214
297
|
throw new TypeError(ERR_NON_OBJECT_TARGET + object);
|
215
298
|
}
|
216
|
-
if ((typeof descriptor
|
299
|
+
if ((typeof descriptor !== "object" && typeof descriptor !== "function") || descriptor === null) {
|
217
300
|
throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);
|
218
301
|
}
|
219
302
|
// make a valiant attempt to use the real defineProperty
|
@@ -289,9 +372,9 @@ if (!Object.defineProperties || definePropertiesFallback) {
|
|
289
372
|
// try the shim if the real one doesn't work
|
290
373
|
}
|
291
374
|
}
|
292
|
-
|
375
|
+
|
293
376
|
for (var property in properties) {
|
294
|
-
if (owns(properties, property) && property
|
377
|
+
if (owns(properties, property) && property !== "__proto__") {
|
295
378
|
Object.defineProperty(object, property, properties[property]);
|
296
379
|
}
|
297
380
|
}
|
@@ -327,7 +410,7 @@ try {
|
|
327
410
|
} catch (exception) {
|
328
411
|
Object.freeze = (function freeze(freezeObject) {
|
329
412
|
return function freeze(object) {
|
330
|
-
if (typeof object
|
413
|
+
if (typeof object === "function") {
|
331
414
|
return object;
|
332
415
|
} else {
|
333
416
|
return freezeObject(object);
|
@@ -383,4 +466,5 @@ if (!Object.isExtensible) {
|
|
383
466
|
};
|
384
467
|
}
|
385
468
|
|
386
|
-
});
|
469
|
+
}));
|
470
|
+
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
/*!
|
2
|
+
* https://github.com/es-shims/es5-shim
|
3
|
+
* @license es5-shim Copyright 2009-2014 by contributors, MIT License
|
4
|
+
* see https://github.com/es-shims/es5-shim/blob/master/LICENSE
|
5
|
+
*/
|
6
|
+
(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){var e=Function.prototype.call;var t=Object.prototype;var r=e.bind(t.hasOwnProperty);var n;var o;var i;var c;var f=r(t,"__defineGetter__");if(f){n=e.bind(t.__defineGetter__);o=e.bind(t.__defineSetter__);i=e.bind(t.__lookupGetter__);c=e.bind(t.__lookupSetter__)}if(!Object.getPrototypeOf){Object.getPrototypeOf=function g(e){var r=e.__proto__;if(r||r===null){return r}else if(e.constructor){return e.constructor.prototype}else{return t}}}function u(e){try{e.sentinel=0;return Object.getOwnPropertyDescriptor(e,"sentinel").value===0}catch(t){}}if(Object.defineProperty){var p=u({});var a=typeof document==="undefined"||u(document.createElement("div"));if(!a||!p){var l=Object.getOwnPropertyDescriptor}}if(!Object.getOwnPropertyDescriptor||l){var b="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function E(e,n){if(typeof e!=="object"&&typeof e!=="function"||e===null){throw new TypeError(b+e)}if(l){try{return l.call(Object,e,n)}catch(o){}}if(!r(e,n)){return}var u={enumerable:true,configurable:true};if(f){var p=e.__proto__;var a=e!==t;if(a){e.__proto__=t}var _=i(e,n);var s=c(e,n);if(a){e.__proto__=p}if(_||s){if(_){u.get=_}if(s){u.set=s}return u}}u.value=e[n];u.writable=true;return u}}if(!Object.getOwnPropertyNames){Object.getOwnPropertyNames=function x(e){return Object.keys(e)}}if(!Object.create){var _;var s=!({__proto__:null}instanceof Object);if(s||typeof document==="undefined"){_=function(){return{__proto__:null}}}else{_=function(){var e=document.createElement("iframe");var t=document.body||document.documentElement;e.style.display="none";t.appendChild(e);e.src="javascript:";var r=e.contentWindow.Object.prototype;t.removeChild(e);e=null;delete r.constructor;delete r.hasOwnProperty;delete r.propertyIsEnumerable;delete r.isPrototypeOf;delete r.toLocaleString;delete r.toString;delete r.valueOf;r.__proto__=null;function n(){}n.prototype=r;_=function(){return new n};return new n}}Object.create=function z(e,t){var r;function n(){}if(e===null){r=_()}else{if(typeof e!=="object"&&typeof e!=="function"){throw new TypeError("Object prototype may only be an Object or null")}n.prototype=e;r=new n;r.__proto__=e}if(t!==void 0){Object.defineProperties(r,t)}return r}}function d(e){try{Object.defineProperty(e,"sentinel",{});return"sentinel"in e}catch(t){}}if(Object.defineProperty){var y=d({});var O=typeof document==="undefined"||d(document.createElement("div"));if(!y||!O){var j=Object.defineProperty,v=Object.defineProperties}}if(!Object.defineProperty||j){var w="Property description must be an object: ";var P="Object.defineProperty called on non-object: ";var m="getters & setters can not be defined "+"on this javascript engine";Object.defineProperty=function S(e,u,p){if(typeof e!=="object"&&typeof e!=="function"||e===null){throw new TypeError(P+e)}if(typeof p!=="object"&&typeof p!=="function"||p===null){throw new TypeError(w+p)}if(j){try{return j.call(Object,e,u,p)}catch(a){}}if(r(p,"value")){if(f&&(i(e,u)||c(e,u))){var l=e.__proto__;e.__proto__=t;delete e[u];e[u]=p.value;e.__proto__=l}else{e[u]=p.value}}else{if(!f){throw new TypeError(m)}if(r(p,"get")){n(e,u,p.get)}if(r(p,"set")){o(e,u,p.set)}}return e}}if(!Object.defineProperties||v){Object.defineProperties=function T(e,t){if(v){try{return v.call(Object,e,t)}catch(n){}}for(var o in t){if(r(t,o)&&o!=="__proto__"){Object.defineProperty(e,o,t[o])}}return e}}if(!Object.seal){Object.seal=function D(e){return e}}if(!Object.freeze){Object.freeze=function k(e){return e}}try{Object.freeze(function(){})}catch(h){Object.freeze=function F(e){return function t(r){if(typeof r==="function"){return r}else{return e(r)}}}(Object.freeze)}if(!Object.preventExtensions){Object.preventExtensions=function G(e){return e}}if(!Object.isSealed){Object.isSealed=function C(e){return false}}if(!Object.isFrozen){Object.isFrozen=function N(e){return false}}if(!Object.isExtensible){Object.isExtensible=function I(e){if(Object(e)!==e){throw new TypeError}var t="";while(r(e,t)){t+="?"}e[t]=true;var n=r(e,t);delete e[t];return n}}});
|
7
|
+
//# sourceMappingURL=es5-sham.map
|
@@ -1,19 +1,30 @@
|
|
1
|
-
|
1
|
+
/*!
|
2
|
+
* https://github.com/es-shims/es5-shim
|
3
|
+
* @license es5-shim Copyright 2009-2014 by contributors, MIT License
|
4
|
+
* see https://github.com/es-shims/es5-shim/blob/master/LICENSE
|
5
|
+
*/
|
6
|
+
|
2
7
|
// vim: ts=4 sts=4 sw=4 expandtab
|
3
8
|
|
4
|
-
//
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
//Add semicolon to prevent IIFE from being passed as argument to concated code.
|
10
|
+
;
|
11
|
+
|
12
|
+
// UMD (Universal Module Definition)
|
13
|
+
// see https://github.com/umdjs/umd/blob/master/returnExports.js
|
14
|
+
(function (root, factory) {
|
15
|
+
if (typeof define === 'function' && define.amd) {
|
16
|
+
// AMD. Register as an anonymous module.
|
17
|
+
define(factory);
|
18
|
+
} else if (typeof exports === 'object') {
|
19
|
+
// Node. Does not work with strict CommonJS, but
|
20
|
+
// only CommonJS-like enviroments that support module.exports,
|
21
|
+
// like Node.
|
22
|
+
module.exports = factory();
|
13
23
|
} else {
|
14
|
-
|
24
|
+
// Browser globals (root is window)
|
25
|
+
root.returnExports = factory();
|
15
26
|
}
|
16
|
-
}
|
27
|
+
}(this, function () {
|
17
28
|
|
18
29
|
/**
|
19
30
|
* Brings an environment as close to ECMAScript 5 compliance
|
@@ -24,6 +35,149 @@
|
|
24
35
|
* Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
|
25
36
|
*/
|
26
37
|
|
38
|
+
// Shortcut to an often accessed properties, in order to avoid multiple
|
39
|
+
// dereference that costs universally.
|
40
|
+
var ArrayPrototype = Array.prototype;
|
41
|
+
var ObjectPrototype = Object.prototype;
|
42
|
+
var FunctionPrototype = Function.prototype;
|
43
|
+
var StringPrototype = String.prototype;
|
44
|
+
var NumberPrototype = Number.prototype;
|
45
|
+
var _Array_slice_ = ArrayPrototype.slice;
|
46
|
+
var array_splice = ArrayPrototype.splice;
|
47
|
+
var array_push = ArrayPrototype.push;
|
48
|
+
var array_unshift = ArrayPrototype.unshift;
|
49
|
+
var call = FunctionPrototype.call;
|
50
|
+
|
51
|
+
// Having a toString local variable name breaks in Opera so use _toString.
|
52
|
+
var _toString = ObjectPrototype.toString;
|
53
|
+
|
54
|
+
var isFunction = function (val) {
|
55
|
+
return ObjectPrototype.toString.call(val) === '[object Function]';
|
56
|
+
};
|
57
|
+
var isRegex = function (val) {
|
58
|
+
return ObjectPrototype.toString.call(val) === '[object RegExp]';
|
59
|
+
};
|
60
|
+
var isArray = function isArray(obj) {
|
61
|
+
return _toString.call(obj) === "[object Array]";
|
62
|
+
};
|
63
|
+
var isString = function isString(obj) {
|
64
|
+
return _toString.call(obj) === "[object String]";
|
65
|
+
};
|
66
|
+
var isArguments = function isArguments(value) {
|
67
|
+
var str = _toString.call(value);
|
68
|
+
var isArgs = str === '[object Arguments]';
|
69
|
+
if (!isArgs) {
|
70
|
+
isArgs = !isArray(value)
|
71
|
+
&& value !== null
|
72
|
+
&& typeof value === 'object'
|
73
|
+
&& typeof value.length === 'number'
|
74
|
+
&& value.length >= 0
|
75
|
+
&& isFunction(value.callee);
|
76
|
+
}
|
77
|
+
return isArgs;
|
78
|
+
};
|
79
|
+
|
80
|
+
var supportsDescriptors = Object.defineProperty && (function () {
|
81
|
+
try {
|
82
|
+
Object.defineProperty({}, 'x', {});
|
83
|
+
return true;
|
84
|
+
} catch (e) { /* this is ES3 */
|
85
|
+
return false;
|
86
|
+
}
|
87
|
+
}());
|
88
|
+
|
89
|
+
// Define configurable, writable and non-enumerable props
|
90
|
+
// if they don't exist.
|
91
|
+
var defineProperty;
|
92
|
+
if (supportsDescriptors) {
|
93
|
+
defineProperty = function (object, name, method, forceAssign) {
|
94
|
+
if (!forceAssign && (name in object)) { return; }
|
95
|
+
Object.defineProperty(object, name, {
|
96
|
+
configurable: true,
|
97
|
+
enumerable: false,
|
98
|
+
writable: true,
|
99
|
+
value: method
|
100
|
+
});
|
101
|
+
};
|
102
|
+
} else {
|
103
|
+
defineProperty = function (object, name, method, forceAssign) {
|
104
|
+
if (!forceAssign && (name in object)) { return; }
|
105
|
+
object[name] = method;
|
106
|
+
};
|
107
|
+
}
|
108
|
+
var defineProperties = function (object, map, forceAssign) {
|
109
|
+
for (var name in map) {
|
110
|
+
if (ObjectPrototype.hasOwnProperty.call(map, name)) {
|
111
|
+
defineProperty(object, name, map[name], forceAssign);
|
112
|
+
}
|
113
|
+
}
|
114
|
+
};
|
115
|
+
|
116
|
+
//
|
117
|
+
// Util
|
118
|
+
// ======
|
119
|
+
//
|
120
|
+
|
121
|
+
// ES5 9.4
|
122
|
+
// http://es5.github.com/#x9.4
|
123
|
+
// http://jsperf.com/to-integer
|
124
|
+
|
125
|
+
function toInteger(n) {
|
126
|
+
n = +n;
|
127
|
+
if (n !== n) { // isNaN
|
128
|
+
n = 0;
|
129
|
+
} else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
|
130
|
+
n = (n > 0 || -1) * Math.floor(Math.abs(n));
|
131
|
+
}
|
132
|
+
return n;
|
133
|
+
}
|
134
|
+
|
135
|
+
function isPrimitive(input) {
|
136
|
+
var type = typeof input;
|
137
|
+
return (
|
138
|
+
input === null ||
|
139
|
+
type === "undefined" ||
|
140
|
+
type === "boolean" ||
|
141
|
+
type === "number" ||
|
142
|
+
type === "string"
|
143
|
+
);
|
144
|
+
}
|
145
|
+
|
146
|
+
function toPrimitive(input) {
|
147
|
+
var val, valueOf, toStr;
|
148
|
+
if (isPrimitive(input)) {
|
149
|
+
return input;
|
150
|
+
}
|
151
|
+
valueOf = input.valueOf;
|
152
|
+
if (isFunction(valueOf)) {
|
153
|
+
val = valueOf.call(input);
|
154
|
+
if (isPrimitive(val)) {
|
155
|
+
return val;
|
156
|
+
}
|
157
|
+
}
|
158
|
+
toStr = input.toString;
|
159
|
+
if (isFunction(toStr)) {
|
160
|
+
val = toStr.call(input);
|
161
|
+
if (isPrimitive(val)) {
|
162
|
+
return val;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
throw new TypeError();
|
166
|
+
}
|
167
|
+
|
168
|
+
// ES5 9.9
|
169
|
+
// http://es5.github.com/#x9.9
|
170
|
+
var toObject = function (o) {
|
171
|
+
if (o == null) { // this matches both null and undefined
|
172
|
+
throw new TypeError("can't convert " + o + " to object");
|
173
|
+
}
|
174
|
+
return Object(o);
|
175
|
+
};
|
176
|
+
|
177
|
+
var ToUint32 = function ToUint32(x) {
|
178
|
+
return x >>> 0;
|
179
|
+
};
|
180
|
+
|
27
181
|
//
|
28
182
|
// Function
|
29
183
|
// ========
|
@@ -34,18 +188,18 @@
|
|
34
188
|
|
35
189
|
function Empty() {}
|
36
190
|
|
37
|
-
|
38
|
-
|
191
|
+
defineProperties(FunctionPrototype, {
|
192
|
+
bind: function bind(that) { // .length is 1
|
39
193
|
// 1. Let Target be the this value.
|
40
194
|
var target = this;
|
41
195
|
// 2. If IsCallable(Target) is false, throw a TypeError exception.
|
42
|
-
if (
|
196
|
+
if (!isFunction(target)) {
|
43
197
|
throw new TypeError("Function.prototype.bind called on incompatible " + target);
|
44
198
|
}
|
45
199
|
// 3. Let A be a new (possibly empty) internal list of all of the
|
46
200
|
// argument values provided after thisArg (arg1, arg2 etc), in order.
|
47
201
|
// XXX slicedArgs will stand in for "A" if used
|
48
|
-
var args =
|
202
|
+
var args = _Array_slice_.call(arguments, 1); // for normal call
|
49
203
|
// 4. Let F be a new native ECMAScript object.
|
50
204
|
// 11. Set the [[Prototype]] internal property of F to the standard
|
51
205
|
// built-in Function prototype object as specified in 15.3.3.1.
|
@@ -55,7 +209,7 @@ if (!Function.prototype.bind) {
|
|
55
209
|
// 15.3.4.5.2.
|
56
210
|
// 14. Set the [[HasInstance]] internal property of F as described in
|
57
211
|
// 15.3.4.5.3.
|
58
|
-
var
|
212
|
+
var binder = function () {
|
59
213
|
|
60
214
|
if (this instanceof bound) {
|
61
215
|
// 15.3.4.5.2 [[Construct]]
|
@@ -76,7 +230,7 @@ if (!Function.prototype.bind) {
|
|
76
230
|
|
77
231
|
var result = target.apply(
|
78
232
|
this,
|
79
|
-
args.concat(
|
233
|
+
args.concat(_Array_slice_.call(arguments))
|
80
234
|
);
|
81
235
|
if (Object(result) === result) {
|
82
236
|
return result;
|
@@ -105,27 +259,42 @@ if (!Function.prototype.bind) {
|
|
105
259
|
// equiv: target.call(this, ...boundArgs, ...args)
|
106
260
|
return target.apply(
|
107
261
|
that,
|
108
|
-
args.concat(
|
262
|
+
args.concat(_Array_slice_.call(arguments))
|
109
263
|
);
|
110
264
|
|
111
265
|
}
|
112
266
|
|
113
267
|
};
|
114
|
-
|
115
|
-
Empty.prototype = target.prototype;
|
116
|
-
bound.prototype = new Empty();
|
117
|
-
// Clean up dangling references.
|
118
|
-
Empty.prototype = null;
|
119
|
-
}
|
120
|
-
// XXX bound.length is never writable, so don't even try
|
121
|
-
//
|
268
|
+
|
122
269
|
// 15. If the [[Class]] internal property of Target is "Function", then
|
123
270
|
// a. Let L be the length property of Target minus the length of A.
|
124
271
|
// b. Set the length own property of F to either 0 or L, whichever is
|
125
272
|
// larger.
|
126
273
|
// 16. Else set the length own property of F to 0.
|
274
|
+
|
275
|
+
var boundLength = Math.max(0, target.length - args.length);
|
276
|
+
|
127
277
|
// 17. Set the attributes of the length own property of F to the values
|
128
278
|
// specified in 15.3.5.1.
|
279
|
+
var boundArgs = [];
|
280
|
+
for (var i = 0; i < boundLength; i++) {
|
281
|
+
boundArgs.push("$" + i);
|
282
|
+
}
|
283
|
+
|
284
|
+
// XXX Build a dynamic function with desired amount of arguments is the only
|
285
|
+
// way to set the length property of a function.
|
286
|
+
// In environments where Content Security Policies enabled (Chrome extensions,
|
287
|
+
// for ex.) all use of eval or Function costructor throws an exception.
|
288
|
+
// However in all of these environments Function.prototype.bind exists
|
289
|
+
// and so this code will never be executed.
|
290
|
+
var bound = Function("binder", "return function (" + boundArgs.join(",") + "){return binder.apply(this,arguments)}")(binder);
|
291
|
+
|
292
|
+
if (target.prototype) {
|
293
|
+
Empty.prototype = target.prototype;
|
294
|
+
bound.prototype = new Empty();
|
295
|
+
// Clean up dangling references.
|
296
|
+
Empty.prototype = null;
|
297
|
+
}
|
129
298
|
|
130
299
|
// TODO
|
131
300
|
// 18. Set the [[Extensible]] internal property of F to true.
|
@@ -149,20 +318,12 @@ if (!Function.prototype.bind) {
|
|
149
318
|
|
150
319
|
// 22. Return F.
|
151
320
|
return bound;
|
152
|
-
}
|
153
|
-
}
|
321
|
+
}
|
322
|
+
});
|
154
323
|
|
155
|
-
// Shortcut to an often accessed properties, in order to avoid multiple
|
156
|
-
// dereference that costs universally.
|
157
324
|
// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
|
158
325
|
// us it in defining shortcuts.
|
159
|
-
var
|
160
|
-
var prototypeOfArray = Array.prototype;
|
161
|
-
var prototypeOfObject = Object.prototype;
|
162
|
-
var slice = prototypeOfArray.slice;
|
163
|
-
// Having a toString local variable name breaks in Opera so use _toString.
|
164
|
-
var _toString = call.bind(prototypeOfObject.toString);
|
165
|
-
var owns = call.bind(prototypeOfObject.hasOwnProperty);
|
326
|
+
var owns = call.bind(ObjectPrototype.hasOwnProperty);
|
166
327
|
|
167
328
|
// If JS engine supports accessors creating shortcuts.
|
168
329
|
var defineGetter;
|
@@ -170,11 +331,11 @@ var defineSetter;
|
|
170
331
|
var lookupGetter;
|
171
332
|
var lookupSetter;
|
172
333
|
var supportsAccessors;
|
173
|
-
if ((supportsAccessors = owns(
|
174
|
-
defineGetter = call.bind(
|
175
|
-
defineSetter = call.bind(
|
176
|
-
lookupGetter = call.bind(
|
177
|
-
lookupSetter = call.bind(
|
334
|
+
if ((supportsAccessors = owns(ObjectPrototype, "__defineGetter__"))) {
|
335
|
+
defineGetter = call.bind(ObjectPrototype.__defineGetter__);
|
336
|
+
defineSetter = call.bind(ObjectPrototype.__defineSetter__);
|
337
|
+
lookupGetter = call.bind(ObjectPrototype.__lookupGetter__);
|
338
|
+
lookupSetter = call.bind(ObjectPrototype.__lookupSetter__);
|
178
339
|
}
|
179
340
|
|
180
341
|
//
|
@@ -184,44 +345,61 @@ if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) {
|
|
184
345
|
|
185
346
|
// ES5 15.4.4.12
|
186
347
|
// http://es5.github.com/#x15.4.4.12
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
348
|
+
var spliceNoopReturnsEmptyArray = (function () {
|
349
|
+
var a = [1, 2];
|
350
|
+
var result = a.splice();
|
351
|
+
return a.length === 2 && isArray(result) && result.length === 0;
|
352
|
+
}());
|
353
|
+
defineProperties(ArrayPrototype, {
|
354
|
+
// Safari 5.0 bug where .splice() returns undefined
|
355
|
+
splice: function splice(start, deleteCount) {
|
356
|
+
if (arguments.length === 0) {
|
194
357
|
return [];
|
195
358
|
} else {
|
196
|
-
return array_splice.apply(this,
|
197
|
-
start === void 0 ? 0 : start,
|
198
|
-
deleteCount === void 0 ? (this.length - start) : deleteCount
|
199
|
-
].concat(slice.call(arguments, 2)))
|
359
|
+
return array_splice.apply(this, arguments);
|
200
360
|
}
|
201
|
-
}
|
202
|
-
}
|
361
|
+
}
|
362
|
+
}, spliceNoopReturnsEmptyArray);
|
363
|
+
|
364
|
+
var spliceWorksWithEmptyObject = (function () {
|
365
|
+
var obj = {};
|
366
|
+
ArrayPrototype.splice.call(obj, 0, 0, 1);
|
367
|
+
return obj.length === 1;
|
368
|
+
}());
|
369
|
+
defineProperties(ArrayPrototype, {
|
370
|
+
splice: function splice(start, deleteCount) {
|
371
|
+
if (arguments.length === 0) { return []; }
|
372
|
+
var args = arguments;
|
373
|
+
this.length = Math.max(toInteger(this.length), 0);
|
374
|
+
if (arguments.length > 0 && typeof deleteCount !== 'number') {
|
375
|
+
args = _Array_slice_.call(arguments);
|
376
|
+
if (args.length < 2) {
|
377
|
+
args.push(this.length - start);
|
378
|
+
} else {
|
379
|
+
args[1] = toInteger(deleteCount);
|
380
|
+
}
|
381
|
+
}
|
382
|
+
return array_splice.apply(this, args);
|
383
|
+
}
|
384
|
+
}, !spliceWorksWithEmptyObject);
|
203
385
|
|
204
386
|
// ES5 15.4.4.12
|
205
387
|
// http://es5.github.com/#x15.4.4.13
|
206
388
|
// Return len+argCount.
|
207
389
|
// [bugfix, ielt8]
|
208
|
-
// IE < 8 bug: [].unshift(0)
|
209
|
-
|
210
|
-
|
211
|
-
|
390
|
+
// IE < 8 bug: [].unshift(0) === undefined but should be "1"
|
391
|
+
var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
|
392
|
+
defineProperties(ArrayPrototype, {
|
393
|
+
unshift: function () {
|
212
394
|
array_unshift.apply(this, arguments);
|
213
395
|
return this.length;
|
214
|
-
}
|
215
|
-
}
|
396
|
+
}
|
397
|
+
}, hasUnshiftReturnValueBug);
|
216
398
|
|
217
399
|
// ES5 15.4.3.2
|
218
400
|
// http://es5.github.com/#x15.4.3.2
|
219
401
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
|
220
|
-
|
221
|
-
Array.isArray = function isArray(obj) {
|
222
|
-
return _toString(obj) == "[object Array]";
|
223
|
-
};
|
224
|
-
}
|
402
|
+
defineProperties(Array, { isArray: isArray });
|
225
403
|
|
226
404
|
// The IsCallable() check in the Array functions
|
227
405
|
// has been replaced with a strict check on the
|
@@ -241,21 +419,36 @@ if (!Array.isArray) {
|
|
241
419
|
|
242
420
|
// Check failure of by-index access of string characters (IE < 9)
|
243
421
|
// and failure of `0 in boxedString` (Rhino)
|
244
|
-
var boxedString = Object("a")
|
245
|
-
|
422
|
+
var boxedString = Object("a");
|
423
|
+
var splitString = boxedString[0] !== "a" || !(0 in boxedString);
|
424
|
+
|
425
|
+
var properlyBoxesContext = function properlyBoxed(method) {
|
426
|
+
// Check node 0.6.21 bug where third parameter is not boxed
|
427
|
+
var properlyBoxesNonStrict = true;
|
428
|
+
var properlyBoxesStrict = true;
|
429
|
+
if (method) {
|
430
|
+
method.call('foo', function (_, __, context) {
|
431
|
+
if (typeof context !== 'object') { properlyBoxesNonStrict = false; }
|
432
|
+
});
|
433
|
+
|
434
|
+
method.call([1], function () {
|
435
|
+
'use strict';
|
436
|
+
properlyBoxesStrict = typeof this === 'string';
|
437
|
+
}, 'x');
|
438
|
+
}
|
439
|
+
return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
|
440
|
+
};
|
246
441
|
|
247
|
-
|
248
|
-
|
442
|
+
defineProperties(ArrayPrototype, {
|
443
|
+
forEach: function forEach(fun /*, thisp*/) {
|
249
444
|
var object = toObject(this),
|
250
|
-
self = splitString &&
|
251
|
-
this.split("") :
|
252
|
-
object,
|
445
|
+
self = splitString && isString(this) ? this.split('') : object,
|
253
446
|
thisp = arguments[1],
|
254
447
|
i = -1,
|
255
448
|
length = self.length >>> 0;
|
256
449
|
|
257
450
|
// If no callback function or if callback is not a callable function
|
258
|
-
if (
|
451
|
+
if (!isFunction(fun)) {
|
259
452
|
throw new TypeError(); // TODO message
|
260
453
|
}
|
261
454
|
|
@@ -267,51 +460,48 @@ if (!Array.prototype.forEach) {
|
|
267
460
|
fun.call(thisp, self[i], i, object);
|
268
461
|
}
|
269
462
|
}
|
270
|
-
}
|
271
|
-
}
|
463
|
+
}
|
464
|
+
}, !properlyBoxesContext(ArrayPrototype.forEach));
|
272
465
|
|
273
466
|
// ES5 15.4.4.19
|
274
467
|
// http://es5.github.com/#x15.4.4.19
|
275
468
|
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
|
276
|
-
|
277
|
-
|
469
|
+
defineProperties(ArrayPrototype, {
|
470
|
+
map: function map(fun /*, thisp*/) {
|
278
471
|
var object = toObject(this),
|
279
|
-
self = splitString &&
|
280
|
-
this.split("") :
|
281
|
-
object,
|
472
|
+
self = splitString && isString(this) ? this.split('') : object,
|
282
473
|
length = self.length >>> 0,
|
283
474
|
result = Array(length),
|
284
475
|
thisp = arguments[1];
|
285
476
|
|
286
477
|
// If no callback function or if callback is not a callable function
|
287
|
-
if (
|
478
|
+
if (!isFunction(fun)) {
|
288
479
|
throw new TypeError(fun + " is not a function");
|
289
480
|
}
|
290
481
|
|
291
482
|
for (var i = 0; i < length; i++) {
|
292
|
-
if (i in self)
|
483
|
+
if (i in self) {
|
293
484
|
result[i] = fun.call(thisp, self[i], i, object);
|
485
|
+
}
|
294
486
|
}
|
295
487
|
return result;
|
296
|
-
}
|
297
|
-
}
|
488
|
+
}
|
489
|
+
}, !properlyBoxesContext(ArrayPrototype.map));
|
298
490
|
|
299
491
|
// ES5 15.4.4.20
|
300
492
|
// http://es5.github.com/#x15.4.4.20
|
301
493
|
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
|
302
|
-
|
303
|
-
|
494
|
+
defineProperties(ArrayPrototype, {
|
495
|
+
filter: function filter(fun /*, thisp */) {
|
304
496
|
var object = toObject(this),
|
305
|
-
self = splitString &&
|
306
|
-
this.split("") :
|
307
|
-
object,
|
497
|
+
self = splitString && isString(this) ? this.split('') : object,
|
308
498
|
length = self.length >>> 0,
|
309
499
|
result = [],
|
310
500
|
value,
|
311
501
|
thisp = arguments[1];
|
312
502
|
|
313
503
|
// If no callback function or if callback is not a callable function
|
314
|
-
if (
|
504
|
+
if (!isFunction(fun)) {
|
315
505
|
throw new TypeError(fun + " is not a function");
|
316
506
|
}
|
317
507
|
|
@@ -324,23 +514,21 @@ if (!Array.prototype.filter) {
|
|
324
514
|
}
|
325
515
|
}
|
326
516
|
return result;
|
327
|
-
}
|
328
|
-
}
|
517
|
+
}
|
518
|
+
}, !properlyBoxesContext(ArrayPrototype.filter));
|
329
519
|
|
330
520
|
// ES5 15.4.4.16
|
331
521
|
// http://es5.github.com/#x15.4.4.16
|
332
522
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
|
333
|
-
|
334
|
-
|
523
|
+
defineProperties(ArrayPrototype, {
|
524
|
+
every: function every(fun /*, thisp */) {
|
335
525
|
var object = toObject(this),
|
336
|
-
self = splitString &&
|
337
|
-
this.split("") :
|
338
|
-
object,
|
526
|
+
self = splitString && isString(this) ? this.split('') : object,
|
339
527
|
length = self.length >>> 0,
|
340
528
|
thisp = arguments[1];
|
341
529
|
|
342
530
|
// If no callback function or if callback is not a callable function
|
343
|
-
if (
|
531
|
+
if (!isFunction(fun)) {
|
344
532
|
throw new TypeError(fun + " is not a function");
|
345
533
|
}
|
346
534
|
|
@@ -350,23 +538,21 @@ if (!Array.prototype.every) {
|
|
350
538
|
}
|
351
539
|
}
|
352
540
|
return true;
|
353
|
-
}
|
354
|
-
}
|
541
|
+
}
|
542
|
+
}, !properlyBoxesContext(ArrayPrototype.every));
|
355
543
|
|
356
544
|
// ES5 15.4.4.17
|
357
545
|
// http://es5.github.com/#x15.4.4.17
|
358
546
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
|
359
|
-
|
360
|
-
|
547
|
+
defineProperties(ArrayPrototype, {
|
548
|
+
some: function some(fun /*, thisp */) {
|
361
549
|
var object = toObject(this),
|
362
|
-
self = splitString &&
|
363
|
-
this.split("") :
|
364
|
-
object,
|
550
|
+
self = splitString && isString(this) ? this.split('') : object,
|
365
551
|
length = self.length >>> 0,
|
366
552
|
thisp = arguments[1];
|
367
553
|
|
368
554
|
// If no callback function or if callback is not a callable function
|
369
|
-
if (
|
555
|
+
if (!isFunction(fun)) {
|
370
556
|
throw new TypeError(fun + " is not a function");
|
371
557
|
}
|
372
558
|
|
@@ -376,27 +562,29 @@ if (!Array.prototype.some) {
|
|
376
562
|
}
|
377
563
|
}
|
378
564
|
return false;
|
379
|
-
}
|
380
|
-
}
|
565
|
+
}
|
566
|
+
}, !properlyBoxesContext(ArrayPrototype.some));
|
381
567
|
|
382
568
|
// ES5 15.4.4.21
|
383
569
|
// http://es5.github.com/#x15.4.4.21
|
384
570
|
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
|
385
|
-
|
386
|
-
|
571
|
+
var reduceCoercesToObject = false;
|
572
|
+
if (ArrayPrototype.reduce) {
|
573
|
+
reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object';
|
574
|
+
}
|
575
|
+
defineProperties(ArrayPrototype, {
|
576
|
+
reduce: function reduce(fun /*, initial*/) {
|
387
577
|
var object = toObject(this),
|
388
|
-
self = splitString &&
|
389
|
-
this.split("") :
|
390
|
-
object,
|
578
|
+
self = splitString && isString(this) ? this.split('') : object,
|
391
579
|
length = self.length >>> 0;
|
392
580
|
|
393
581
|
// If no callback function or if callback is not a callable function
|
394
|
-
if (
|
582
|
+
if (!isFunction(fun)) {
|
395
583
|
throw new TypeError(fun + " is not a function");
|
396
584
|
}
|
397
585
|
|
398
586
|
// no value to return if no initial value and an empty array
|
399
|
-
if (!length && arguments.length
|
587
|
+
if (!length && arguments.length === 1) {
|
400
588
|
throw new TypeError("reduce of empty array with no initial value");
|
401
589
|
}
|
402
590
|
|
@@ -425,27 +613,29 @@ if (!Array.prototype.reduce) {
|
|
425
613
|
}
|
426
614
|
|
427
615
|
return result;
|
428
|
-
}
|
429
|
-
}
|
616
|
+
}
|
617
|
+
}, !reduceCoercesToObject);
|
430
618
|
|
431
619
|
// ES5 15.4.4.22
|
432
620
|
// http://es5.github.com/#x15.4.4.22
|
433
621
|
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
|
434
|
-
|
435
|
-
|
622
|
+
var reduceRightCoercesToObject = false;
|
623
|
+
if (ArrayPrototype.reduceRight) {
|
624
|
+
reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object';
|
625
|
+
}
|
626
|
+
defineProperties(ArrayPrototype, {
|
627
|
+
reduceRight: function reduceRight(fun /*, initial*/) {
|
436
628
|
var object = toObject(this),
|
437
|
-
self = splitString &&
|
438
|
-
this.split("") :
|
439
|
-
object,
|
629
|
+
self = splitString && isString(this) ? this.split('') : object,
|
440
630
|
length = self.length >>> 0;
|
441
631
|
|
442
632
|
// If no callback function or if callback is not a callable function
|
443
|
-
if (
|
633
|
+
if (!isFunction(fun)) {
|
444
634
|
throw new TypeError(fun + " is not a function");
|
445
635
|
}
|
446
636
|
|
447
637
|
// no value to return if no initial value, empty array
|
448
|
-
if (!length && arguments.length
|
638
|
+
if (!length && arguments.length === 1) {
|
449
639
|
throw new TypeError("reduceRight of empty array with no initial value");
|
450
640
|
}
|
451
641
|
|
@@ -466,24 +656,27 @@ if (!Array.prototype.reduceRight) {
|
|
466
656
|
} while (true);
|
467
657
|
}
|
468
658
|
|
659
|
+
if (i < 0) {
|
660
|
+
return result;
|
661
|
+
}
|
662
|
+
|
469
663
|
do {
|
470
|
-
if (i in
|
664
|
+
if (i in self) {
|
471
665
|
result = fun.call(void 0, result, self[i], i, object);
|
472
666
|
}
|
473
667
|
} while (i--);
|
474
668
|
|
475
669
|
return result;
|
476
|
-
}
|
477
|
-
}
|
670
|
+
}
|
671
|
+
}, !reduceRightCoercesToObject);
|
478
672
|
|
479
673
|
// ES5 15.4.4.14
|
480
674
|
// http://es5.github.com/#x15.4.4.14
|
481
675
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
toObject(this),
|
676
|
+
var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
|
677
|
+
defineProperties(ArrayPrototype, {
|
678
|
+
indexOf: function indexOf(sought /*, fromIndex */ ) {
|
679
|
+
var self = splitString && isString(this) ? this.split('') : toObject(this),
|
487
680
|
length = self.length >>> 0;
|
488
681
|
|
489
682
|
if (!length) {
|
@@ -503,17 +696,16 @@ if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {
|
|
503
696
|
}
|
504
697
|
}
|
505
698
|
return -1;
|
506
|
-
}
|
507
|
-
}
|
699
|
+
}
|
700
|
+
}, hasFirefox2IndexOfBug);
|
508
701
|
|
509
702
|
// ES5 15.4.4.15
|
510
703
|
// http://es5.github.com/#x15.4.4.15
|
511
704
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
toObject(this),
|
705
|
+
var hasFirefox2LastIndexOfBug = Array.prototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
|
706
|
+
defineProperties(ArrayPrototype, {
|
707
|
+
lastIndexOf: function lastIndexOf(sought /*, fromIndex */) {
|
708
|
+
var self = splitString && isString(this) ? this.split('') : toObject(this),
|
517
709
|
length = self.length >>> 0;
|
518
710
|
|
519
711
|
if (!length) {
|
@@ -531,8 +723,8 @@ if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
|
|
531
723
|
}
|
532
724
|
}
|
533
725
|
return -1;
|
534
|
-
}
|
535
|
-
}
|
726
|
+
}
|
727
|
+
}, hasFirefox2LastIndexOfBug);
|
536
728
|
|
537
729
|
//
|
538
730
|
// Object
|
@@ -541,52 +733,74 @@ if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {
|
|
541
733
|
|
542
734
|
// ES5 15.2.3.14
|
543
735
|
// http://es5.github.com/#x15.2.3.14
|
544
|
-
if (!Object.keys) {
|
545
|
-
// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
|
546
|
-
var hasDontEnumBug = true,
|
547
|
-
dontEnums = [
|
548
|
-
"toString",
|
549
|
-
"toLocaleString",
|
550
|
-
"valueOf",
|
551
|
-
"hasOwnProperty",
|
552
|
-
"isPrototypeOf",
|
553
|
-
"propertyIsEnumerable",
|
554
|
-
"constructor"
|
555
|
-
],
|
556
|
-
dontEnumsLength = dontEnums.length;
|
557
|
-
|
558
|
-
for (var key in {"toString": null}) {
|
559
|
-
hasDontEnumBug = false;
|
560
|
-
}
|
561
|
-
|
562
|
-
Object.keys = function keys(object) {
|
563
736
|
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
737
|
+
// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
|
738
|
+
var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'),
|
739
|
+
hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
|
740
|
+
dontEnums = [
|
741
|
+
"toString",
|
742
|
+
"toLocaleString",
|
743
|
+
"valueOf",
|
744
|
+
"hasOwnProperty",
|
745
|
+
"isPrototypeOf",
|
746
|
+
"propertyIsEnumerable",
|
747
|
+
"constructor"
|
748
|
+
],
|
749
|
+
dontEnumsLength = dontEnums.length;
|
750
|
+
|
751
|
+
defineProperties(Object, {
|
752
|
+
keys: function keys(object) {
|
753
|
+
var isFn = isFunction(object),
|
754
|
+
isArgs = isArguments(object),
|
755
|
+
isObject = object !== null && typeof object === 'object',
|
756
|
+
isStr = isObject && isString(object);
|
757
|
+
|
758
|
+
if (!isObject && !isFn && !isArgs) {
|
568
759
|
throw new TypeError("Object.keys called on a non-object");
|
569
760
|
}
|
570
761
|
|
571
|
-
var
|
572
|
-
|
573
|
-
|
574
|
-
|
762
|
+
var theKeys = [];
|
763
|
+
var skipProto = hasProtoEnumBug && isFn;
|
764
|
+
if (isStr || isArgs) {
|
765
|
+
for (var i = 0; i < object.length; ++i) {
|
766
|
+
theKeys.push(String(i));
|
767
|
+
}
|
768
|
+
} else {
|
769
|
+
for (var name in object) {
|
770
|
+
if (!(skipProto && name === 'prototype') && owns(object, name)) {
|
771
|
+
theKeys.push(String(name));
|
772
|
+
}
|
575
773
|
}
|
576
774
|
}
|
577
775
|
|
578
776
|
if (hasDontEnumBug) {
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
777
|
+
var ctor = object.constructor,
|
778
|
+
skipConstructor = ctor && ctor.prototype === object;
|
779
|
+
for (var j = 0; j < dontEnumsLength; j++) {
|
780
|
+
var dontEnum = dontEnums[j];
|
781
|
+
if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
|
782
|
+
theKeys.push(dontEnum);
|
583
783
|
}
|
584
784
|
}
|
585
785
|
}
|
586
|
-
return
|
587
|
-
}
|
786
|
+
return theKeys;
|
787
|
+
}
|
788
|
+
});
|
588
789
|
|
589
|
-
|
790
|
+
var keysWorksWithArguments = Object.keys && (function () {
|
791
|
+
// Safari 5.0 bug
|
792
|
+
return Object.keys(arguments).length === 2;
|
793
|
+
}(1, 2));
|
794
|
+
var originalKeys = Object.keys;
|
795
|
+
defineProperties(Object, {
|
796
|
+
keys: function keys(object) {
|
797
|
+
if (isArguments(object)) {
|
798
|
+
return originalKeys(ArrayPrototype.slice.call(object));
|
799
|
+
} else {
|
800
|
+
return originalKeys(object);
|
801
|
+
}
|
802
|
+
}
|
803
|
+
}, !keysWorksWithArguments);
|
590
804
|
|
591
805
|
//
|
592
806
|
// Date
|
@@ -600,13 +814,12 @@ if (!Object.keys) {
|
|
600
814
|
// string format defined in 15.9.1.15. All fields are present in the String.
|
601
815
|
// The time zone is always UTC, denoted by the suffix Z. If the time value of
|
602
816
|
// this object is not a finite Number a RangeError exception is thrown.
|
603
|
-
var negativeDate = -62198755200000
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
) {
|
609
|
-
Date.prototype.toISOString = function toISOString() {
|
817
|
+
var negativeDate = -62198755200000;
|
818
|
+
var negativeYearString = "-000001";
|
819
|
+
var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
|
820
|
+
|
821
|
+
defineProperties(Date.prototype, {
|
822
|
+
toISOString: function toISOString() {
|
610
823
|
var result, length, value, year, month;
|
611
824
|
if (!isFinite(this)) {
|
612
825
|
throw new RangeError("Date.prototype.toISOString called on non-finite value.");
|
@@ -615,17 +828,15 @@ if (
|
|
615
828
|
year = this.getUTCFullYear();
|
616
829
|
|
617
830
|
month = this.getUTCMonth();
|
618
|
-
// see https://github.com/
|
831
|
+
// see https://github.com/es-shims/es5-shim/issues/111
|
619
832
|
year += Math.floor(month / 12);
|
620
833
|
month = (month % 12 + 12) % 12;
|
621
834
|
|
622
835
|
// the date time string format is specified in 15.9.1.15.
|
623
|
-
result = [month + 1, this.getUTCDate(),
|
624
|
-
this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];
|
836
|
+
result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];
|
625
837
|
year = (
|
626
838
|
(year < 0 ? "-" : (year > 9999 ? "+" : "")) +
|
627
|
-
("00000" + Math.abs(year))
|
628
|
-
.slice(0 <= year && year <= 9999 ? -4 : -6)
|
839
|
+
("00000" + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6)
|
629
840
|
);
|
630
841
|
|
631
842
|
length = result.length;
|
@@ -643,8 +854,8 @@ if (
|
|
643
854
|
"T" + result.slice(2).join(":") + "." +
|
644
855
|
("000" + this.getUTCMilliseconds()).slice(-3) + "Z"
|
645
856
|
);
|
646
|
-
}
|
647
|
-
}
|
857
|
+
}
|
858
|
+
}, hasNegativeDateBug);
|
648
859
|
|
649
860
|
|
650
861
|
// ES5 15.9.5.44
|
@@ -684,7 +895,7 @@ if (!dateToJSONIsSupported) {
|
|
684
895
|
// O with argument "toISOString".
|
685
896
|
toISO = o.toISOString;
|
686
897
|
// 5. If IsCallable(toISO) is false, throw a TypeError exception.
|
687
|
-
if (typeof toISO
|
898
|
+
if (typeof toISO !== "function") {
|
688
899
|
throw new TypeError("toISOString property is not callable");
|
689
900
|
}
|
690
901
|
// 6. Return the result of calling the [[Call]] internal method of
|
@@ -706,16 +917,19 @@ if (!dateToJSONIsSupported) {
|
|
706
917
|
// http://es5.github.com/#x15.9.4.2
|
707
918
|
// based on work shared by Daniel Friesen (dantman)
|
708
919
|
// http://gist.github.com/303249
|
709
|
-
|
920
|
+
var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
|
921
|
+
var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z'));
|
922
|
+
var doesNotParseY2KNewYear = isNaN(Date.parse("2000-01-01T00:00:00.000Z"));
|
923
|
+
if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
|
710
924
|
// XXX global assignment won't work in embeddings that use
|
711
925
|
// an alternate object for the context.
|
712
|
-
Date = (function(NativeDate) {
|
926
|
+
Date = (function (NativeDate) {
|
713
927
|
|
714
928
|
// Date.length === 7
|
715
929
|
function Date(Y, M, D, h, m, s, ms) {
|
716
930
|
var length = arguments.length;
|
717
931
|
if (this instanceof NativeDate) {
|
718
|
-
var date = length
|
932
|
+
var date = length === 1 && String(Y) === Y ? // isString(Y)
|
719
933
|
// We explicitly pass it through parse:
|
720
934
|
new NativeDate(Date.parse(Y)) :
|
721
935
|
// We have to manually make calls depending on argument
|
@@ -733,7 +947,7 @@ if (!Date.parse || "Date.parse is buggy") {
|
|
733
947
|
return date;
|
734
948
|
}
|
735
949
|
return NativeDate.apply(this, arguments);
|
736
|
-
}
|
950
|
+
}
|
737
951
|
|
738
952
|
// 15.9.1.15 Date Time String Format.
|
739
953
|
var isoDateExpression = new RegExp("^" +
|
@@ -746,7 +960,7 @@ if (!Date.parse || "Date.parse is buggy") {
|
|
746
960
|
":(\\d{2})" + // minutes capture
|
747
961
|
"(?:" + // optional :seconds.milliseconds
|
748
962
|
":(\\d{2})" + // seconds capture
|
749
|
-
"(
|
963
|
+
"(?:(\\.\\d{1,}))?" + // milliseconds capture
|
750
964
|
")?" +
|
751
965
|
"(" + // capture UTC offset component
|
752
966
|
"Z|" + // UTC capture
|
@@ -773,6 +987,10 @@ if (!Date.parse || "Date.parse is buggy") {
|
|
773
987
|
);
|
774
988
|
}
|
775
989
|
|
990
|
+
function toUTC(t) {
|
991
|
+
return Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));
|
992
|
+
}
|
993
|
+
|
776
994
|
// Copy any custom methods a 3rd party library may have added
|
777
995
|
for (var key in NativeDate) {
|
778
996
|
Date[key] = NativeDate[key];
|
@@ -797,12 +1015,11 @@ if (!Date.parse || "Date.parse is buggy") {
|
|
797
1015
|
hour = Number(match[4] || 0),
|
798
1016
|
minute = Number(match[5] || 0),
|
799
1017
|
second = Number(match[6] || 0),
|
800
|
-
millisecond = Number(match[7] || 0),
|
1018
|
+
millisecond = Math.floor(Number(match[7] || 0) * 1000),
|
801
1019
|
// When time zone is missed, local offset should be used
|
802
1020
|
// (ES 5.1 bug)
|
803
1021
|
// see https://bugs.ecmascript.org/show_bug.cgi?id=112
|
804
|
-
|
805
|
-
0 : Number(new NativeDate(1970, 0)),
|
1022
|
+
isLocalTime = Boolean(match[4] && !match[8]),
|
806
1023
|
signOffset = match[9] === "-" ? 1 : -1,
|
807
1024
|
hourOffset = Number(match[10] || 0),
|
808
1025
|
minuteOffset = Number(match[11] || 0),
|
@@ -829,7 +1046,10 @@ if (!Date.parse || "Date.parse is buggy") {
|
|
829
1046
|
result = (
|
830
1047
|
(result + minute + minuteOffset * signOffset) * 60 +
|
831
1048
|
second
|
832
|
-
) * 1000 + millisecond
|
1049
|
+
) * 1000 + millisecond;
|
1050
|
+
if (isLocalTime) {
|
1051
|
+
result = toUTC(result);
|
1052
|
+
}
|
833
1053
|
if (-8.64e15 <= result && result <= 8.64e15) {
|
834
1054
|
return result;
|
835
1055
|
}
|
@@ -853,129 +1073,359 @@ if (!Date.now) {
|
|
853
1073
|
|
854
1074
|
|
855
1075
|
//
|
856
|
-
//
|
1076
|
+
// Number
|
857
1077
|
// ======
|
858
1078
|
//
|
859
1079
|
|
1080
|
+
// ES5.1 15.7.4.5
|
1081
|
+
// http://es5.github.com/#x15.7.4.5
|
1082
|
+
var hasToFixedBugs = NumberPrototype.toFixed && (
|
1083
|
+
(0.00008).toFixed(3) !== '0.000'
|
1084
|
+
|| (0.9).toFixed(0) !== '1'
|
1085
|
+
|| (1.255).toFixed(2) !== '1.25'
|
1086
|
+
|| (1000000000000000128).toFixed(0) !== "1000000000000000128"
|
1087
|
+
);
|
1088
|
+
|
1089
|
+
var toFixedHelpers = {
|
1090
|
+
base: 1e7,
|
1091
|
+
size: 6,
|
1092
|
+
data: [0, 0, 0, 0, 0, 0],
|
1093
|
+
multiply: function multiply(n, c) {
|
1094
|
+
var i = -1;
|
1095
|
+
while (++i < toFixedHelpers.size) {
|
1096
|
+
c += n * toFixedHelpers.data[i];
|
1097
|
+
toFixedHelpers.data[i] = c % toFixedHelpers.base;
|
1098
|
+
c = Math.floor(c / toFixedHelpers.base);
|
1099
|
+
}
|
1100
|
+
},
|
1101
|
+
divide: function divide(n) {
|
1102
|
+
var i = toFixedHelpers.size, c = 0;
|
1103
|
+
while (--i >= 0) {
|
1104
|
+
c += toFixedHelpers.data[i];
|
1105
|
+
toFixedHelpers.data[i] = Math.floor(c / n);
|
1106
|
+
c = (c % n) * toFixedHelpers.base;
|
1107
|
+
}
|
1108
|
+
},
|
1109
|
+
numToString: function numToString() {
|
1110
|
+
var i = toFixedHelpers.size;
|
1111
|
+
var s = '';
|
1112
|
+
while (--i >= 0) {
|
1113
|
+
if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
|
1114
|
+
var t = String(toFixedHelpers.data[i]);
|
1115
|
+
if (s === '') {
|
1116
|
+
s = t;
|
1117
|
+
} else {
|
1118
|
+
s += '0000000'.slice(0, 7 - t.length) + t;
|
1119
|
+
}
|
1120
|
+
}
|
1121
|
+
}
|
1122
|
+
return s;
|
1123
|
+
},
|
1124
|
+
pow: function pow(x, n, acc) {
|
1125
|
+
return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));
|
1126
|
+
},
|
1127
|
+
log: function log(x) {
|
1128
|
+
var n = 0;
|
1129
|
+
while (x >= 4096) {
|
1130
|
+
n += 12;
|
1131
|
+
x /= 4096;
|
1132
|
+
}
|
1133
|
+
while (x >= 2) {
|
1134
|
+
n += 1;
|
1135
|
+
x /= 2;
|
1136
|
+
}
|
1137
|
+
return n;
|
1138
|
+
}
|
1139
|
+
};
|
1140
|
+
|
1141
|
+
defineProperties(NumberPrototype, {
|
1142
|
+
toFixed: function toFixed(fractionDigits) {
|
1143
|
+
var f, x, s, m, e, z, j, k;
|
1144
|
+
|
1145
|
+
// Test for NaN and round fractionDigits down
|
1146
|
+
f = Number(fractionDigits);
|
1147
|
+
f = f !== f ? 0 : Math.floor(f);
|
1148
|
+
|
1149
|
+
if (f < 0 || f > 20) {
|
1150
|
+
throw new RangeError("Number.toFixed called with invalid number of decimals");
|
1151
|
+
}
|
1152
|
+
|
1153
|
+
x = Number(this);
|
1154
|
+
|
1155
|
+
// Test for NaN
|
1156
|
+
if (x !== x) {
|
1157
|
+
return "NaN";
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
// If it is too big or small, return the string value of the number
|
1161
|
+
if (x <= -1e21 || x >= 1e21) {
|
1162
|
+
return String(x);
|
1163
|
+
}
|
1164
|
+
|
1165
|
+
s = "";
|
1166
|
+
|
1167
|
+
if (x < 0) {
|
1168
|
+
s = "-";
|
1169
|
+
x = -x;
|
1170
|
+
}
|
1171
|
+
|
1172
|
+
m = "0";
|
1173
|
+
|
1174
|
+
if (x > 1e-21) {
|
1175
|
+
// 1e-21 < x < 1e21
|
1176
|
+
// -70 < log2(x) < 70
|
1177
|
+
e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
|
1178
|
+
z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
|
1179
|
+
z *= 0x10000000000000; // Math.pow(2, 52);
|
1180
|
+
e = 52 - e;
|
1181
|
+
|
1182
|
+
// -18 < e < 122
|
1183
|
+
// x = z / 2 ^ e
|
1184
|
+
if (e > 0) {
|
1185
|
+
toFixedHelpers.multiply(0, z);
|
1186
|
+
j = f;
|
1187
|
+
|
1188
|
+
while (j >= 7) {
|
1189
|
+
toFixedHelpers.multiply(1e7, 0);
|
1190
|
+
j -= 7;
|
1191
|
+
}
|
1192
|
+
|
1193
|
+
toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
|
1194
|
+
j = e - 1;
|
1195
|
+
|
1196
|
+
while (j >= 23) {
|
1197
|
+
toFixedHelpers.divide(1 << 23);
|
1198
|
+
j -= 23;
|
1199
|
+
}
|
1200
|
+
|
1201
|
+
toFixedHelpers.divide(1 << j);
|
1202
|
+
toFixedHelpers.multiply(1, 1);
|
1203
|
+
toFixedHelpers.divide(2);
|
1204
|
+
m = toFixedHelpers.numToString();
|
1205
|
+
} else {
|
1206
|
+
toFixedHelpers.multiply(0, z);
|
1207
|
+
toFixedHelpers.multiply(1 << (-e), 0);
|
1208
|
+
m = toFixedHelpers.numToString() + '0.00000000000000000000'.slice(2, 2 + f);
|
1209
|
+
}
|
1210
|
+
}
|
1211
|
+
|
1212
|
+
if (f > 0) {
|
1213
|
+
k = m.length;
|
1214
|
+
|
1215
|
+
if (k <= f) {
|
1216
|
+
m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m;
|
1217
|
+
} else {
|
1218
|
+
m = s + m.slice(0, k - f) + '.' + m.slice(k - f);
|
1219
|
+
}
|
1220
|
+
} else {
|
1221
|
+
m = s + m;
|
1222
|
+
}
|
1223
|
+
|
1224
|
+
return m;
|
1225
|
+
}
|
1226
|
+
}, hasToFixedBugs);
|
1227
|
+
|
1228
|
+
|
1229
|
+
//
|
1230
|
+
// String
|
1231
|
+
// ======
|
1232
|
+
//
|
860
1233
|
|
861
1234
|
// ES5 15.5.4.14
|
862
1235
|
// http://es5.github.com/#x15.5.4.14
|
1236
|
+
|
1237
|
+
// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
|
1238
|
+
// Many browsers do not split properly with regular expressions or they
|
1239
|
+
// do not perform the split correctly under obscure conditions.
|
1240
|
+
// See http://blog.stevenlevithan.com/archives/cross-browser-split
|
1241
|
+
// I've tested in many browsers and this seems to cover the deviant ones:
|
1242
|
+
// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
|
1243
|
+
// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
|
1244
|
+
// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
|
1245
|
+
// [undefined, "t", undefined, "e", ...]
|
1246
|
+
// ''.split(/.?/) should be [], not [""]
|
1247
|
+
// '.'.split(/()()/) should be ["."], not ["", "", "."]
|
1248
|
+
|
1249
|
+
var string_split = StringPrototype.split;
|
1250
|
+
if (
|
1251
|
+
'ab'.split(/(?:ab)*/).length !== 2 ||
|
1252
|
+
'.'.split(/(.?)(.?)/).length !== 4 ||
|
1253
|
+
'tesst'.split(/(s)*/)[1] === "t" ||
|
1254
|
+
'test'.split(/(?:)/, -1).length !== 4 ||
|
1255
|
+
''.split(/.?/).length ||
|
1256
|
+
'.'.split(/()()/).length > 1
|
1257
|
+
) {
|
1258
|
+
(function () {
|
1259
|
+
var compliantExecNpcg = /()??/.exec("")[1] === void 0; // NPCG: nonparticipating capturing group
|
1260
|
+
|
1261
|
+
StringPrototype.split = function (separator, limit) {
|
1262
|
+
var string = this;
|
1263
|
+
if (separator === void 0 && limit === 0) {
|
1264
|
+
return [];
|
1265
|
+
}
|
1266
|
+
|
1267
|
+
// If `separator` is not a regex, use native split
|
1268
|
+
if (_toString.call(separator) !== "[object RegExp]") {
|
1269
|
+
return string_split.call(this, separator, limit);
|
1270
|
+
}
|
1271
|
+
|
1272
|
+
var output = [],
|
1273
|
+
flags = (separator.ignoreCase ? "i" : "") +
|
1274
|
+
(separator.multiline ? "m" : "") +
|
1275
|
+
(separator.extended ? "x" : "") + // Proposed for ES6
|
1276
|
+
(separator.sticky ? "y" : ""), // Firefox 3+
|
1277
|
+
lastLastIndex = 0,
|
1278
|
+
// Make `global` and avoid `lastIndex` issues by working with a copy
|
1279
|
+
separator2, match, lastIndex, lastLength;
|
1280
|
+
separator = new RegExp(separator.source, flags + "g");
|
1281
|
+
string += ""; // Type-convert
|
1282
|
+
if (!compliantExecNpcg) {
|
1283
|
+
// Doesn't need flags gy, but they don't hurt
|
1284
|
+
separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
|
1285
|
+
}
|
1286
|
+
/* Values for `limit`, per the spec:
|
1287
|
+
* If undefined: 4294967295 // Math.pow(2, 32) - 1
|
1288
|
+
* If 0, Infinity, or NaN: 0
|
1289
|
+
* If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
|
1290
|
+
* If negative number: 4294967296 - Math.floor(Math.abs(limit))
|
1291
|
+
* If other: Type-convert, then use the above rules
|
1292
|
+
*/
|
1293
|
+
limit = limit === void 0 ?
|
1294
|
+
-1 >>> 0 : // Math.pow(2, 32) - 1
|
1295
|
+
ToUint32(limit);
|
1296
|
+
while (match = separator.exec(string)) {
|
1297
|
+
// `separator.lastIndex` is not reliable cross-browser
|
1298
|
+
lastIndex = match.index + match[0].length;
|
1299
|
+
if (lastIndex > lastLastIndex) {
|
1300
|
+
output.push(string.slice(lastLastIndex, match.index));
|
1301
|
+
// Fix browsers whose `exec` methods don't consistently return `undefined` for
|
1302
|
+
// nonparticipating capturing groups
|
1303
|
+
if (!compliantExecNpcg && match.length > 1) {
|
1304
|
+
match[0].replace(separator2, function () {
|
1305
|
+
for (var i = 1; i < arguments.length - 2; i++) {
|
1306
|
+
if (arguments[i] === void 0) {
|
1307
|
+
match[i] = void 0;
|
1308
|
+
}
|
1309
|
+
}
|
1310
|
+
});
|
1311
|
+
}
|
1312
|
+
if (match.length > 1 && match.index < string.length) {
|
1313
|
+
ArrayPrototype.push.apply(output, match.slice(1));
|
1314
|
+
}
|
1315
|
+
lastLength = match[0].length;
|
1316
|
+
lastLastIndex = lastIndex;
|
1317
|
+
if (output.length >= limit) {
|
1318
|
+
break;
|
1319
|
+
}
|
1320
|
+
}
|
1321
|
+
if (separator.lastIndex === match.index) {
|
1322
|
+
separator.lastIndex++; // Avoid an infinite loop
|
1323
|
+
}
|
1324
|
+
}
|
1325
|
+
if (lastLastIndex === string.length) {
|
1326
|
+
if (lastLength || !separator.test("")) {
|
1327
|
+
output.push("");
|
1328
|
+
}
|
1329
|
+
} else {
|
1330
|
+
output.push(string.slice(lastLastIndex));
|
1331
|
+
}
|
1332
|
+
return output.length > limit ? output.slice(0, limit) : output;
|
1333
|
+
};
|
1334
|
+
}());
|
1335
|
+
|
863
1336
|
// [bugfix, chrome]
|
864
1337
|
// If separator is undefined, then the result array contains just one String,
|
865
1338
|
// which is the this value (converted to a String). If limit is not undefined,
|
866
1339
|
// then the output array is truncated so that it contains no more than limit
|
867
1340
|
// elements.
|
868
1341
|
// "0".split(undefined, 0) -> []
|
869
|
-
if("0".split(void 0, 0).length) {
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
1342
|
+
} else if ("0".split(void 0, 0).length) {
|
1343
|
+
StringPrototype.split = function split(separator, limit) {
|
1344
|
+
if (separator === void 0 && limit === 0) { return []; }
|
1345
|
+
return string_split.call(this, separator, limit);
|
1346
|
+
};
|
1347
|
+
}
|
1348
|
+
|
1349
|
+
var str_replace = StringPrototype.replace;
|
1350
|
+
var replaceReportsGroupsCorrectly = (function () {
|
1351
|
+
var groups = [];
|
1352
|
+
'x'.replace(/x(.)?/g, function (match, group) {
|
1353
|
+
groups.push(group);
|
1354
|
+
});
|
1355
|
+
return groups.length === 1 && typeof groups[0] === 'undefined';
|
1356
|
+
}());
|
1357
|
+
|
1358
|
+
if (!replaceReportsGroupsCorrectly) {
|
1359
|
+
StringPrototype.replace = function replace(searchValue, replaceValue) {
|
1360
|
+
var isFn = isFunction(replaceValue);
|
1361
|
+
var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source);
|
1362
|
+
if (!isFn || !hasCapturingGroups) {
|
1363
|
+
return str_replace.call(this, searchValue, replaceValue);
|
1364
|
+
} else {
|
1365
|
+
var wrappedReplaceValue = function (match) {
|
1366
|
+
var length = arguments.length;
|
1367
|
+
var originalLastIndex = searchValue.lastIndex;
|
1368
|
+
searchValue.lastIndex = 0;
|
1369
|
+
var args = searchValue.exec(match);
|
1370
|
+
searchValue.lastIndex = originalLastIndex;
|
1371
|
+
args.push(arguments[length - 2], arguments[length - 1]);
|
1372
|
+
return replaceValue.apply(this, args);
|
1373
|
+
};
|
1374
|
+
return str_replace.call(this, searchValue, wrappedReplaceValue);
|
1375
|
+
}
|
1376
|
+
};
|
875
1377
|
}
|
876
1378
|
|
877
1379
|
// ECMA-262, 3rd B.2.3
|
878
|
-
//
|
1380
|
+
// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
|
879
1381
|
// non-normative section suggesting uniform semantics and it should be
|
880
1382
|
// normalized across all browsers
|
881
1383
|
// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
* @param {integer} start where to start the substring
|
887
|
-
* @param {integer} length how many characters to return
|
888
|
-
* @return {string}
|
889
|
-
*/
|
890
|
-
String.prototype.substr = function(start, length) {
|
1384
|
+
var string_substr = StringPrototype.substr;
|
1385
|
+
var hasNegativeSubstrBug = "".substr && "0b".substr(-1) !== "b";
|
1386
|
+
defineProperties(StringPrototype, {
|
1387
|
+
substr: function substr(start, length) {
|
891
1388
|
return string_substr.call(
|
892
1389
|
this,
|
893
1390
|
start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start,
|
894
1391
|
length
|
895
1392
|
);
|
896
1393
|
}
|
897
|
-
}
|
1394
|
+
}, hasNegativeSubstrBug);
|
898
1395
|
|
899
1396
|
// ES5 15.5.4.20
|
900
|
-
// http://es5.github.
|
1397
|
+
// whitespace from: http://es5.github.io/#x15.5.4.20
|
901
1398
|
var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
|
902
1399
|
"\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
|
903
1400
|
"\u2029\uFEFF";
|
904
|
-
|
1401
|
+
var zeroWidth = '\u200b';
|
1402
|
+
var wsRegexChars = "[" + ws + "]";
|
1403
|
+
var trimBeginRegexp = new RegExp("^" + wsRegexChars + wsRegexChars + "*");
|
1404
|
+
var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + "*$");
|
1405
|
+
var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());
|
1406
|
+
defineProperties(StringPrototype, {
|
905
1407
|
// http://blog.stevenlevithan.com/archives/faster-trim-javascript
|
906
1408
|
// http://perfectionkills.com/whitespace-deviations/
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
String.prototype.trim = function trim() {
|
911
|
-
if (this === undefined || this === null) {
|
912
|
-
throw new TypeError("can't convert "+this+" to object");
|
913
|
-
}
|
914
|
-
return String(this)
|
915
|
-
.replace(trimBeginRegexp, "")
|
916
|
-
.replace(trimEndRegexp, "");
|
917
|
-
};
|
918
|
-
}
|
919
|
-
|
920
|
-
//
|
921
|
-
// Util
|
922
|
-
// ======
|
923
|
-
//
|
924
|
-
|
925
|
-
// ES5 9.4
|
926
|
-
// http://es5.github.com/#x9.4
|
927
|
-
// http://jsperf.com/to-integer
|
928
|
-
|
929
|
-
function toInteger(n) {
|
930
|
-
n = +n;
|
931
|
-
if (n !== n) { // isNaN
|
932
|
-
n = 0;
|
933
|
-
} else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {
|
934
|
-
n = (n > 0 || -1) * Math.floor(Math.abs(n));
|
935
|
-
}
|
936
|
-
return n;
|
937
|
-
}
|
938
|
-
|
939
|
-
function isPrimitive(input) {
|
940
|
-
var type = typeof input;
|
941
|
-
return (
|
942
|
-
input === null ||
|
943
|
-
type === "undefined" ||
|
944
|
-
type === "boolean" ||
|
945
|
-
type === "number" ||
|
946
|
-
type === "string"
|
947
|
-
);
|
948
|
-
}
|
949
|
-
|
950
|
-
function toPrimitive(input) {
|
951
|
-
var val, valueOf, toString;
|
952
|
-
if (isPrimitive(input)) {
|
953
|
-
return input;
|
954
|
-
}
|
955
|
-
valueOf = input.valueOf;
|
956
|
-
if (typeof valueOf === "function") {
|
957
|
-
val = valueOf.call(input);
|
958
|
-
if (isPrimitive(val)) {
|
959
|
-
return val;
|
1409
|
+
trim: function trim() {
|
1410
|
+
if (this === void 0 || this === null) {
|
1411
|
+
throw new TypeError("can't convert " + this + " to object");
|
960
1412
|
}
|
1413
|
+
return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
|
961
1414
|
}
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
1415
|
+
}, hasTrimWhitespaceBug);
|
1416
|
+
|
1417
|
+
// ES-5 15.1.2.2
|
1418
|
+
if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
|
1419
|
+
parseInt = (function (origParseInt) {
|
1420
|
+
var hexRegex = /^0[xX]/;
|
1421
|
+
return function parseIntES5(str, radix) {
|
1422
|
+
str = String(str).trim();
|
1423
|
+
if (!Number(radix)) {
|
1424
|
+
radix = hexRegex.test(str) ? 16 : 10;
|
1425
|
+
}
|
1426
|
+
return origParseInt(str, radix);
|
1427
|
+
};
|
1428
|
+
}(parseInt));
|
970
1429
|
}
|
971
1430
|
|
972
|
-
|
973
|
-
// http://es5.github.com/#x9.9
|
974
|
-
var toObject = function (o) {
|
975
|
-
if (o == null) { // this matches both null and undefined
|
976
|
-
throw new TypeError("can't convert "+o+" to object");
|
977
|
-
}
|
978
|
-
return Object(o);
|
979
|
-
};
|
980
|
-
|
981
|
-
});
|
1431
|
+
}));
|