Чи є в JavaScript оператор "не в" для перевірки властивостей об'єкта?


183

Чи є якийсь оператор "не в" в JavaScript, щоб перевірити, чи немає властивості в об'єкті? Я нічого не можу знайти навколо цього навколо Google або Stack Overflow. Ось невеликий фрагмент коду, над яким я працюю, де мені потрібен такий функціонал:

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 = ...у своїй функції.
Коббі

Відповіді:


338

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

Просто заперечте свій стан, і ви отримаєте elseлогіку всередині if:

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

11
Цей стиль також фіксує попередження JSHint "Заплутане використання '!", Яке ви отримаєте, якщо зробите це, якщо( ! somekey in someobj )
mikemaccana

3
Зауважте, що при пошуку імені властивості в будь-якій точці ланцюга прототипу. Дивіться мою відповідь для більш детальної інформації.
десь

25
Я розумію, що це зараз найкраще рішення, але чи хтось інший погоджується, що це якось потворно?
Йона

3
Якщо це некрасиво, тоді просто загорніть його у функцію та дайте йому гарне ім’я 🙃let keyExists = (key, obj) => key in obj
Kamafeather

Я цілком погоджуюся. Дійсно, мої навички називання теж могли бути вдосконалені 😁. let hasProperty"виглядає" краще
Камафезер

37

Як уже сказав Йордао, просто заперечуйте це:

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

Примітка. Наведений вище тест, якщо tutorTimes має властивість з ім'ям, вказаним у id, у будь-якій точці ланцюга прототипу. Наприклад, "valueOf" in tutorTimesповертає true, тому що він визначений у Object.prototype .

Якщо ви хочете перевірити, чи немає властивості в поточному об'єкті, використовуйте hasOwnProperty:

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

Або якщо у вас може бути ключ, який маєOwnPropery, ви можете скористатися цим:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

Чи безпечніше загорнути ключ у лапки та використовувати if(!tutorTimes.hasOwnProperty('id')) ...?
Маджід Фуладпур

@MajidFouladpour id- це змінна, яка могла б мати будь-яке значення, 'id'це рядок з двома літерами i і d , тому hasOwnProperty(id)перевіряє, чи існує властивість, вказана в ідентифікаторі змінної , і hasOwnProperty('id')перевіряє, чи є властивість з ім'ям id.
десь

17

Особисто я знаходжу

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

легше читати, ніж

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

але обидва будуть працювати.


14

Дві швидкі можливості:

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

або

if(myObj['foo'] === undefined) { ... }

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.