variable script error comprobar javascript

javascript - script - Comprobando si algo es iterable



undefined javascript error (4)

En los documentos de MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

Se describe que el for...of constructo es capaz de iterar sobre objetos "iterables". Pero, ¿hay una buena forma de decidir si un objeto es iterable?

He intentado encontrar propiedades comunes para matrices, iteradores y generadores, pero no he podido hacerlo.

Aparte de hacer un for ... of en un bloque de prueba y verificar si hay errores de tipo, ¿hay una forma clara de hacerlo?


¿Por qué tan detallado?

const isIterable = object => object != null && typeof object[Symbol.iterator] === ''function''


Hoy en día, como ya se dijo, para probar si obj es iterable solo hazlo

obj != null && typeof obj[Symbol.iterator] === ''function''

Respuesta histórica (no más válida)

El for..of constructo es parte del ECMASCript 6th edition Language Specification Draft. Por lo tanto, podría cambiar antes de la versión final.

En este borrador, los objetos iterable deben tener el iterator función como una propiedad.

Puede verificar si un objeto es iterable de esta manera:

function isIterable(obj){ if(obj === undefined || obj === null){ return false; } return obj.iterator !== undefined; }


La forma correcta de verificar la iterabilidad es la siguiente:

function isIterable(obj) { // checks for null and undefined if (obj == null) { return false; } return typeof obj[Symbol.iterator] === ''function''; }

Por qué funciona esto (protocolo iterativo en profundidad): https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols

Como estamos hablando de ... de, supongo, estamos en la mentalidad ES6.

Además, no se sorprenda de que esta función devuelva true si obj es una cadena, ya que las cadenas se repiten sobre sus caracteres.


CUIDADO con la definición de iterable . Si vienes de otros idiomas, esperarías que algo iterable con, digamos, un ciclo for sea iterable . Me temo que ese no es el caso aquí donde iterable significa algo que implementa el https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols .

Para aclarar todo, todos los ejemplos anteriores devuelven false en este objeto {a: 1, b: 2} porque ese objeto no implementa el protocolo de iteración. Entonces no podrás iterar sobre eso con un for...of PERO aún puedes con un for...in .

Por lo tanto, si desea evitar errores dolorosos, haga que su código sea más específico al renombrar su método como se muestra a continuación:

/** * @param variable * @returns {boolean} */ const hasIterationProtocol = variable => variable !== null && Symbol.iterator in Object(variable);