script recorrer objetos lista español ecmascript definicion array javascript properties

recorrer - lista de objetos javascript



Detección de objetos JavaScript: sintaxis de punto versus palabra clave ''in'' (5)

Definitivamente if (''property'' in object) es el camino correcto a seguir. Eso realmente prueba si la propiedad está en el objeto (o en su cadena de prototipos, más sobre eso a continuación).

if (object.property) por otro lado, coaccionará ''propiedad'' en un valor de verdad / flase. Si la propiedad no está configurada, devolverá "indefinido", que se forzará en falso y parecerá que funciona. Pero esto también fallará para un número de otros valores de propiedades establecidos. javascript es notoriamente inconsistente en lo que trata como truthy y falsy.

Finalmente, como dije antes, ''property'' in ''object'' devolverá verdadero si está en cualquier parte de la cadena de prototipos. Si desea probar eso en el objeto mismo y no en un lugar más alto de la cadena, use el método hasOwnProperty la hasOwnProperty manera:

if (object.hasOwnProperty(''property'')) ...

He visto dos formas de detectar si un UA implementa una propiedad JS específica: if(object.property) y if(''property'' in object) .

Me gustaría escuchar opiniones sobre qué es mejor y, lo más importante, por qué. ¿Es uno inequívocamente mejor que el otro? ¿Hay algo más que estas dos formas de hacer la detección de propiedad del objeto? Por favor, cubra el soporte del navegador, las trampas, la velocidad de ejecución, y cosas así, en lugar de la estética.

Edición: se anima a los lectores a ejecutar las pruebas en jsperf.com/object-detection


El primero fallaría si "property" es falso de 0. Para asegurarse de que realmente exista una propiedad, debe verificar ese object.property !== undefined , o usar in-keyword.

[Editar]

También está la función hasOwnProperty, pero nunca he usado esa, así que no puedo decir mucho al respecto. Aunque creo que no volverá a ser cierto si la propiedad está configurada en un prototipo, que a veces desea, otras veces no desea.


Esto le permite usar window.hasOwnProperty como referencia a sí mismo o a otra cosa, independientemente de su servidor de secuencias de comandos.

// No enclosing functions here if (!(''hasOwnProperty'' in this)) function hasOwnProperty(obj, prop) { var method = Object.prototype.hasOwnProperty; if (prop === undefined) return method.call(this, obj); return method.call(obj, prop); } //Example of use var global = global || this; //environment-agnostic way to get the global object var x = ''blah''; WScript.Echo(global.hasOwnProperty(''x'') ? ''true'' : ''false''); //true //Use as non-object method var y = { z: false }; WScript.Echo(hasOwnProperty(y, ''z'') ? ''true'' : ''false''); //true WScript.Echo(hasOwnProperty(y, ''w'') ? ''true'' : ''false''); //false // true ಠ_ಠ WScript.Echo(hasOwnProperty(global, ''hasOwnProperty'') ? ''true'' : ''false'');


Realmente depende de lo que quieras lograr. ¿Estás hablando de objetos host (como window y nodos DOM)? Si es así, la comprobación más segura es typeof , que funciona para todos los objetos host que conozco:

if (typeof object.property != "undefined") { ... }

Notas:

  • Evite object.hasOwnProperty() para objetos host, porque los objetos host no están obligados a heredar de Object.prototype y, por lo tanto, pueden no tener un método hasOwnProperty() (y de hecho en IE <9, generalmente no lo hacen).
  • Una simple coerción booleana (por ejemplo, if (object.property) { ... } ) es una prueba pobre de la existencia de una propiedad, ya que dará falsos negativos para los valores falsy. Por ejemplo, para un área de texto vacía, if (textarea.selectionStart) { ... } no ejecutará el bloque aunque exista la propiedad. Además, algunas propiedades del objeto host arrojan un error en las versiones anteriores de IE al intentar forzar a un booleano (por ejemplo, var xhr = new ActiveXObject("Microsoft.XMLHTTP"); if (xhr.responseXML) { ... } ).
  • El operador in es una mejor prueba de la existencia de una propiedad, pero una vez más no hay garantías de compatibilidad con ella en los objetos host.
  • Recomiendo no considerar el rendimiento para este tipo de tarea. Elija la opción más segura para su proyecto y solo optimícese más tarde. Es casi seguro que habrá muchos mejores candidatos para la optimización que las verificaciones de existencia de la propiedad.

Para obtener más información al respecto, recomiendo este excelente artículo de Peter Michaux .


  • if(object.property)

    fallará en los casos en que no esté configurado (que es lo que desea), y en los casos en que se haya establecido en algún valor falsey, por ejemplo, undefined , null , 0 , etc. (que no es lo que usted desea).

    var object = {property: 0}; if(object.isNotSet) { ... } // will not run if(object.property) { ... } // will not run

  • if(''property'' in object)

    es un poco mejor, ya que realmente devolverá si el objeto realmente tiene la propiedad, no solo mirando su valor.

    var object = {property: 0}; if(''property'' in object) { ... } // will run if(''toString'' in object) { ... } // will also run; from prototype

  • if(object.hasOwnProperty(''property''))

    es incluso mejor, ya que le permitirá distinguir entre las propiedades de la instancia y las propiedades del prototipo.

    var object = {property: 0}; if(object.hasOwnProperty(''property'')) { ... } // will run if(object.hasOwnProperty(''toString'')) { ... } // will not run

Yo diría que el rendimiento no es tan importante aquí, a menos que esté verificando miles de veces por segundo, pero en ese caso debería considerar otra estructura de código. Todas estas funciones / sintaxis son compatibles con los navegadores recientes, hasOwnProperty existe desde hace mucho tiempo.

Editar: También puede hacer una función general para verificar la existencia de una propiedad pasando cualquier cosa (incluso cosas que no son objetos) como un objeto como este:

function has(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }

Ahora esto funciona:

has(window, ''setTimeout''); // true

incluso si window.hasOwnProperty === undefined (que es el caso en IE versión 8 o inferior).