Bagaimana cara saya memeriksa apakah suatu objek memiliki properti spesifik dalam JavaScript?
Mempertimbangkan:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
Apakah itu cara terbaik untuk melakukannya?
javascript
heats
sumber
sumber
in
danhasOwnProperty
keluar jalan lebih lambat dari yang lain untuk saya (98% lebih lambat). Saya tidak terkejuthasOwnProperty
menjadi lebih lambat tetapi saya terkejutin
.Jawaban:
Saya benar-benar bingung dengan jawaban yang telah diberikan - kebanyakan dari mereka benar-benar salah. Tentu saja Anda dapat memiliki properti objek yang memiliki nilai undefined, null, atau false. Jadi hanya dengan mengurangi pemeriksaan properti ke
typeof this[property]
atau, lebih buruk lagi,x.key
akan memberi Anda hasil yang sepenuhnya menyesatkan.Tergantung pada apa yang Anda cari. Jika Anda ingin tahu apakah suatu objek secara fisik mengandung properti (dan itu tidak datang dari suatu tempat di atas rantai prototipe) maka
object.hasOwnProperty
adalah cara untuk pergi. Semua browser modern mendukungnya. (Versi ini hilang di versi Safari yang lebih lama - 2.0.1 dan lebih lama - tetapi versi browser tersebut jarang digunakan lagi.)Jika yang Anda cari adalah jika sebuah objek memiliki properti di atasnya yang dapat diubah (ketika Anda beralih pada properti objek, itu akan muncul) kemudian melakukan:
prop in object
akan memberikan efek yang Anda inginkan.Karena menggunakan
hasOwnProperty
mungkin apa yang Anda inginkan, dan mempertimbangkan bahwa Anda mungkin menginginkan metode mundur, saya berikan kepada Anda solusi berikut:Di atas adalah solusi lintas-browser yang berfungsi,
hasOwnProperty
dengan satu peringatan: Tidak dapat membedakan antara kasus di mana properti yang identik berada pada prototipe dan pada contoh - hanya mengasumsikan bahwa itu berasal dari prototipe. Anda bisa mengubahnya menjadi lebih lunak atau ketat, berdasarkan situasi Anda, tetapi setidaknya ini seharusnya lebih bermanfaat.sumber
var w = opts.w || 100;
. Tetapi jika Anda ke perpustakaan sesuatu, Anda mungkin perlu sedikit lebih jauh di beberapa bagian.__proto__
menjadi nol? Impl sederhana:function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }
(Kasus denganobj.constructor.prototype
harus ditambahkan).__proto__
tidak standar dan tidak berfungsi di beberapa browser lama. Dan bahkan dengan penambahanObject.getPrototypeOf
standar baru-baru ini mengatakan Anda masih tidak dapat mengubah prototipe objek yang ada.for(prop in object)
loop hanya mengulangi properti enumerable. Namun,prop in object
periksa apakahobject
memiliki propertiprop
di suatu tempat dalam rantai prototipikal, secara independen apakah itu dapat dihitung atau tidak.Dengan
Underscore.js
atau ( bahkan lebih baik )lodash
:Yang panggilan
Object.prototype.hasOwnProperty
, tetapi (a) lebih pendek untuk mengetik, dan (b) menggunakan "referensi aman untukhasOwnProperty
" (yaitu itu berfungsi bahkan jikahasOwnProperty
ditimpa).Secara khusus, lodash didefinisikan
_.has
sebagai:sumber
npm install lodash.has
yang memaparkan modul npm dengan hanyahas
fungsi yang mengkompilasi hingga 175 byte saat dikecilkan. Juga merupakan wawasan untuklodash.has/index.js
melihat bagaimana perpustakaan yang sangat populer dan tepercaya bekerja.lodash
versi bekerja dengan ini:.has(undefined, 'someKey') => false
saatunderscore
kembaliundefined
lodash
sebagai dependensi "lain": ini adalah pustaka yang cukup umum (jika bukan yang paling umum) untuk hal semacam ini. Bersenang-senang menciptakan kembali roda.Bagaimana dengan?
sumber
in
operator atau tidak. Juga perhatikan bahwain
operator memiliki dukungan browser yang sangat baikIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
juga memeriksa properti prototipe, sementara ituhasOwnProperty
hanya properti yang ditentukan pengguna. Referensi: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…'key' in x
lakukan pekerjaan dengan array. Bukti: stackoverflow.com/questions/33592385/…Catatan : yang berikut ini sebagian besar sudah usang karena mode yang ketat, dan
hasOwnProperty
. Solusi yang benar adalah dengan menggunakan mode ketat dan untuk memeriksa keberadaan properti menggunakanobj.hasOwnProperty
. Jawaban ini mendahului kedua hal ini, setidaknya diimplementasikan secara luas (ya, sudah setua itu). Ambil yang berikut sebagai catatan sejarah.Ingatlah bahwa
undefined
(sayangnya) bukan kata yang dilindungi undang-undang dalam JavaScript jika Anda tidak menggunakan mode ketat. Oleh karena itu, seseorang (orang lain, jelas) dapat memiliki ide besar mendefinisikannya kembali, melanggar kode Anda.Metode yang lebih kuat adalah sebagai berikut:
Di sisi lain, metode ini jauh lebih verbose dan juga lebih lambat. : - /
Alternatif umum adalah untuk memastikan bahwa
undefined
yang benar-benar terdefinisi, misalnya dengan menempatkan kode ke fungsi yang menerima parameter tambahan, yang disebutundefined
, yang tidak lulus nilai. Untuk memastikan itu tidak melewati nilai, Anda bisa langsung menyebutnya sendiri, mis:sumber
void 0
didefinisikan untuk mengembalikan kanonikundefined
, dapatkah seseorang melakukannyax.attribute !== void 0
?(function (undefined) { // undefined is actually undefined here })();
Armin Ronacher tampaknya sudah mengalahkan saya untuk itu , tetapi:
Solusi yang lebih aman, tetapi lebih lambat, seperti ditunjukkan oleh Konrad Rudolph dan Armin Ronacher adalah:
sumber
x.hasOwnProperty('toString') === true;
Object.prototype
sudah memiliki built-in, benarhasOwnProperty
. Menimpa dengan implementasi yang salah (1. Properti dapat memiliki nilaiundefined
, 2. Ini akan memberikan positif palsu untuk properti yang diwarisi) adalah ide yang sangat buruk. Jawaban yang salah dapat dan harus dihapus. Saya tidak tahu apakah Anda bisa melakukan itu kembali pada Sep '08 ketika Anda melihat jawaban Resig , jadi berkomentar untuk menyarankan melakukannya sekarang.Anda dapat menggunakan
in
operator untuk memeriksa apakah properti ada pada objek:Anda juga dapat mengulangi semua properti objek menggunakan
for - in
loop, dan kemudian memeriksa properti spesifik:Anda harus mempertimbangkan apakah properti objek ini enumerable atau tidak, karena properti non-enumerable tidak akan muncul dalam satu
for-in
lingkaran. Juga, jika properti enumerable membayangi properti non-enumerable dari prototipe, itu tidak akan muncul di Internet Explorer 8 dan sebelumnya.Jika Anda ingin daftar semua properti instan, apakah dapat dihitung atau tidak, Anda dapat menggunakan
Ini akan mengembalikan array nama semua properti yang ada pada suatu objek.
Akhirnya, Anda bisa menggunakan typeof operator untuk secara langsung memeriksa tipe data dari properti objek:
Jika properti tidak ada pada objek, itu akan mengembalikan string yang tidak ditentukan. Jika tidak maka akan mengembalikan jenis properti yang sesuai. Namun, perhatikan bahwa ini tidak selalu merupakan cara yang valid untuk memeriksa apakah suatu objek memiliki properti atau tidak, karena Anda bisa memiliki properti yang diatur ke tidak terdefinisi, dalam hal ini, menggunakan
typeof x.key
masih akan mengembalikan true (meskipun kuncinya masih di objek).Pembaruan: Anda dapat memeriksa apakah ada properti dengan membandingkan dengan properti javascript yang tidak ditentukan
Ini akan berfungsi kecuali kunci secara khusus diatur
undefined
pada objek xsumber
Mari kita memotong beberapa kebingungan di sini. Pertama, mari kita sederhanakan dengan menganggap
hasOwnProperty
sudah ada; ini berlaku untuk sebagian besar browser saat ini yang digunakan.hasOwnProperty
mengembalikan true jika nama atribut yang diteruskan ke itu telah ditambahkan ke objek. Ini sepenuhnya independen dari nilai aktual yang diberikan kepadanya yang mungkin tepatundefined
.Karenanya:
Namun:
Masalahnya adalah apa yang terjadi ketika sebuah objek dalam rantai prototipe memiliki atribut dengan nilai undefined?
hasOwnProperty
akan salah untuk itu, dan juga akan!== undefined
. Namun,for..in
masih akan mencantumkannya dalam enumerasi.Intinya adalah tidak ada cara lintas-browser (karena Internet Explorer tidak mengekspos
__prototype__
) untuk menentukan bahwa pengidentifikasi tertentu belum dilampirkan ke objek atau apa pun dalam rantai prototipe.sumber
Jika Anda mencari properti, maka "TIDAK". Kamu ingin:
Secara umum Anda tidak perlu peduli apakah properti itu berasal dari prototipe atau objek.
Namun, karena Anda menggunakan 'kunci' dalam kode sampel, sepertinya Anda memperlakukan objek sebagai hash, dalam hal ini jawaban Anda akan masuk akal. Semua kunci hash akan menjadi properti di objek, dan Anda menghindari properti tambahan yang dikontribusikan oleh prototipe.
Jawaban John Resig sangat komprehensif, tetapi saya pikir itu tidak jelas. Apalagi dengan kapan menggunakan "'prop' in obj".
sumber
in
operator memiliki dukungan browser yang sangat baikIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
operator: "ia bekerja dengan 'objek' dalam arti sempit, sehingga dinyatakan sebagai {} atau dibuat menggunakan konstruktor, ia tidak menerima array atau primitif. Bukan berarti OP memerlukannya, tetapi beberapa jawaban lain menghadirkan teknik yang lebih luas (bekerja dengan array, string, dll.) "Untuk menguji objek sederhana gunakan:
if (obj[x] !== undefined)
Jika Anda tidak tahu jenis objek apa yang digunakan:
if (obj.hasOwnProperty(x))
Semua opsi lain lebih lambat ..
Detail
Evaluasi kinerja 100.000.000 siklus di bawah Nodejs ke 5 opsi yang disarankan oleh orang lain di sini:
Evaluasi memberi tahu kita bahwa kecuali kita secara khusus ingin memeriksa rantai prototipe objek dan juga objek itu sendiri, kita tidak boleh menggunakan bentuk umum:
if (X in Obj)...
Itu antara 2 hingga 6 kali lebih lambat tergantung pada kasus penggunaanIntinya, jika Obj Anda tidak harus berupa objek sederhana dan Anda ingin menghindari memeriksa rantai prototipe objek dan untuk memastikan x dimiliki oleh Obj secara langsung, gunakan 'if (obj.hasOwnProperty (x)) ...'.
Kalau tidak, ketika menggunakan objek sederhana dan tidak khawatir tentang rantai prototipe objek, menggunakan
if (typeof(obj[x]) !== 'undefined')...
adalah cara teraman dan tercepat.Jika Anda menggunakan objek sederhana sebagai tabel hash dan tidak pernah melakukan apa pun keriting, saya akan menggunakan
if (obj[x])...
karena saya merasa jauh lebih mudah dibaca.Selamat bersenang-senang.
sumber
Ya itu :) Saya pikir Anda juga bisa melakukan
Object.prototype.hasOwnProperty.call(x, 'key')
yang juga berfungsi jikax
memiliki properti bernamahasOwnProperty
:)Tapi itu menguji properti sendiri. Jika Anda ingin memeriksa apakah memiliki properti yang mungkin juga diturunkan, Anda dapat menggunakannya
typeof x.foo != 'undefined'
.sumber
Karena
gagal jika
x.key
memutuskan untukfalse
(misalnya,x.key = ""
).sumber
const x = {key: undefined};
yang akan mengembalikan false dengan solusi ini, sementarax.hasOwnProperty('key')); // true
danReflect.has(x, 'key')); // true
. Properti sebenarnya ada, tetapi nilainyaundefined
.Anda juga dapat menggunakan objek ES6
Reflect
:Dokumentasi tentang MDN untuk
Reflect.has
dapat ditemukan di sini .sumber
OK, sepertinya saya punya jawaban yang tepat kecuali jika Anda tidak ingin properti yang diwarisi:
Berikut adalah beberapa opsi lain untuk menyertakan properti yang diwarisi:
sumber
var x = { key: false };
itux.key
metode akan salah.Jangan lakukan ini
object.hasOwnProperty(key))
, itu benar-benar buruk karena metode ini dapat dibayangi oleh properti pada objek yang bersangkutan - pertimbangkan{ hasOwnProperty: false }
- atau, objek tersebut mungkin objek nol(Object.create(null))
.Cara terbaik adalah dengan melakukan
Object.prototype.hasOwnProperty.call(object, key)
atau:sumber
Cara lain yang relatif sederhana adalah menggunakan
Object.keys
. Ini mengembalikanarray
yang berarti Anda mendapatkan semua fitur array.Meskipun kami berada di dunia dengan dukungan browser yang bagus. Karena pertanyaan ini sudah sangat lama saya pikir saya akan menambahkan ini: Ini aman untuk digunakan pada JS v1.8.5
sumber
Object.keys(info).indexOf('someotherthing') !== -1
hasOwnProperty "dapat digunakan untuk menentukan apakah suatu objek memiliki properti yang ditentukan sebagai properti langsung dari objek itu; tidak seperti dalam operator , metode ini tidak memeriksa rantai prototipe objek."
Jadi yang paling mungkin, untuk apa yang tampak oleh pertanyaan Anda, Anda tidak ingin menggunakan hasOwnProperty, yang menentukan apakah properti itu ada sebagai terlampir langsung ke objek itu sendiri ,.
Jika Anda ingin menentukan apakah properti ada di rantai prototipe tempat Anda ingin menggunakannya, seperti:
Saya harap ini membantu.
sumber
Dengan risiko downvoting besar-besaran, berikut adalah opsi lain untuk kasus tertentu. :)
Jika Anda ingin menguji untuk anggota pada suatu objek dan ingin tahu apakah itu telah ditetapkan untuk sesuatu selain:
maka Anda dapat menggunakan:
sumber
Solusi ECMA Script 6 dengan refleksi. Buat pembungkus seperti:
sumber
Ada metode "hasOwnProperty" ada pada objek, tetapi tidak disarankan untuk memanggil metode ini secara langsung karena mungkin terkadang objek tersebut null atau beberapa properti ada pada objek seperti:
{ hasOwnProperty: false }
Jadi cara yang lebih baik adalah:
sumber
Anda dapat menggunakan pendekatan berikut-
Perbedaan antara pendekatan berikut adalah sebagai berikut-
sumber
Anda perlu menggunakan metode ini
object.hasOwnProperty(property)
. Ini mengembalikan true jika objek memiliki properti dan false jika objek tidak.sumber
Jika kunci yang Anda periksa disimpan dalam variabel , Anda dapat memeriksanya seperti ini:
sumber
Mengapa terlalu rumit hal yang bisa Anda lakukan:
Sederhana dan jelas untuk sebagian besar kasus ...
sumber
const objectName = { keyname: false };
ia harus mengembalikan true, karenakeyname
merupakan properti dariobjectname
. Tetapi karena nilainya salah maka akan kembali salah dengan logika ini.