1 |
|
2 |
|
3 |
|
4 |
|
5 | if (!Array.from) {
|
6 | Array.from = (function () {
|
7 | var toStr = Object.prototype.toString;
|
8 | var isCallable = function (fn) {
|
9 | return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
|
10 | };
|
11 | var toInteger = function (value) {
|
12 | var number = Number(value);
|
13 | if (isNaN(number)) { return 0; }
|
14 | if (number === 0 || !isFinite(number)) { return number; }
|
15 | return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
|
16 | };
|
17 | var maxSafeInteger = Math.pow(2, 53) - 1;
|
18 | var toLength = function (value) {
|
19 | var len = toInteger(value);
|
20 | return Math.min(Math.max(len, 0), maxSafeInteger);
|
21 | };
|
22 |
|
23 |
|
24 | return function from(arrayLike/*, mapFn, thisArg */) {
|
25 |
|
26 | var C = this;
|
27 |
|
28 |
|
29 | var items = Object(arrayLike);
|
30 |
|
31 |
|
32 | if (arrayLike == null) {
|
33 | throw new TypeError('Array.from requires an array-like object - not null or undefined');
|
34 | }
|
35 |
|
36 |
|
37 | var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
|
38 | var T;
|
39 | if (typeof mapFn !== 'undefined') {
|
40 |
|
41 |
|
42 | if (!isCallable(mapFn)) {
|
43 | throw new TypeError('Array.from: when provided, the second argument must be a function');
|
44 | }
|
45 |
|
46 |
|
47 | if (arguments.length > 2) {
|
48 | T = arguments[2];
|
49 | }
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 | var len = toLength(items.length);
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | var A = isCallable(C) ? Object(new C(len)) : new Array(len);
|
61 |
|
62 |
|
63 | var k = 0;
|
64 |
|
65 | var kValue;
|
66 | while (k < len) {
|
67 | kValue = items[k];
|
68 | if (mapFn) {
|
69 | A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
|
70 | } else {
|
71 | A[k] = kValue;
|
72 | }
|
73 | k += 1;
|
74 | }
|
75 |
|
76 | A.length = len;
|
77 |
|
78 | return A;
|
79 | };
|
80 | }());
|
81 | } |
\ | No newline at end of file |