javascript - que - sentencia if ejemplos
¿Qué significa que el cuerpo de un error de JSLint de una entrada debe incluirse en una declaración if significa (8)
@all: todo en JavaScript es un objeto (), por lo que las declaraciones como "solo usar esto en objetos" son un poco confusas. Además, JavaScript no está muy tipeado, por lo que 1 == "1" es verdadero (aunque 1 === "1" no lo es, Crockford es grande en esto). Cuando se trata del concepto progromático de matrices en JS, la tipificación es importante en la definición.
@Brenton - No es necesario ser un dictador de terminología; "matriz asociativa", "diccionario", "hash", "objeto", todos estos conceptos de programación se aplican a una estructura en JS. Son los pares de valores de nombre (clave, índice), donde el valor puede ser cualquier otro objeto (las cadenas también son objetos)
Entonces, la new Array()
es lo mismo que []
new Object()
es aproximadamente similar a {}
var myarray = [];
Crea una estructura que es una matriz con la restricción de que todos los índices (también conocidos como claves) deben ser un número entero. También permite la asignación automática de nuevos índices a través de .push ()
var myarray = ["one","two","three"];
De hecho, se trata mejor con via for(initialization;condition;update){
Pero que pasa:
var myarray = [];
myarray[100] = "foo";
myarray.push("bar");
Prueba esto:
var myarray = [], i;
myarray[100] = "foo";
myarray.push("bar");
myarray[150] = "baz";
myarray.push("qux");
alert(myarray.length);
for(i in myarray){
if(myarray.hasOwnProperty(i)){
alert(i+" : "+myarray[i]);
}
}
Quizás no sea el mejor uso de una matriz, sino solo una ilustración de que las cosas no siempre son claras.
Si conoce sus claves, y definitivamente si no son números enteros, su única opción de estructura de matriz es el objeto.
var i, myarray= {
"first":"john",
"last":"doe",
100:"foo",
150:"baz"
};
for(i in myarray){
if(myarray.hasOwnProperty(i)){
alert(i+" : "+myarray[i]);
}
}
JSLint en un archivo JavaScript mío. Tiró el error:
for( ind in evtListeners ) {
Problema en la línea 41, carácter 9: El cuerpo de un for en debe estar envuelto en una declaración if para filtrar las propiedades no deseadas del prototipo.
¿Qué significa esto?
Douglas Crockford, el autor de jslint ha escrito (y hablado) sobre este tema muchas veces. Hay una sección en this página de su sitio web que cubre esto:
para la declaración
Una clase de declaraciones debe tener la siguiente forma:
for (initialization; condition; update) { statements } for (variable in object) { if (filter) { statements } }
La primera forma debe utilizarse con matrices y con bucles de un número predeterminado de iteraciones.
La segunda forma debe ser usada con objetos. Tenga en cuenta que los miembros que se agregan al prototipo del objeto se incluirán en la enumeración. Es aconsejable programar a la defensiva utilizando el método hasOwnProperty para distinguir los miembros verdaderos del objeto:
for (variable in object) { if (object.hasOwnProperty(variable)) { statements } }
Crockford también tiene una serie de videos sobre el teatro YUI donde habla sobre esto. La serie de videos / charlas sobre javascript de Crockford son una visita obligada si se trata de un poco en serio sobre javascript.
En primer lugar, nunca use un bucle for in
para enumerar sobre una matriz. Nunca. Use good old for(var i = 0; i<arr.length; i++)
.
La razón detrás de esto es la siguiente: cada objeto en JavaScript tiene un campo especial llamado prototype
. Todo lo que agregue a ese campo será accesible en cada objeto de ese tipo. Supongamos que desea que todas las matrices tengan una nueva y genial función llamada filter_0
que filtre los ceros.
Array.prototype.filter_0 = function() {
var res = [];
for (var i = 0; i < this.length; i++) {
if (this[i] != 0) {
res.push(this[i]);
}
}
return res;
};
console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]
Esta es una forma estándar de extender objetos y agregar nuevos métodos. Muchas bibliotecas hacen esto. Sin embargo, veamos cómo funciona for in
:
var listeners = ["a", "b", "c"];
for (o in listeners) {
console.log(o);
}
//prints:
// 0
// 1
// 2
// filter_0
¿Lo ves? De repente piensa que filter_0 es otro índice de matriz. Por supuesto, no es realmente un índice numérico, sino for in
enumera a través de campos de objeto, no solo índices numéricos. Así que ahora estamos enumerando a través de cada índice numérico y filter_0
. Pero filter_0
no es un campo de ningún objeto de matriz en particular, cada objeto de matriz tiene esta propiedad ahora.
Afortunadamente, todos los objetos tienen un método hasOwnProperty
, que verifica si este campo pertenece realmente al objeto en sí o si simplemente se hereda de la cadena del prototipo y, por lo tanto, pertenece a todos los objetos de ese tipo.
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
Tenga en cuenta que, aunque este código funciona como se espera para las matrices, nunca, nunca , debe usar for in
y for each in
para matrices. Recuerde que for in
enumera los campos de un objeto, no índices de matriz o valores.
var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
// happy
Esto significa que debe filtrar las propiedades de evtListeners con el método hasOwnProperty .
La respuesta de Vava está en la marca. Si usa jQuery, entonces la función $.each()
se encarga de esto, por lo que es más seguro de usar.
$.each(evtListeners, function(index, elem) {
// your code
});
Malo: (jsHint lanzará un error)
for (var name in item) {
console.log(item[name]);
}
Bueno:
for (var name in item) {
if (item.hasOwnProperty(name)) {
console.log(item[name]);
}
}
Seguro que es un poco extremo decirlo.
... nunca use un bucle for in para enumerar sobre una matriz. Nunca. Use good old para (var i = 0; i <arr.length; i ++)
?
Cabe destacar la sección del extracto de Douglas Crockford.
... La segunda forma debe ser usada con objetos ...
Si necesita una matriz asociativa (también conocida como tabla / tabla hash) donde las teclas se nombren en lugar de indexarse numéricamente, deberá implementar esto como un objeto, por ejemplo, var myAssocArray = {key1: "value1", key2: "value2"...};
.
En este caso, myAssocArray.length
aparecerá como nulo (porque este objeto no tiene una propiedad ''length''), y su i < myAssocArray.length
no lo llevará muy lejos. Además de proporcionar una mayor comodidad, esperaría que los arrays asociativos ofrezcan ventajas de rendimiento en muchas situaciones, ya que las claves del arreglo pueden ser propiedades útiles (es decir, la propiedad o el nombre de la identificación del miembro del arreglo), lo que significa que no tiene que recorrer un largo tiempo. la matriz evalúa repetidamente si las instrucciones encuentran la entrada de la matriz que está buscando.
De todos modos, gracias también por la explicación de los mensajes de error de JSLint, usaré la verificación ''isOwnProperty'' ahora cuando interactúo a través de mis innumerables matrices asociativas.
Solo para agregar al tema de para in / for / $. Cada uno, agregué un caso de prueba jsperf para usar $ .each vs for en: http://jsperf.com/each-vs-for-in/2
Diferentes navegadores / versiones lo manejan de manera diferente, pero parece que $. Cada uno y directamente hacia adentro son las opciones más baratas en cuanto a rendimiento.
Si está utilizando para entrar en iteración a través de una matriz / objeto asociativo, sabiendo lo que está buscando e ignorando todo lo demás, use $. Cada vez que use jQuery, o solo para in (y luego una pausa; una vez que haya Alcanzó lo que sabes que debería ser el último elemento.
Si está iterando a través de una matriz para realizar algo con cada par de claves, debe usar el método hasOwnProperty si NO usa jQuery, y use $ .each si DEBE usar jQuery.
Siempre use for(i=0;i<o.length;i++)
si no necesita una matriz asociativa, aunque ... lol chrome se ejecutó ese 97% más rápido que para in o $.each