You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.5 KiB
61 lines
2.5 KiB
'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 defineProperty = require('../internals/object-define-property').f; |
|
var defineIterator = require('../internals/define-iterator'); |
|
var IS_PURE = require('../internals/is-pure'); |
|
var DESCRIPTORS = require('../internals/descriptors'); |
|
|
|
var ARRAY_ITERATOR = 'Array Iterator'; |
|
var setInternalState = InternalStateModule.set; |
|
var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR); |
|
|
|
// `Array.prototype.entries` method |
|
// https://tc39.es/ecma262/#sec-array.prototype.entries |
|
// `Array.prototype.keys` method |
|
// https://tc39.es/ecma262/#sec-array.prototype.keys |
|
// `Array.prototype.values` method |
|
// https://tc39.es/ecma262/#sec-array.prototype.values |
|
// `Array.prototype[@@iterator]` method |
|
// https://tc39.es/ecma262/#sec-array.prototype-@@iterator |
|
// `CreateArrayIterator` internal method |
|
// https://tc39.es/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.es/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.es/ecma262/#sec-createunmappedargumentsobject |
|
// https://tc39.es/ecma262/#sec-createmappedargumentsobject |
|
var values = Iterators.Arguments = Iterators.Array; |
|
|
|
// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables |
|
addToUnscopables('keys'); |
|
addToUnscopables('values'); |
|
addToUnscopables('entries'); |
|
|
|
// V8 ~ Chrome 45- bug |
|
if (!IS_PURE && DESCRIPTORS && values.name !== 'values') try { |
|
defineProperty(values, 'name', { value: 'values' }); |
|
} catch (error) { /* empty */ }
|
|
|