Як перевірити, чи існує властивість об'єкта зі змінною, що містить ім'я властивості?


680

Я перевіряю наявність властивості об'єкта зі змінною, яка містить назву властивості.

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

Це тому, undefinedщо він шукає, myObj.myPropале я хочу, щоб це перевірилиmyObj.prop


2
Можливо, корисно: З коментаря Пабло Кабрери в NCZOnline : "Я думаю, що варто відзначити, що якщо hasOwnPropertyметод буде перезаписаний, ви можете покластися на" Object.prototype.hasOwnProperty.call(object, property).
HumanInDisguise

10
є stackoverflow.com/questions/4244896/… дублікат цього питання? як у тому, що? "перевірка існування" та "доступ до цінності" - це різні речі? Будь ласка, виправте мене, якщо я помиляюся ....
adnan2nd

це не дублікат.
Джефф Клейтон

Відповіді:


1307
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

Або

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

Або

if('prop' in myObj){
    alert("yes, i have that property");
}

Зверніть увагу, що hasOwnPropertyне перевіряється наявність успадкованих властивостей, тоді як in. Наприклад, 'constructor' in myObjце правда, але myObj.hasOwnProperty('constructor')це не так.


23
hasOwnProperty()краще тоді myObj[myProp](з інших відповідей), оскільки це працює, навіть якщо значення myProp0
Matt R

9
Оператор "in" не працює з рядками. наприклад, 'length' у 'qqq' призведе до виключення. Тож якщо ви хочете перевірити загальну мету, вам потрібно використовувати hasOwnProperty.
Яків

1
@Jacob, що ти маєш на увазі, коли ти кажеш, що оператор "in" не працює з рядками "? з оператором "in" лівий вираз повинен бути рядком або значенням, яке може перетворитись у рядок. Так, ви не можете написати "length" у "qqq", але ви також не можете написати "qqq'.hasOwnProperty ('length")
Вахберн

2
@Wachburn: 'qqq'.hasOwnProperty('length')є true, ти можеш це зробити.
Ракета Хазмат

1
@ gaurav5430 Я вважаю, що я маю на увазі те, що якщо myPropдорівнює 0, оператор if виглядатиме так, if (myObj[0])якби, якщо myObjмає взагалі якісь властивості, вираження оцінювало б true. І myObj[0]може не бути власністю, яку ви шукаєте.
Метт Р

51

Ви можете використовувати hasOwnProperty , але виходячи з посилання, потрібні цитати при використанні цього методу:

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Ще один спосіб - це використовувати в операторі, але тут вам також потрібні цитати :

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in


6
Це не так, як hasOwnProperty()реалізується.
canon

7
Це неправильно. Вводячи лапки навколо імені myProp, ви більше не посилаєтесь на значення myProp, скоріше ви оголошуєте нову String () 'myProp', і в myObj немає такого властивості 'myProp'.
ТріумфST

1
TriumpST: з MDN, пов'язаного вище, "prop - рядок або символ, що представляє ім'я властивості або індекс масиву (несимволи будуть примусові до рядків)."
Бен Крізі

Це вірно. Якщо ви не хочете використовувати змінну, але просто якщо присутній певний "myProp", вам потрібні цитати.
Катінка Гесселінк

@KatinkaHesselink: Ваш коментар вводить в оману. Питання було "Як перевірити, чи існує властивість об'єкта зі змінною, що містить ім'я властивості?"
Герберт Ван-

26

Дякую за допомогу всім та прагнуть позбутися заяви eval. Змінні повинні бути в дужках, а не крапкові позначення. Це працює і чистий, належний код.

Кожна з них є змінними: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}

Це виглядає як проблема для мене. Якщо в tData.tonicdata[appChoice]результаті з’явиться значення, яке не має властивості / індексу, що відповідає underI, це призведе до TypeErrorвикидання.
Ynot

Незважаючи на ваші наміри з початкової посади, ви насправді задали інше питання, ніж те, на яке ви дали цю відповідь. Ви хотіли перевірити наявність ресурсу, нічого не згадуючи про те, як отримати доступ до нього. Що робить цю відповідь не пов'язаною з фактичним питанням.
Корм

19

Для власного майна:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

Примітка. Використання Object.prototype.hasOwnProperty краще, ніж loan.hasOwnProperty (..), у випадку, якщо користувацька hasOwnProperty визначена в ланцюзі прототипу (що тут не так), наприклад

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Для включення успадкованих властивостей у знахідку використовуйте оператор in : (але ви повинні розмістити об'єкт у правій частині "in", примітивні значення викличуть помилку, наприклад, "length" у "home" призведе до помилки, але "length" у новому рядку ("домашній") не буде)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

Примітка. Ви можете спокусити використовувати typeof та [] accessor властивості як наступний код, який працює не завжди ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}

13

Набагато безпечнішим способом перевірити, чи існує властивість на об'єкті, є використання порожнього об'єкта або прототипу об'єкта для виклику hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

Посилання від веб-документів MDN - Object.prototype.hasOwnProperty ()


4
Якщо ви включаєте JavaScript, який може hasOwnPropertyспричинити щось зло, як переопрацювання , жодна кількість подібних охоронців не зробить ваш код безпечним або захищеним.
meustrus

@meustrus Я знаю, звідки ви приїжджаєте, але з точки зору бізнесу вкрай можливо зрозуміти, що недосвідчений розробник використовує це ім'я властивості, що не обов'язково означає, що вони роблять щось зло навмисно.
skmasq

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