Nesne özelliğinin, özellik adını tutan bir değişkenle olup olmadığını nasıl kontrol edebilirim?


681

Söz konusu özellik adını tutan bir değişkene sahip bir nesne özelliğinin varlığını kontrol ediyorum.

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

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

Bu undefinedda arıyor çünkü myObj.myPropama kontrol etmek istiyorummyObj.prop


2
Olası yararlı: NCZOnline'da Pablo Cabrera tarafından yapılan bir yorumdan : "Bence hasOwnPropertyyöntemin üzerine yazılırsa , buna güvenebilirsiniz Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise

10
olduğu stackoverflow.com/questions/4244896/... bu sorunun bir kopyası? bu nasıl? 'varlığı kontrol etmek' ve 'değere erişmek' farklı şeyler midir? Yanılıyorsam lütfen beni düzeltin ....
adnan2nd

bu bir kopya değil.
Jeff Clayton

Yanıtlar:


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

Veya

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

Veya

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

Bunun hasOwnPropertymiras alınan özellikleri kontrol inetmediğini unutmayın. Örneğin 'constructor' in myObjdoğrudur, ama myObj.hasOwnProperty('constructor')değildir.


23
hasOwnProperty()myObj[myProp]değeri myProp0 olsa bile daha iyi (diğer cevaplardan) daha iyidir
Matt R

9
"Giriş" işleci dizelerle çalışmaz. örneğin 'qqq' içindeki 'length' bir istisna oluşturur. Yani genel amaçlı bir kontrol istiyorsanız hasOwnProperty kullanmanız gerekir.
Jacob

1
@Jacob 'in' operatörü dizelerle çalışmaz 'derken ne demek istiyorsun? "in" 'operatörü ile sol ifade, bir dizeye dönüştürülebilen bir dize veya değer olmalıdır. Evet, 'qqq' içinde 'length' yazamazsınız, ancak 'qqq' yazamazsınız. HasOwnProperty ('length')
Wachburn

2
@Wachburn: 'qqq'.hasOwnProperty('length')edilir true, bunu yapabilirsiniz.
Rocket Hazmat

1
@ gaurav5430 Bahsettiğim şey, eğer myProp0 ise, if ifadesinin , herhangi bir özelliği if (myObj[0])varsa myObj, ifadenin değerlendirileceği gibi olduğuna inanıyorum true. Ve myObj[0]aradığınız mülk olmayabilir.
Matt R

52

Sen kullanabilirsiniz hasOwnProperty , ama ihtiyacınız referans temelinde tırnak bu yöntemi kullanırken:

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

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

Bir başka yolu kullanmaktır içinde operatör, ama ihtiyacınız tırnak burada da:

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

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


6
Yani değil nasıl hasOwnProperty()uygulanmaktadır.
canon

7
Bu yanlış. MyProp adının etrafına tırnak işareti koyarak, artık myProp değerine başvurmuyorsunuz, bunun yerine 'myProp' adlı yeni bir String () bildiriyorsunuz ve myObj'de böyle bir 'myProp' özelliği yok.
TriumphST

1
TriumpST: yukarıda bağlantılı MDN'den, "prop - Bir özellik adını veya dizi dizinini temsil eden bir dize veya simge (semboller dizelere zorlanmayacaktır)."
Ben Creasy

Doğru. Bir değişken kullanmak istemiyorsanız, ancak belirli bir 'myProp' varsa, tırnak işaretlerine ihtiyacınız vardır.
Katinka Hesselink

@KatinkaHesselink: Yorumunuz yanıltıcı. Soru "Nesne özelliğinin özellik adını tutan bir değişkenle olup olmadığını nasıl kontrol edebilirim?"
Herbert Van-Vliet

26

Herkesin yardımları ve eval ifadesinden kurtulmak için bastırdığınız için teşekkür ederiz. Değişkenlerin nokta gösteriminde değil, parantez içinde olması gerekiyordu. Bu çalışır ve temiz, uygun kod.

Bunların her biri değişkenlerdir: appChoice, underI, underObstr.

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

Bu benim için bir sorun gibi görünüyor. Eşleşen tData.tonicdata[appChoice]bir özellik / dizine sahip olmayan bir değerle underIsonuçlanırsa, bu TypeErroratılır.
Ynot

İlk yazınızla ilgili niyetlerinize rağmen, aslında bu cevabı verdiğiniz sorudan farklı bir soru sordunuz. Bir mülkün varlığını kontrol etmek istediniz, mülkün nasıl erişileceği hakkında hiçbir şeyden bahsetmiyorsunuz. Bu da bu sorunun asıl soru ile ilgisiz olmasını sağlar.
Yem

19

Kendi mülkünüz için:

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

Not: Object.prototype.hasOwnProperty kullanmak , krediden daha iyidir. HasOwnProperty (..), prototip zincirinde özel bir hasOwnProperty tanımlanmışsa (burada durum böyle değildir), örneğin

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

// https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Bulguya devralınan özellikleri dahil etmek için in işlecini kullanın : (ancak 'in' öğesinin sağ tarafına bir nesne yerleştirmeniz gerekir, ilkel değerler hata verir, örneğin 'home' içindeki 'length' hata verir, ancak 'length' yeni Dize'de ('ev') olmaz)

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/tr-TR/docs/Web/JavaScript/Reference/Operators/in

Not: Aşağıdaki kod olarak her zaman çalışmayan typeof ve [] özellik erişimcisi kullanmak cazip gelebilir ...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

13

Nesnede özelliğin olup olmadığını kontrol etmenin çok daha güvenli bir yolu, aramak için boş nesne veya nesne prototipi kullanmaktır 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 Web Belgelerinden Referans - Object.prototype.hasOwnProperty ()


4
Geçersiz kılma gibi kötü bir şey yapabilen JavaScript ekliyorsanız hasOwnProperty, bunun gibi hiçbir koruma kodu kodunuzu güvenli veya güvenli hale getirmez.
meustrus

@ nereden geldiğinizi biliyorum, ancak iş açısından bakıldığında, deneyimsiz bir geliştiricinin bu özellik adını kullanması son derece mümkündür, bu da onların kasten kötü bir şey yaptıkları anlamına gelmez.
skmasq

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.