Bagaimana memeriksa apakah properti objek ada dengan variabel yang menyimpan nama properti?

681

Saya memeriksa keberadaan properti objek dengan variabel yang menahan nama properti yang dimaksud.

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

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

Ini undefinedkarena mencari, myObj.myProptetapi saya ingin memeriksanyamyObj.prop

Kreatif Slopeside
sumber
2
Mungkin bermanfaat: Dari komentar oleh Pablo Cabrera di NCZOnline : "Saya pikir perlu dicatat bahwa jika hasOwnPropertymetode ini ditimpa, Anda dapat mengandalkannya Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise
10
Apakah stackoverflow.com/questions/4244896/... merupakan duplikat dari pertanyaan ini? bagaimana itu? 'memeriksa keberadaan' dan 'mengakses nilai' adalah hal yang berbeda? Harap perbaiki saya jika saya salah ....
adnan2nd
ini bukan duplikat.
Jeff Clayton

Jawaban:

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

Atau

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

Atau

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

Catatan yang hasOwnPropertytidak memeriksa properti yang diwarisi, sedangkan yang intidak. Misalnya 'constructor' in myObjitu benar, tetapi myObj.hasOwnProperty('constructor')tidak.

Roket Hazmat
sumber
23
hasOwnProperty()lebih baik myObj[myProp](dari jawaban lain) karena berfungsi bahkan jika nilainya myProp0
Matt R
9
Operator "dalam" tidak bekerja dengan string. misalnya 'panjang' di 'qqq' akan menghasilkan pengecualian. Jadi, jika Anda ingin tujuan umum periksa Anda harus menggunakan hasOwnProperty.
Yakub
1
@ Jacob apa maksudmu ketika kamu mengatakan operator "dalam" tidak bekerja dengan string '? dengan operator "in" ', ekspresi kiri harus berupa string atau nilai yang dapat dikonversi menjadi string. Ya, Anda tidak dapat menulis 'panjang' dalam 'qqq' tetapi Anda juga tidak dapat menulis 'qqq'.hasOwnProperty (' length ')
Wachburn
2
@Wachburn: 'qqq'.hasOwnProperty('length')adalah true, Anda bisa melakukannya.
Rocket Hazmat
1
@ gaurav5430 Saya percaya apa yang saya maksudkan adalah bahwa jika myProp0, pernyataan if akan terlihat seperti if (myObj[0])jika myObjmemiliki properti sama sekali, ekspresi akan dievaluasi true. Dan myObj[0]mungkin bukan properti yang Anda cari.
Matt R
52

Anda dapat menggunakan hasOwnProperty , tetapi berdasarkan referensi Anda perlu mengutip ketika menggunakan metode ini:

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

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

Cara lain adalah dengan menggunakan di operator, tetapi Anda perlu tanda kutip di sini juga:

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

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

Adorjan Princz
sumber
6
Itu tidak seberapa hasOwnProperty()diimplementasikan.
kanon
7
Ini salah. Dengan menempatkan tanda kutip di sekitar nama myProp, Anda tidak lagi merujuk nilai myProp, melainkan Anda mendeklarasikan String baru () dari 'myProp' dan tidak ada properti 'myProp' di myObj.
TriumphST
1
TriumpST: dari MDN yang ditautkan di atas, "prop - Sebuah string atau simbol yang mewakili nama properti atau indeks array (bukan simbol akan dipaksa ke string)."
Ben Creasy
Ini benar. Jika Anda tidak ingin menggunakan variabel, tetapi hanya jika 'myProp' tertentu ada, Anda perlu tanda kutip.
Katinka Hesselink
@KatinkaHesselink: Komentar Anda menyesatkan. Pertanyaannya adalah "Bagaimana cara memeriksa apakah properti objek ada dengan variabel yang memegang nama properti?"
Herbert Van-Vliet
26

Terima kasih atas bantuan semua orang dan mendorong untuk menyingkirkan pernyataan eval. Variabel harus dalam kurung, bukan notasi titik. Ini berfungsi dan bersih, kode yang tepat.

Masing-masing adalah variabel: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
Kreatif Slopeside
sumber
Ini terlihat seperti masalah bagi saya. Jika tData.tonicdata[appChoice]menghasilkan nilai yang tidak memiliki properti / indeks yang cocok underI, maka ini akan menghasilkan TypeErrorpelemparan.
Ynot
Terlepas dari niat Anda dengan posting awal Anda, Anda sebenarnya mengajukan pertanyaan yang berbeda dari yang Anda berikan jawaban ini. Anda ingin memeriksa keberadaan properti, Anda tidak menyebutkan apa pun tentang cara mengaksesnya. Yang membuat jawaban ini tidak terkait dengan pertanyaan aktual.
Hijauan
19

Untuk properti sendiri:

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

Catatan: menggunakan Object.prototype.hasOwnProperty lebih baik daripada pinjaman.hasOwnProperty (..), dalam kasus kustom hasOwnProperty didefinisikan dalam rantai prototipe (yang tidak terjadi di sini), seperti

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

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

Untuk menyertakan properti yang diwarisi dalam temuan, gunakan operator in : (tetapi Anda harus menempatkan objek di sisi kanan 'in', nilai primitif akan melempar kesalahan, misalnya 'panjang' di 'rumah' akan melempar kesalahan, tetapi 'panjang' di String baru ('rumah') tidak akan)

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

Catatan: Seseorang mungkin tergoda untuk menggunakan typeof dan [] accessor properti sebagai kode berikut yang tidak berfungsi selalu ...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

Cara yang jauh lebih aman untuk memeriksa apakah properti ada pada objek adalah dengan menggunakan objek kosong atau prototipe objek untuk memanggil 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

Referensi dari MDN Web Documents - Object.prototype.hasOwnProperty ()

skmasq
sumber
4
Jika Anda memasukkan JavaScript yang mungkin melakukan sesuatu yang jahat seperti mengganti hasOwnProperty, tidak ada jumlah penjaga seperti ini yang akan membuat kode Anda aman atau aman.
meustrus
@meustrus Saya tahu dari mana Anda berasal, tetapi dari perspektif bisnis sangat mungkin untuk menerima bahwa pengembang yang tidak berpengalaman akan menggunakan nama properti ini, yang tidak berarti mereka melakukan sesuatu yang jahat dengan sengaja.
skmasq
4

Anda dapat menggunakan hasOwnProperty()serta inoperator.

Simran Kaur
sumber
Semua ini ^ adalah alasan saya benci javascript
pwaterz
1
@pwaterz jangan membenci pemain 🙄
ArchNoob
Haha, love it :)
pwaterz