2010-12-06 30 views

Respuesta

60

prop hará referencia al nombre de la propiedad, no a su valor.

for (var prop in obj) { 
    obj[prop] = 'xxx'; 
} 

Construct documentation.

También es posible que desee comprobar si la propiedad pertenece al objeto utilizando hasOwnProperty. Puede suceder que alguien agregue propiedades al prototipo y que también sean iteradas por for ... in.

75

Debe comprobar que la propiedad pertenece al objeto y no a un prototipo.

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     obj[prop] = 'xxx'; 
    } 
} 
+0

¿Por qué habría todavía que desee comprobar "hasOwnProperty"? ¿Qué puede salir mal con "prop in obj"? – Matthias

1

Si estás en una Entorno amigable de ES6, también puedes probar usar el bucle for ... que está más cerca de tu intento original.

EDITAR: Como Caleb señaló, for..of es específico para colecciones con la propiedad Symbol.iterator (por ejemplo, objetos JS no estándar).

Pero dejo esta respuesta aquí en caso de que alguien más encuentre útil en algún momento que se indique explícitamente que un for..of no es una gran solución aquí.

let obj = {}; 

for (let prop of obj) { // This will throw an error 
    prop = 'xxx'; 
} 

Referencia: MDN - for...of

+0

Creo que necesita un pequeño ajuste ya que 'obj' no es una matriz. También es mejor usar 'let' si tienes un entorno ES6. 'para (deja prop de Object.keys (obj)) {obj [prop] = 'xxx'; } ' – Caleb

+0

@Caleb El punto del bucle 'for ... of' es iterar sobre un objeto, no una matriz. Si va a buscar las claves, entonces también puede usar un ciclo estándar for pero también hace que el código sea innecesariamente complejo. +1 al usar 'let' tho – relic

+0

Lo probé en [jsfiddle] (https://jsfiddle.net/#&togetherjs=fvqkIMVeuL) para verificarlo pero el 'for ... of' no puede iterar a través de un objeto. Responde con un error 'Uncaught TypeError: obj [Symbol.iterator] no es una función'. Pero sí, no parece muy útil si tienes que escribir lo que tengo arriba en mi comentario ... – Caleb

Cuestiones relacionadas