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?

royhowie
sumber

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) {
  // ......
}
gnarf
sumber
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
CMS
sumber
18

Underscore.js atau Lodash

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

:)

nackjicholson
sumber
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 ) ...
jpsimons
sumber
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.


sumber
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
stt
sumber
-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!");
kubah
sumber
1
Karena itu buruk untuk dibaca dan tidak mengetik ketat. Saya harus bertanya kepada Anda: mengapa tidak sederhana x.hasOwnProperty('y')?
Fabian Picone