Есть ли в JavaScript оператор «не в» для проверки свойств объекта?

184

Есть ли в JavaScript какой-либо оператор «не в», чтобы проверить, не существует ли свойство в объекте? Я не мог найти ничего об этом вокруг Google или переполнения стека. Вот небольшой фрагмент кода, над которым я работаю, где мне нужна такая функциональность:

var tutorTimes = {};

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

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

Как вы видите, я бы все изложил в elseзаявлении. Мне кажется неправильным устанавливать оператор if- elseтолько для использования elseчасти.

Аарон
источник
4
Я думаю, вы могли бы хотеть var id = ...в своей функции.
Кобби

Ответы:

340

Мне кажется неправильным устанавливать оператор if / else только для использования части else ...

Просто отрицайте свое состояние, и вы получите elseлогику внутри if:

if (!(id in tutorTimes)) { ... }
Jordão
источник
11
Этот стиль также исправляет предупреждение JSHint "Запутанное использование '!'", ( ! somekey in someobj )
Которое
3
Обратите внимание, что при поиске имени свойства в любом месте цепочки прототипов. Смотрите мой ответ для более подробной информации.
около
25
Я понимаю, что в настоящее время это лучшее решение, но согласен ли кто-нибудь еще, что это некрасиво?
Иона
3
Если это уродливо, тогда просто оберните это в функцию и дайте ему красивое имя Klet keyExists = (key, obj) => key in obj
Kamafeather
Я абсолютно согласен. Действительно, мои навыки именования тоже могут быть улучшены 😁. let hasProperty"выглядит" лучше
Kamafeather
37

Как уже сказал Джордао, просто отрицайте это:

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

Примечание. В приведенном выше тесте свойство tutorTimes имеет свойство с именем, указанным в id, в любом месте цепочки прототипов. Например, "valueOf" in tutorTimesвозвращает true, поскольку оно определено в Object.prototype .

Если вы хотите проверить, не существует ли свойства в текущем объекте, используйте hasOwnProperty:

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

Или, если у вас есть ключ hasOwnPropery, вы можете использовать это:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }
некоторые
источник
Есть ли безопаснее завернуть ключ в кавычки и использовать if(!tutorTimes.hasOwnProperty('id')) ...?
Маджид Фуладпур
@MajidFouladpour id- это переменная, которая может иметь любое значение, 'id'представляет собой строку с двумя буквами i и d , поэтому hasOwnProperty(id)проверяет, существует ли свойство, указанное в переменной id , и hasOwnProperty('id')проверяет, существует ли свойство с именем id.
некоторые
18

Лично я нахожу

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

легче читать, чем

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

но оба будут работать.

фураж
источник
14

Две быстрые возможности:

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

или

if(myObj['foo'] === undefined) { ... }
reedlauber
источник
5
Используйте 'undefined' === typeof xxxвместо этого. undefinedне является зарезервированным словом и на самом деле является глобальной переменной, которую можно перезаписать (что приводит к трудностям в поиске ошибок)
hugomg
9
@hippietrail не работает ... после "!" требуются символы и вокруг'foo' in myObj)
Фил Купер
4
myObj['foo']может существовать как свойство и просто быть установленным undefined(т. е. с оператором myObj.foo = undefined). Если вы действительно хотите увидеть, не существует ли само свойство, вам нужна !('foo' in myObj)нотация.
Ричард Коннамахер,
Для тех, кто заботится о производительности, проверка myObj.foo === undefinedвыполняется намного быстрее (хотя и потенциально опасно): jsperf.com/not-in-vs-is-undefined .
etpinard
@ Hugomg Я не думаю, что это очень хороший аргумент, чтобы не использовать === undefined. Многое может сломаться, если люди злоупотребляют языком программирования, выполняя такие действия, как, например, перезапись undefinedв JavaScript. Также см .: stackoverflow.com/questions/8783510/…
Zero3