Jawaban:
Jika Anda menguji properti yang ada di objek itu sendiri (bukan bagian dari rantai prototipe), Anda dapat menggunakan .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Anda dapat menggunakan in
operator untuk menguji properti yang diwarisi juga.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
Jika Anda ingin tahu apakah objek tersebut secara fisik berisi jawaban properti @ gnarf menggunakan hasOwnProperty
akan 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 in
operator .
if ('prop' in obj) {
// ...
}
Misalnya.:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.js atau Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. Untuk array Saya pikir Anda mungkin ingin Array.prototype.indexOf
, _.indexOf
atau_.contains
Salah satu fitur kode asli saya
if ( typeof(x.y) != 'undefined' ) ...
yang mungkin berguna dalam beberapa situasi adalah bahwa aman digunakan apakah x
ada atau tidak. Dengan salah satu metode dalam jawaban gnarf, pertama-tama orang harus menguji x
apakah ada keraguan apakah itu ada.
Jadi mungkin ketiga metode ini memiliki tempat dalam satu tas trik.
(x && x.hasOwnProperty('y'))
atau(x && 'y' in x)
ReferenceError
daripada string 'tidak terdefinisi'
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
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!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
, sehingga properti yang bernama "hasOwnProperty" tidak akan bertentangan dengan proses pemeriksaan;)