2 var toIndexedObject = require('../internals/to-indexed-object');
3 var addToUnscopables = require('../internals/add-to-unscopables');
4 var Iterators = require('../internals/iterators');
5 var InternalStateModule = require('../internals/internal-state');
6 var defineIterator = require('../internals/define-iterator');
8 var ARRAY_ITERATOR = 'Array Iterator';
9 var setInternalState = InternalStateModule.set;
10 var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
12 // `Array.prototype.entries` method
13 // https://tc39.es/ecma262/#sec-array.prototype.entries
14 // `Array.prototype.keys` method
15 // https://tc39.es/ecma262/#sec-array.prototype.keys
16 // `Array.prototype.values` method
17 // https://tc39.es/ecma262/#sec-array.prototype.values
18 // `Array.prototype[@@iterator]` method
19 // https://tc39.es/ecma262/#sec-array.prototype-@@iterator
20 // `CreateArrayIterator` internal method
21 // https://tc39.es/ecma262/#sec-createarrayiterator
22 module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
23 setInternalState(this, {
25 target: toIndexedObject(iterated), // target
26 index: 0, // next index
29 // `%ArrayIteratorPrototype%.next` method
30 // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
32 var state = getInternalState(this);
33 var target = state.target;
34 var kind = state.kind;
35 var index = state.index++;
36 if (!target || index >= target.length) {
37 state.target = undefined;
38 return { value: undefined, done: true };
40 if (kind == 'keys') return { value: index, done: false };
41 if (kind == 'values') return { value: target[index], done: false };
42 return { value: [index, target[index]], done: false };
45 // argumentsList[@@iterator] is %ArrayProto_values%
46 // https://tc39.es/ecma262/#sec-createunmappedargumentsobject
47 // https://tc39.es/ecma262/#sec-createmappedargumentsobject
48 Iterators.Arguments = Iterators.Array;
50 // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
51 addToUnscopables('keys');
52 addToUnscopables('values');
53 addToUnscopables('entries');