Existe um operador "not in" no JavaScript para verificar as propriedades do objeto?

182

Existe algum tipo de operador "não incluído" no JavaScript para verificar se uma propriedade não existe em um objeto? Não consegui encontrar nada sobre isso no Google ou no Stack Overflow. Aqui está um pequeno trecho de código no qual estou trabalhando, onde preciso desse tipo de funcionalidade:

var tutorTimes = {};

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

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

Como você pode ver, eu colocaria tudo na elsedeclaração. Parece-me errado configurar uma declaração if- elseapenas para usar a elseparte.

Aaron
fonte
4
Eu acho que você pode querer var id = ...em sua função.
Cobby

Respostas:

338

Parece-me errado configurar uma instrução if / else apenas para usar a parte else ...

Apenas negue sua condição e você obterá a elselógica dentro de if:

if (!(id in tutorTimes)) { ... }
Jordão
fonte
11
Esse estilo também corrige o aviso JSHint "Uso confuso de '!'" Que você receberia se o fizesse se( ! somekey in someobj )
mikemaccana
3
Observe que, na pesquisa do nome da propriedade em qualquer lugar da cadeia de protótipos. Veja minha resposta para mais detalhes.
alguns
25
Entendo que atualmente essa é a melhor solução, mas alguém concorda que isso é meio feio?
Jonah #
3
Se é feio em seguida, basta envolvê-la em uma função e dar-lhe um nome bonito 🙃let keyExists = (key, obj) => key in obj
Kamafeather
Eu concordo totalmente. Na verdade, minhas habilidades de nomeação também podem ser aprimoradas 😁. let hasProperty"parece" melhor
Kamafeather 27/08/18
37

Como já disse Jordão, negue:

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

Nota: O teste acima, se tutorTimes, tiver uma propriedade com o nome especificado em id, em qualquer lugar da cadeia de protótipos. Por exemplo, "valueOf" in tutorTimesretorna true porque está definido em Object.prototype .

Se você deseja testar se uma propriedade não existe no objeto atual, use hasOwnProperty:

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

Ou, se você pode ter uma chave que é hasOwnPropery, pode usar isto:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }
alguns
fonte
É mais seguro colocar a chave entre aspas e usá-la if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour
@MajidFouladpour idé uma variável que pode ter qualquer valor, 'id'é uma string com as duas letras i e d , assim que hasOwnProperty(id)verifica se a propriedade especificada na variável id existe, e hasOwnProperty('id')verifica se existe uma propriedade chamada id.
alguns
16

Pessoalmente, acho

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

mais fácil de ler do que

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

mas ambos irão funcionar.

Forragem
fonte
14

Duas possibilidades rápidas:

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

ou

if(myObj['foo'] === undefined) { ... }
reedlauber
fonte
5
Use em 'undefined' === typeof xxxvez disso. undefinednão é uma palavra reservada e, na verdade, é uma variável global que pode ser substituída (levando a erros difíceis de encontrar)
hugomg
9
@hippietrail não funciona ... as parênteses são necessárias após o "!" e ao redor do'foo' in myObj)
Phil Cooper
4
myObj['foo']pode existir como uma propriedade e simplesmente ser definido como undefined(ou seja, com a instrução myObj.foo = undefined). Se você realmente deseja ver se a propriedade em si não existe, precisará da !('foo' in myObj)notação.
Richard Connamacher 4/12/12
Para o desempenho consciente entre nós, a verificação myObj.foo === undefinedé muito mais rápida (embora potencialmente perigosa): jsperf.com/not-in-vs-is-undefined .
Etpinard
@ hugomg Eu não acho que esse seja um argumento muito bom para não usar === undefined. Muitas coisas podem quebrar se as pessoas abusarem de uma linguagem de programação fazendo coisas como, por exemplo, substituindo undefinedem JavaScript. Além disso, consulte: stackoverflow.com/questions/8783510/…
Zero3