2009-12-25 23 views

Respuesta

52

Si desea comprobar si existe una matriz x, y crearlo si no lo hace, puede hacerlo

x = (typeof x != 'undefined' && x instanceof Array) ? x : [] 
+2

Esto funciona en la mayoría de los casos, pero no te cubrirá si planeas consultar una matriz instanciada de un constructor 'Array' global distinto; esto podría ocurrir al crear scripts en marcos. – James

+1

Eso es verdad. ¿Cómo manejaría uno ese caso? – Rich

+2

@ Rich: vea mi respuesta aquí: http://stackoverflow.com/questions/1961528/javascript-check-if-array-exist-if-not-create-it/1961653#1961653, se comportará correctamente en multi- entornos DOM enmarcados. – CMS

11

Puede utilizar el typeof operator para la prueba de indefinido y la instanceof operator para probar si se trata de una instancia de matriz:

if (typeof arr == "undefined" || !(arr instanceof Array)) { 
    var arr = []; 
} 
+0

Para mi ojo, esto es más fácil de leer que la versión de Rich. – DOK

+0

Puede omitir el primer control, porque 'undefined' no es una instancia de Array. – whitfin

+1

@zackehh Si lo hace, puede generar un error si 'arr' aún no está definido – David

-4

Si estamos hablando de un entorno de navegador a continuación, todas las variables globales son miembros del objeto ventana Así que para comprobar:

if (window.somearray !== undefined) { 
    somearray = []; 
} 
+0

Lo siento, mala respuesta. Ver la respuesta de Gumbo para un mejor código. – slebetman

43
var arr = arr || []; 
+10

Pero esto no comprueba si * arr * es una matriz. – Gumbo

+4

Tienes razón. No quedó claro a partir de la pregunta si es necesario verificar que se trataba de una matriz por adelantado, o simplemente verificar si la variable ya está definida. Este es un modismo común, y es más corto y más simple que los otros publicados, así que pensé que lo publicaría y dejaría que el interrogador decidiera si era suficiente. –

+2

Si 'arr' ya está definido en el ámbito correspondiente, entonces ¿por qué molestarse con' var ... '? Puedes hacer 'arr = arr || []; ' – James

6

Si desea comprobar si el el objeto ya es una matriz, para evitar la well known issues del operador instanceof cuando se trabaja en entornos multi-enmarcado DOM, se puede utilizar el método de Object.prototype.toString:

arr = Object.prototype.toString.call(arr) == "[object Array]" ? arr : []; 
+0

Necesidad de declarar' arr' – kangax

+0

@kangax La declaración no es necesaria en este contexto. –

+0

@Justin Johnson ¿Cómo es eso? – kangax

9
let list = Array.isArray(x) ? x : []; 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

O si var x podría ser una matriz y que desea asegurarse de que es uno:

let list = [].concat(x); 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat

+0

Lanza 'x no está definido' en ambos casos –

+1

'x' es la variable que podría ser una matriz o no. Tú defines eso. Este es solo un código de ejemplo ... – mynameistechno