| 'use strict'; |
| var toIndexedObject = require('../internals/to-indexed-object'); |
| var addToUnscopables = require('../internals/add-to-unscopables'); |
| var Iterators = require('../internals/iterators'); |
| var InternalStateModule = require('../internals/internal-state'); |
| var defineIterator = require('../internals/define-iterator'); |
| |
| var ARRAY_ITERATOR = 'Array Iterator'; |
| var setInternalState = InternalStateModule.set; |
| var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); |
| |
| // `Array.prototype.entries` method |
| // https://tc39.github.io/ecma262/#sec-array.prototype.entries |
| // `Array.prototype.keys` method |
| // https://tc39.github.io/ecma262/#sec-array.prototype.keys |
| // `Array.prototype.values` method |
| // https://tc39.github.io/ecma262/#sec-array.prototype.values |
| // `Array.prototype[@@iterator]` method |
| // https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator |
| // `CreateArrayIterator` internal method |
| // https://tc39.github.io/ecma262/#sec-createarrayiterator |
| module.exports = defineIterator(Array, 'Array', function (iterated, kind) { |
| setInternalState(this, { |
| type: ARRAY_ITERATOR, |
| target: toIndexedObject(iterated), // target |
| index: 0, // next index |
| kind: kind // kind |
| }); |
| // `%ArrayIteratorPrototype%.next` method |
| // https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next |
| }, function () { |
| var state = getInternalState(this); |
| var target = state.target; |
| var kind = state.kind; |
| var index = state.index++; |
| if (!target || index >= target.length) { |
| state.target = undefined; |
| return { value: undefined, done: true }; |
| } |
| if (kind == 'keys') return { value: index, done: false }; |
| if (kind == 'values') return { value: target[index], done: false }; |
| return { value: [index, target[index]], done: false }; |
| }, 'values'); |
| |
| // argumentsList[@@iterator] is %ArrayProto_values% |
| // https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject |
| // https://tc39.github.io/ecma262/#sec-createmappedargumentsobject |
| Iterators.Arguments = Iterators.Array; |
| |
| // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables |
| addToUnscopables('keys'); |
| addToUnscopables('values'); |
| addToUnscopables('entries'); |