ES6 introduce el concepto de iteradores y objetos iterables, y proporciona soporte relacionado para objetos iterables, como bucle for...of, constructor Map (iterable), sintaxis de expansión... etc. Simplifiquemos también en gran medida la operación transversal de la recopilación de datos fuera de la matriz.
objeto iterable
Una matriz es un objeto especial, y su diferencia con los objetos ordinarios no es solo el acceso secuencial y el almacenamiento de elementos. Otra diferencia importante: los arreglos son iterables, es decir, se for ... of
puede acceder a todos los elementos (iterar) usando declaraciones.
La declaración de uso de objetos ordinariosfor ... of
informará un error
let arr = [1,2,3,4,5]
for(let val of arr) {
console.log(val) // 1 2 3 4 5
}
let obj = {
name:'Kite',
age:23,
}
for(let key of obj) { // obj is not iterable
console.log(key)
}
operador de propagación
// es5 apply
function consoleLog() {
console.log(...arguments)
}
console.log(consoleLog.apply(null, array))
// es6 扩展预算符
const array = [1, 2, 3, 4]
console.log(...array); // 1,2,3,4
const obj = {
name: 'kite',
age: 23,
}
console.log(...obj); // TypeError: Found non-callable @@iterator
Símbolo.iterador
Si queremos que un objeto sea iterable, debemos agregarle al objeto un método Symbol.iterator
llamadoSymbol
- Cuando se usa
for ... of
un bucle para iterar sobre un objeto,Symbol.iterator
se llama a un método que debe devolver un iterador (unnext()
objeto con métodos). - Después de obtener el iterador,
for ... of
llamará continuamente alnext()
método del iterador para obtener el siguiente elemento next()
El contenido devuelto por el método debe ajustarse al formato:, en ese momento{done:Boolean,value:any}
, el ciclo finaliza, de lo contrario , es el siguiente valor.done:true
value
iteradores:
El iterador se basa en C++
el concepto de otros lenguajes. El principio del iterador es como un puntero. Apunta a un elemento en la recopilación de datos. Puede obtener el elemento al que apunta y también puede moverlo para obtener otros elementos. . Los iteradores son similares a la expansión de subíndices en matrices, y varias estructuras de datos, como listas enlazadas ( List
), colecciones ( Set
) y mapas ( Map
), tienen iteradores correspondientes.
JS
Los iteradores en están diseñados específicamente para atravesar esta operación. El iterador obtenido cada vez siempre apunta inicialmente al primer elemento, y el iterador tiene next()
un solo comportamiento hasta que se obtiene el último elemento del conjunto de datos. No podemos mover de forma flexible la posición del iterador, por lo que la tarea del iterador es recorrer los elementos del conjunto de datos en un orden determinado.
Implementar un objeto iterable:
let obj = {
name: 'Kite',
age:23,
[Symbol('id')]: 20000219
}
obj[Symbol.iterator] = function(){
//返回一个迭代器
return {
index: 0,
next: function () {
const keys = Reflect.ownKeys(obj);
if(this.index < keys.length - 1 ) {
const key = keys[this.index];
this.index++;
return { done:false,value:obj[key] }
} else {
return { done:true, value: undefined }//迭代结束
}
}
}
}
for(let value of obj){
console.log(value) // Kite 23 20000219
}
for(let key in obj){
console.log(key) // name age
}
El concepto de objetos iterables:
El llamado objeto iterable es un Symbol.iterator
objeto ordinario con un método llamado método, que devuelve un iterador. Alternativamente, un objeto con Symbol.iterator
ambos next
métodos también es un objeto iterable.