¿Hay un operador "no en" en JavaScript para verificar las propiedades del objeto?

183

¿Hay algún tipo de operador "no en" en JavaScript para verificar si una propiedad no existe en un objeto? No pude encontrar nada sobre esto en Google o Stack Overflow. Aquí hay un pequeño fragmento de código en el que estoy trabajando donde necesito este tipo de funcionalidad:

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

Como puede ver, estaría poniendo todo en la elsedeclaración. Me parece incorrecto configurar una declaración if- elsesolo para usar la elseporción.

Aaron
fuente
44
Creo que es posible que desee var id = ...en su función.
Cobby

Respuestas:

338

Me parece incorrecto configurar una declaración if / else solo para usar la parte else ...

Simplemente niegue su condición y obtendrá la elselógica dentro de if:

if (!(id in tutorTimes)) { ... }
Jordão
fuente
11
Este estilo también corrige la advertencia de JSHint "Uso confuso de '!'" Que obtendrías si lo ( ! somekey in someobj )
hicieras
3
Tenga en cuenta que en las búsquedas del nombre de la propiedad en cualquier parte de la cadena de prototipos. Vea mi respuesta para más detalles.
Algunos
25
Entiendo que esta es actualmente la mejor solución, pero ¿alguien más está de acuerdo en que esto es un poco feo?
Jonás
3
Si es feo, simplemente envuélvelo en una función y dale un hermoso nombre 🙃let keyExists = (key, obj) => key in obj
Kamafeather
Estoy totalmente de acuerdo. De hecho, mis habilidades para nombrar también podrían mejorarse 😁. let hasProperty"se ve" mejor
Kamafeather
37

Como ya dijo Jordão, solo niega:

if (!(id in tutorTimes)) { ... }

Nota: La prueba anterior si tutorTimes tiene una propiedad con el nombre especificado en id, en cualquier lugar de la cadena de prototipos. Por ejemplo, "valueOf" in tutorTimesdevuelve verdadero porque está definido en Object.prototype .

Si desea probar si una propiedad no existe en el objeto actual, use hasOwnProperty:

if (!tutorTimes.hasOwnProperty(id)) { ... }

O si puede tener una clave que es hasOwnPropery , puede usar esto:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }
algunos
fuente
¿Es más seguro envolver la clave entre comillas y usarla if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour
@MajidFouladpour ides una variable que podría tener cualquier valor, 'id'es una cadena con las dos letras i y d , por lo que hasOwnProperty(id)comprueba si existe la propiedad especificada en la variable id , y hasOwnProperty('id')comprueba si hay una propiedad llamada id.
Algunos
17

Personalmente encuentro

if (id in tutorTimes === false) { ... }

más fácil de leer que

if (!(id in tutorTimes)) { ... }

Pero ambos funcionarán.

Forraje
fuente
14

Dos posibilidades rápidas:

if(!('foo' in myObj)) { ... }

o

if(myObj['foo'] === undefined) { ... }
reedlauber
fuente
55
Usar en su 'undefined' === typeof xxxlugar. undefinedNo es una palabra reservada y en realidad es una variable global que se puede sobrescribir (que conduce a errores difíciles de encontrar)
hugomg
9
@hippietrail no funciona ... se requieren los padres después del "!" y alrededor del'foo' in myObj)
Phil Cooper
44
myObj['foo']podría existir como una propiedad y simplemente establecerse en undefined(es decir, con la declaración myObj.foo = undefined). Si realmente quiere ver si la propiedad en sí no existe, necesita la !('foo' in myObj)notación.
Richard Connamacher
Para el rendimiento consciente entre nosotros, la verificación myObj.foo === undefinedes mucho más rápida (aunque potencialmente peligrosa): jsperf.com/not-in-vs-is-undefined .
etpinard
@hugomg No creo que sea un muy buen argumento para no usar === undefined. Muchas cosas pueden romperse si las personas abusan de un lenguaje de programación haciendo cosas como, por ejemplo, sobrescribir undefineden JavaScript. Además, consulte: stackoverflow.com/questions/8783510/…
Zero3