Apa perbedaan antara Object.getOwnPropertyNames
dan Object.keys
dalam javascript? Juga beberapa contoh akan dihargai.
javascript
kamilkp
sumber
sumber
Object.keys()
tidak dapat dihitung: tidak mengembalikannya, sedangkan yang dikembalikanObject.getOwnPropertyNames()
.Jawaban:
Ada sedikit perbedaan.
Object.getOwnPropertyNames(a)
mengembalikan semua properti milik objeka
.Object.keys(a)
mengembalikan semua properti enumerable sendiri. Ini berarti bahwa jika Anda mendefinisikan properti objek Anda tanpa membuat beberapa dari merekaenumerable: false
, kedua metode ini akan memberi Anda hasil yang sama.Mudah untuk diuji:
Jika Anda mendefinisikan properti tanpa memberikan deskriptor atribut properti (artinya Anda tidak menggunakan
Object.defineProperties
), misalnya:maka properti tersebut menjadi enumerable secara otomatis dan kedua metode menghasilkan array yang sama.
sumber
length
properti dari objek array tidak dapat dihitung, sehingga tidak muncul diObject.keys
.length
Properti objek ada pada prototipe, bukan objek itu sendiri, jadi tidakObject.keys
juga tidakObject.getOwnPropertyNames
akan mencantumkannya.Object.getOwnPropertyNames(anyArray)
termasuklength
Object.getOwnPropertyNames(anyArray)
memang termasuklength
dalam array yang dikembalikan!Perbedaan lainnya adalah dalam hal
Object.getOwnPropertyNames
metode array akan mengembalikan properti tambahan itulength
.sumber
Notasi literal vs konstruktor saat membuat objek. Inilah sesuatu yang membuat saya.
Jadi dalam kasus saya
foo
fungsi tidak berfungsi jika saya memberinya objek dari tipe cat2.Ada cara lain untuk membuat objek sehingga bisa ada ketegaran lain di sana juga.
sumber
Object.getOwnPropertyNames
akan mengembalikan nama properti untukcat1
dan tidakcat2
. Dua cara membuat objek tidak menghasilkan perbedaan antaraObject.getOwnPropertyNames
danObject.keys
.Seperti yang sudah dijelaskan,
.keys
tidak mengembalikan properti enumerable.Mengenai contoh, salah satu kasus perangkap adalah
Error
objek: beberapa propertinya dapat dihitung.Jadi sambil
console.log(Object.keys(new Error('some msg')))
menghasilkan[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
menghasilkan["stack", "message"]
sumber
Perbedaan lainnya adalah bahwa (setidaknya dengan nodejs) fungsi "getOwnPropertyNames" tidak menjamin urutan kunci, itu sebabnya saya biasanya menggunakan fungsi "kunci":
sumber
getOwnPropertyNames
tidak beres? Karena ES2015 menentukan pesanan untukObect.getOwnPropertyNames
, sementara pesananObect.keys
masih hingga implementasi.for-in loop
,Object.keys
, danObject.getOwnPropertyNames
. Yang mengatakan, ketiganya akan menyebutkan secara konsisten sehubungan satu sama lain.