54 lines
2.2 KiB
JavaScript
54 lines
2.2 KiB
JavaScript
|
'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');
|