¿Cómo verifico si un objeto tiene una propiedad específica en JavaScript?
Considerar:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
¿Es esa la mejor manera de hacerlo?
javascript
fundas
fuente
fuente

inyhasOwnPropertysalió mucho más lento que los demás para mí (98% más lento). No me sorprendehasOwnPropertyser más lento, pero sí me sorprendein.Respuestas:
Estoy realmente confundido por las respuestas que se han dado, la mayoría de ellas son completamente incorrectas. Por supuesto, puede tener propiedades de objeto que tengan valores indefinidos, nulos o falsos. Por lo tanto, simplemente reducir el control de la propiedad
typeof this[property]o, lo que es peor,x.keyle dará resultados completamente engañosos.Depende de lo que estés buscando. Si desea saber si un objeto contiene físicamente una propiedad (y no proviene de algún lugar de la cadena de prototipos), entonces ese
object.hasOwnPropertyes el camino a seguir. Todos los navegadores modernos lo admiten. (Faltaba en las versiones anteriores de Safari - 2.0.1 y anteriores, pero esas versiones del navegador rara vez se usan más).Si lo que está buscando es si un objeto tiene una propiedad que es iterable (cuando itera sobre las propiedades del objeto, aparecerá), entonces hacer:
prop in objectle dará el efecto deseado.Dado que usar
hasOwnPropertyes probablemente lo que desea, y teniendo en cuenta que es posible que desee un método alternativo, le presento la siguiente solución:Lo anterior es una solución funcional para todos los navegadores,
hasOwnPropertycon una advertencia: es incapaz de distinguir entre casos en los que hay una propiedad idéntica en el prototipo y en la instancia, simplemente supone que proviene del prototipo. Puede cambiarlo para que sea más indulgente o estricto, según su situación, pero al menos esto debería ser más útil.fuente
var w = opts.w || 100;. Pero si se encuentra en una biblioteca de algún tipo, es posible que deba ir un poco más lejos en algunas partes.__proto__a nulo? Imp. Simple:function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }(obj.constructor.prototypeDebe agregarse un caso con ).__proto__no es estándar y no funciona en algunos navegadores antiguos. E incluso con la reciente incorporación delObject.getPrototypeOfestándar dice que aún no puede cambiar el prototipo de un objeto existente.for(prop in object)bucle itera solo propiedades enumerables. Sin embargo,prop in objectverifica siobjecttiene la propiedadpropen algún lugar de la cadena prototípica, independientemente de si es enumerable o no.Con
Underscore.jso ( incluso mejor )lodash:Que llama
Object.prototype.hasOwnProperty, pero (a) es más corto de escribir, y (b) usa "una referencia segura ahasOwnProperty" (es decir, funciona incluso sihasOwnPropertyse sobrescribe).En particular, lodash define
_.hascomo:fuente
npm install lodash.hasexponer un módulo npm con solo unahasfunción que compila hasta 175 bytes cuando se minimiza. También es interesantelodash.has/index.jsobservar cómo funciona una biblioteca muy popular y confiable.lodashlas versiones funcionan con esto:.has(undefined, 'someKey') => falsemientrasunderscoreregresaundefinedlodashcomo "otra dependencia" más: es una biblioteca bastante común (si no LA más común) para este tipo de cosas. Diviértete reinventando la rueda.¿Qué pasa?
fuente
inoperador o no. También tenga en cuenta que elinoperador tiene un excelente soporte de navegadorIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+stackoverflow.com/questions/2920765/…intambién verifica las propiedades del prototipo, mientras que solohasOwnPropertyitera las propiedades definidas por el usuario. Referencia: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…'key' in xhacer el trabajo con matrices. Prueba: stackoverflow.com/questions/33592385/…Nota : lo siguiente es hoy en día bastante obsoleto gracias al modo estricto, y
hasOwnProperty. La solución correcta es usar el modo estricto y verificar la presencia de una propiedad usandoobj.hasOwnProperty. Esta respuesta es anterior a estas dos cosas, al menos tan ampliamente implementadas (sí, es tan antigua). Tome lo siguiente como nota histórica.Tenga en cuenta que
undefined(desafortunadamente) no es una palabra reservada en JavaScript si no está utilizando el modo estricto. Por lo tanto, alguien (alguien más, obviamente) podría tener la gran idea de redefinirlo, rompiendo su código.Por lo tanto, un método más robusto es el siguiente:
Por otro lado, este método es mucho más detallado y también más lento. : - /
Una alternativa común es asegurarse de que en realidad no
undefinedesté definida, por ejemplo, al poner el código en una función que acepte un parámetro adicional, llamado , al que no se le pasa un valor. Para asegurarse de que no se le pase un valor, puede llamarlo usted mismo de inmediato, por ejemplo:undefinedfuente
void 0está definido para devolver el canónicoundefined, ¿podría uno hacerx.attribute !== void 0?(function (undefined) { // undefined is actually undefined here })();Armin Ronacher parece que ya me ganó , pero:
Una más seguro, pero la solución más lenta, como se ha señalado por Konrad Rudolph y Armin Ronacher sería la siguiente:
fuente
x.hasOwnProperty('toString') === true;Object.prototypeYa tiene incorporado, correctohasOwnProperty. Sobrescribirlo con una implementación incorrecta (1. Las propiedades pueden tener el valorundefined, 2. Esto dará falsos positivos para las propiedades heredadas) es una idea horriblemente mala. Las respuestas incorrectas pueden y deben eliminarse. No sé si podría hacerlo en septiembre del 2008 cuando vio la respuesta de Resig , así que comente para sugerir que lo haga ahora.Puede usar el
inoperador para verificar si la propiedad existe en un objeto:También puede recorrer todas las propiedades del objeto usando un
for - inciclo y luego verificar la propiedad específica:Debe considerar si esta propiedad de objeto es enumerable o no, porque las propiedades no enumerables no se mostrarán en un
for-inbucle. Además, si la propiedad enumerable sombrea una propiedad no enumerable del prototipo, no aparecerá en Internet Explorer 8 y versiones anteriores.Si desea una lista de todas las propiedades de instancia, enumerables o no, puede usar
Esto devolverá una matriz de nombres de todas las propiedades que existen en un objeto.
Finalmente, puede usar el operador typeof para verificar directamente el tipo de datos de la propiedad del objeto:
Si la propiedad no existe en el objeto, devolverá la cadena indefinida. De lo contrario, devolverá el tipo de propiedad apropiado. Sin embargo, tenga en cuenta que esta no siempre es una forma válida de verificar si un objeto tiene una propiedad o no, ya que podría tener una propiedad que esté configurada como indefinida, en cuyo caso, el uso
typeof x.keyaún devolvería verdadero (aunque la clave aún esté en el objeto).Actualización: puede verificar si existe una propiedad comparándola con la propiedad de JavaScript no definida
Esto debería funcionar a menos que la clave se haya configurado específicamente
undefineden el objeto xfuente
Veamos un poco de confusión aquí. Primero, simplifiquemos asumiendo que
hasOwnPropertyya existe; Esto es cierto para la gran mayoría de los navegadores actuales en uso.hasOwnPropertydevuelve verdadero si el nombre del atributo que se le ha pasado se ha agregado al objeto. Es completamente independiente del valor real que se le asigna, que puede ser exactamenteundefined.Por lo tanto:
Sin embargo:
El problema es ¿qué sucede cuando un objeto en la cadena del prototipo tiene un atributo con el valor de indefinido?
hasOwnPropertyserá falso por eso, y también lo será!== undefined. Todavía,for..intodavía lo incluirá en la enumeración.La conclusión es que no hay una forma de navegador cruzado (ya que Internet Explorer no expone
__prototype__) para determinar que un identificador específico no se ha adjuntado a un objeto ni a nada en su cadena de prototipos.fuente
Si está buscando una propiedad, entonces "NO". Usted quiere:
En general, no debería importarle si la propiedad proviene o no del prototipo o del objeto.
Sin embargo, debido a que usó 'clave' en su código de muestra, parece que está tratando el objeto como un hash, en cuyo caso su respuesta tendría sentido. Todas las claves hash serían propiedades en el objeto, y evita las propiedades adicionales aportadas por el prototipo.
La respuesta de John Resig fue muy completa, pero pensé que no estaba clara. Especialmente con cuándo usar "'prop' en obj".
fuente
inoperador tiene un excelente soporte para el navegadorIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+stackoverflow.com/questions/2920765/…inoperador: "funciona con 'objetos' en sentido estricto, por lo que se declara como {} o se crea utilizando el constructor, no acepta matrices o primitivas. No es que el OP lo haya requerido, pero algunas otras respuestas presentan técnicas que son más amplias (funcionan con matrices, cadenas, etc.) "Para probar objetos simples use:
if (obj[x] !== undefined)Si no sabe qué tipo de objeto es, use:
if (obj.hasOwnProperty(x))Todas las demás opciones son más lentas.
Detalles
Evaluación de desempeño de 100,000,000 ciclos bajo Nodejs a las 5 opciones sugeridas por otros aquí:
La evaluación nos dice que, a menos que queramos verificar específicamente la cadena de prototipos del objeto, así como el objeto en sí, no deberíamos usar la forma común:
if (X in Obj)...es entre 2 y 6 veces más lento dependiendo del caso de usoEn pocas palabras, si su Obj no es necesariamente un objeto simple y desea evitar verificar la cadena de prototipos del objeto y asegurarse de que x es propiedad de Obj directamente, use 'if (obj.hasOwnProperty (x)) ...'.
De lo contrario, cuando se usa un objeto simple y no se preocupa por la cadena de prototipos del objeto, el uso
if (typeof(obj[x]) !== 'undefined')...es la forma más segura y rápida.Si usa un objeto simple como una tabla hash y nunca hace nada rizado, lo usaría
if (obj[x])...porque me parece mucho más legible.Que te diviertas.
fuente
Sí, lo es :) Creo que también puedes hacer
Object.prototype.hasOwnProperty.call(x, 'key')lo que también debería funcionar sixtiene una propiedad llamadahasOwnProperty:)Pero eso prueba las propiedades propias. Si desea verificar si tiene una propiedad que también se puede incluir, puede usarla
typeof x.foo != 'undefined'.fuente
Porque
falla si se
x.keyresuelve enfalse(por ejemplo,x.key = "").fuente
const x = {key: undefined};que devolverá falso con esta solución, whilex.hasOwnProperty('key')); // trueyReflect.has(x, 'key')); // true. La propiedad realmente existe, pero el valor esundefined.También puede usar el
Reflectobjeto ES6 :La documentación sobre MDN para
Reflect.hasse puede encontrar aquí .fuente
OK, parece que tuve la respuesta correcta a menos que no desee propiedades heredadas:
Estas son algunas otras opciones para incluir propiedades heredadas:
fuente
var x = { key: false };elx.keymétodo sería incorrecto.No haga esto
object.hasOwnProperty(key)), es realmente malo porque estos métodos pueden estar sombreados por las propiedades del objeto en cuestión, considere{ hasOwnProperty: false }, o el objeto puede ser un objeto nulo(Object.create(null)).La mejor manera es hacer
Object.prototype.hasOwnProperty.call(object, key)o:fuente
Otra forma relativamente simple es usar
Object.keys. Esto devuelve un valorarrayque significa que obtienes todas las características de una matriz.Aunque estamos en un mundo con gran soporte para navegadores. Debido a que esta pregunta es tan antigua, pensé agregar esto: es seguro de usar a partir de JS v1.8.5
fuente
Object.keys(info).indexOf('someotherthing') !== -1hasOwnProperty "se puede usar para determinar si un objeto tiene la propiedad especificada como propiedad directa de ese objeto; a diferencia del operador in , este método no comprueba la cadena de prototipos del objeto".
Lo más probable es que, para lo que parece su pregunta, no desee usar hasOwnProperty, que determina si la propiedad existe como adjunta directamente al objeto en sí .
Si desea determinar si la propiedad existe en la cadena de prototipos que desea utilizar, como:
Espero que esto ayude.
fuente
Con el riesgo de votación masiva, aquí hay otra opción para un caso específico. :)
Si desea probar un miembro en un objeto y desea saber si se ha establecido en algo diferente a:
entonces puedes usar:
fuente
Solución ECMA Script 6 con reflect. Crear envoltura como:
fuente
Existe un método "hasOwnProperty" en el objeto, pero no se recomienda llamar a este método directamente porque a veces el objeto es nulo o existe alguna propiedad en el objeto como:
{ hasOwnProperty: false }Entonces, la mejor manera sería:
fuente
Puede usar los siguientes enfoques:
La diferencia entre los siguientes enfoques es la siguiente:
fuente
Necesitas usar el método
object.hasOwnProperty(property). Devuelve verdadero si el objeto tiene la propiedad y falso si no lo tiene.fuente
Si la clave que está verificando está almacenada en una variable , puede verificarla así:
fuente
Por qué complicar demasiado las cosas cuando puedes hacer:
Simple y claro para la mayoría de los casos ...
fuente
const objectName = { keyname: false };, debería devolver verdadero, ya quekeynamees una propiedad deobjectname. Pero dado que el valor es falso, devolvería falso con esta lógica.