¿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
in
yhasOwnProperty
salió mucho más lento que los demás para mí (98% más lento). No me sorprendehasOwnProperty
ser 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.key
le 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.hasOwnProperty
es 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 object
le dará el efecto deseado.Dado que usar
hasOwnProperty
es 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,
hasOwnProperty
con 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.prototype
Debe agregarse un caso con ).__proto__
no es estándar y no funciona en algunos navegadores antiguos. E incluso con la reciente incorporación delObject.getPrototypeOf
está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 object
verifica siobject
tiene la propiedadprop
en algún lugar de la cadena prototípica, independientemente de si es enumerable o no.Con
Underscore.js
o ( 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 sihasOwnProperty
se sobrescribe).En particular, lodash define
_.has
como:fuente
npm install lodash.has
exponer un módulo npm con solo unahas
función que compila hasta 175 bytes cuando se minimiza. También es interesantelodash.has/index.js
observar cómo funciona una biblioteca muy popular y confiable.lodash
las versiones funcionan con esto:.has(undefined, 'someKey') => false
mientrasunderscore
regresaundefined
lodash
como "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
in
operador o no. También tenga en cuenta que elin
operador tiene un excelente soporte de navegadorIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
también verifica las propiedades del prototipo, mientras que solohasOwnProperty
itera las propiedades definidas por el usuario. Referencia: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…'key' in x
hacer 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
undefined
esté 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:undefined
fuente
void 0
está 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.prototype
Ya 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
in
operador para verificar si la propiedad existe en un objeto:También puede recorrer todas las propiedades del objeto usando un
for - in
ciclo 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-in
bucle. 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.key
aú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
undefined
en el objeto xfuente
Veamos un poco de confusión aquí. Primero, simplifiquemos asumiendo que
hasOwnProperty
ya existe; Esto es cierto para la gran mayoría de los navegadores actuales en uso.hasOwnProperty
devuelve 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?
hasOwnProperty
será falso por eso, y también lo será!== undefined
. Todavía,for..in
todaví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
in
operador tiene un excelente soporte para el navegadorIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
operador: "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 six
tiene 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.key
resuelve enfalse
(por ejemplo,x.key = ""
).fuente
const x = {key: undefined};
que devolverá falso con esta solución, whilex.hasOwnProperty('key')); // true
yReflect.has(x, 'key')); // true
. La propiedad realmente existe, pero el valor esundefined
.También puede usar el
Reflect
objeto ES6 :La documentación sobre MDN para
Reflect.has
se 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.key
mé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 valorarray
que 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') !== -1
hasOwnProperty "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 quekeyname
es una propiedad deobjectname
. Pero dado que el valor es falso, devolvería falso con esta lógica.