PageSourceSearch

https://www.ipernity.com/T/Js/array-from.js

js ipernity.com collected 2026-10-02 04:02:37 UTC 3,814 bytes, 136 lines download raw bytes

1// Obtained from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
2// Production steps of ECMA-262, Edition 6, 22.1.2.1
3//if (!Array.from) { // rstamp actually need to overwrite what currently exists
4 Array.from = (function () {
5  var symbolIterator;
6  try {
7   symbolIterator = Symbol.iterator
8    ? Symbol.iterator
9    : 'Symbol(Symbol.iterator)';
10  } catch (e) {
11   symbolIterator = 'Symbol(Symbol.iterator)';
12  }
13
14  var toStr = Object.prototype.toString;
15  var isCallable = function (fn) {
16   return (
17    typeof fn === 'function' ||
18    toStr.call(fn) === '[object Function]'
19   );
20  };
21  var toInteger = function (value) {
22   var number = Number(value);
23   if (isNaN(number)) return 0;
24   if (number === 0 || !isFinite(number)) return number;
25   return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
26  };
27  var maxSafeInteger = Math.pow(2, 53) - 1;
28  var toLength = function (value) {
29   var len = toInteger(value);
30   return Math.min(Math.max(len, 0), maxSafeInteger);
31  };
32
33  var setGetItemHandler = function setGetItemHandler(isIterator, items) {
34   var iterator = isIterator && items[symbolIterator]();
35   return function getItem(k) {
36    return isIterator ? iterator.next() : items[k];
37   };
38  };
39
40  var getArray = function getArray(
41   T,
42   A,
43   len,
44   getItem,
45   isIterator,
46   mapFn
47  ) {
48   // 16. Let k be 0.
49   var k = 0;
50
51   // 17. Repeat, while k < len… or while iterator is done (also steps a - h)
52   while (k < len || isIterator) {
53    var item = getItem(k);
54    var kValue = isIterator ? item.value : item;
55
56    if (isIterator && item.done) {
57     return A;
58    } else {
59     if (mapFn) {
60      A[k] =
61       typeof T === 'undefined'
62        ? mapFn(kValue, k)
63        : mapFn.call(T, kValue, k);
64     } else {
65      A[k] = kValue;
66     }
67    }
68    k += 1;
69   }
70
71   if (isIterator) {
72    throw new TypeError(
73     'Array.from: provided arrayLike or iterator has length more then 2 ** 52 - 1'
74    );
75   } else {
76    A.length = len;
77   }
78
79   return A;
80  };
81
82  // The length property of the from method is 1.
83  return function from(arrayLikeOrIterator /*, mapFn, thisArg */) {
84   // 1. Let C be the this value.
85   var C = this;
86
87   // 2. Let items be ToObject(arrayLikeOrIterator).
88   var items = Object(arrayLikeOrIterator);
89   var isIterator = isCallable(items[symbolIterator]);
90
91   // 3. ReturnIfAbrupt(items).
92   if (arrayLikeOrIterator == null && !isIterator) {
93    throw new TypeError(
94     'Array.from requires an array-like object or iterator - not null or undefined'
95    );
96   }
97
98   // 4. If mapfn is undefined, then let mapping be false.
99   var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
100   var T;
101   if (typeof mapFn !== 'undefined') {
102    // 5. else
103    // 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
104    if (!isCallable(mapFn)) {
105     throw new TypeError(
106      'Array.from: when provided, the second argument must be a function'
107     );
108    }
109
110    // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
111    if (arguments.length > 2) {
112     T = arguments[2];
113    }
114   }
115
116   // 10. Let lenValue be Get(items, "length").
117   // 11. Let len be ToLength(lenValue).
118   var len = toLength(items.length);
119
120   // 13. If IsConstructor(C) is true, then
121   // 13. a. Let A be the result of calling the [[Construct]] internal method
122   // of C with an argument list containing the single item len.
123   // 14. a. Else, Let A be ArrayCreate(len).
124   var A = isCallable(C) ? Object(new C(len)) : new Array(len);
125
126   return getArray(
127    T,
128    A,
129    len,
130    setGetItemHandler(isIterator, items),
131    isIterator,
132    mapFn
133   );
134  };
135 })();
136//}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.