Cara menentukan apakah suatu objek memiliki properti yang diberikan dalam JavaScript


311

Bagaimana saya bisa menentukan apakah suatu objek xmemiliki properti yang ditentukan y, terlepas dari nilai x.y?

Saya sedang menggunakan

if (typeof(x.y) !== 'undefined')

tapi itu agak kikuk. Apakah ada cara yang lebih baik?

Jawaban:


584

Objek memiliki properti:

Jika Anda menguji properti yang ada di objek itu sendiri (bukan bagian dari rantai prototipe), Anda dapat menggunakan .hasOwnProperty():

if (x.hasOwnProperty('y')) { 
  // ......
}

Objek atau prototipenya memiliki properti:

Anda dapat menggunakan inoperator untuk menguji properti yang diwarisi juga.

if ('y' in x) {
  // ......
}

23
Atau bahkan lebih baik - Object.prototype.hasOwnProperty.call(x, 'y'), sehingga properti yang bernama "hasOwnProperty" tidak akan bertentangan dengan proses pemeriksaan;)
kangax

4
Atau bahkan lebih pendek - {}.hasOwnProperty.call(x, 'y').
axmrnv


78

Jika Anda ingin tahu apakah objek tersebut secara fisik berisi jawaban properti @ gnarf menggunakan hasOwnPropertyakan melakukan pekerjaan.

Jika Anda ingin tahu apakah properti itu ada di mana saja, baik pada objek itu sendiri atau di rantai prototipe, Anda dapat menggunakan inoperator .

if ('prop' in obj) {
  // ...
}

Misalnya.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

18

Underscore.js atau Lodash

if (_.has(x, "y")) ...

:)


Nggak. Itu hanya alias untuk Object.prototype.hasOwnProperty.call(x, "y"). Untuk array Saya pikir Anda mungkin ingin Array.prototype.indexOf, _.indexOfatau_.contains
nackjicholson

13

Anda dapat memotongnya sedikit seperti ini:

if ( x.y !== undefined ) ...

15
Itu akan gagal denganx = {y:undefined}
James

20
Apakah ada yang perlu membedakan antara "tidak didefinisikan" dan "didefinisikan untuk tidak terdefinisi?"
jpsimons

16
@darkporter kadang-kadang saya lakukan;)
mmm

6

Salah satu fitur kode asli saya

if ( typeof(x.y) != 'undefined' ) ...

yang mungkin berguna dalam beberapa situasi adalah bahwa aman digunakan apakah xada atau tidak. Dengan salah satu metode dalam jawaban gnarf, pertama-tama orang harus menguji xapakah ada keraguan apakah itu ada.

Jadi mungkin ketiga metode ini memiliki tempat dalam satu tas trik.


Anda selalu dapat menggunakan (x && x.hasOwnProperty('y'))atau(x && 'y' in x)
gnarf

Saya setuju, pengujian untuk x harus merupakan kasus tersendiri. Juga menghasilkan pelaporan kesalahan yang lebih baik.
B01

Itu gagal bagi saya. Jika x tidak terdefinisi maka typeof (xy) mengembalikan sebuah ReferenceErrordaripada string 'tidak terdefinisi'
Craig

1

Karena pertanyaannya adalah tentang kejanggalan dari pengecekan properti, dan satu kasus penggunaan reguler untuk itu menjadi validasi objek opsi argumen fungsi, saya pikir saya akan menyebutkan cara singkat bebas perpustakaan untuk menguji keberadaan beberapa properti. Penafian: Itu memang membutuhkan ECMAScript 5 (tapi IMO siapa pun yang masih menggunakan IE8 layak web yang rusak).

function f(opts) {
  if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
      throw new Error("IllegalArgumentException");
  }
  alert("ok");
}
f({req1: 123});  // error
f({req1: 123, req2: 456});  // ok

-2

Mengapa tidak secara sederhana:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

Atau jika Anda mengharapkan jenis tertentu:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

1
Karena itu buruk untuk dibaca dan tidak mengetik ketat. Saya harus bertanya kepada Anda: mengapa tidak sederhana x.hasOwnProperty('y')?
Fabian Picone
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.