UNPKG

2.61 kBJavaScriptView Raw
1'use strict';
2var toIndexedObject = require('../internals/to-indexed-object');
3var addToUnscopables = require('../internals/add-to-unscopables');
4var Iterators = require('../internals/iterators');
5var InternalStateModule = require('../internals/internal-state');
6var defineProperty = require('../internals/object-define-property').f;
7var defineIterator = require('../internals/iterator-define');
8var createIterResultObject = require('../internals/create-iter-result-object');
9var IS_PURE = require('../internals/is-pure');
10var DESCRIPTORS = require('../internals/descriptors');
11
12var ARRAY_ITERATOR = 'Array Iterator';
13var setInternalState = InternalStateModule.set;
14var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
15
16// `Array.prototype.entries` method
17// https://tc39.es/ecma262/#sec-array.prototype.entries
18// `Array.prototype.keys` method
19// https://tc39.es/ecma262/#sec-array.prototype.keys
20// `Array.prototype.values` method
21// https://tc39.es/ecma262/#sec-array.prototype.values
22// `Array.prototype[@@iterator]` method
23// https://tc39.es/ecma262/#sec-array.prototype-@@iterator
24// `CreateArrayIterator` internal method
25// https://tc39.es/ecma262/#sec-createarrayiterator
26module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
27 setInternalState(this, {
28 type: ARRAY_ITERATOR,
29 target: toIndexedObject(iterated), // target
30 index: 0, // next index
31 kind: kind // kind
32 });
33// `%ArrayIteratorPrototype%.next` method
34// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
35}, function () {
36 var state = getInternalState(this);
37 var target = state.target;
38 var index = state.index++;
39 if (!target || index >= target.length) {
40 state.target = undefined;
41 return createIterResultObject(undefined, true);
42 }
43 switch (state.kind) {
44 case 'keys': return createIterResultObject(index, false);
45 case 'values': return createIterResultObject(target[index], false);
46 } return createIterResultObject([index, target[index]], false);
47}, 'values');
48
49// argumentsList[@@iterator] is %ArrayProto_values%
50// https://tc39.es/ecma262/#sec-createunmappedargumentsobject
51// https://tc39.es/ecma262/#sec-createmappedargumentsobject
52var values = Iterators.Arguments = Iterators.Array;
53
54// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
55addToUnscopables('keys');
56addToUnscopables('values');
57addToUnscopables('entries');
58
59// V8 ~ Chrome 45- bug
60if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {
61 defineProperty(values, 'name', { value: 'values' });
62} catch (error) { /* empty */ }