Perf juga merupakan alasan. Terkadang Anda mungkin perlu mengulang tombol. Ada beberapa cara untuk melakukan ini
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Saya biasanya menggunakan for of Object.keys()
karena melakukan hal yang benar dan relatif singkat, tidak perlu menambahkan cek.
Tapi, ini jauh lebih lambat .
Hanya menebak alasannya Object.keys
lambat sudah jelas, Object.keys()
harus membuat alokasi. Bahkan AFAIK harus mengalokasikan salinan semua kunci sejak itu.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
Mungkin saja mesin JS dapat menggunakan beberapa jenis struktur kunci yang tidak dapat diubah sehingga Object.keys(object)
mengembalikan sesuatu referensi yang beralih pada kunci yang tidak dapat diubah dan yang object.newProp
menciptakan objek kunci yang sama sekali tidak dapat diubah baru tapi apa pun, itu jelas lebih lambat hingga 15x
Bahkan memeriksa hasOwnProperty
hingga 2x lebih lambat.
Inti dari semua itu adalah bahwa jika Anda memiliki kode sensitif perf dan perlu untuk mengulang kunci maka Anda ingin dapat menggunakan for in
tanpa harus menelepon hasOwnProperty
. Anda hanya dapat melakukan ini jika Anda belum mengubahObject.prototype
Perhatikan bahwa jika Anda menggunakan Object.defineProperty
untuk memodifikasi prototipe jika hal-hal yang Anda tambahkan tidak dapat dihitung maka mereka tidak akan mempengaruhi perilaku JavaScript dalam kasus-kasus di atas. Sayangnya, setidaknya di Chrome 83, mereka mempengaruhi kinerja.
Saya menambahkan 3000 properti non-enumerable hanya untuk mencoba memaksa masalah perf muncul. Dengan hanya 30 properti tes terlalu dekat untuk mengetahui apakah ada dampak perf.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 dan Safari 13.1 tidak menunjukkan perbedaan dalam perf antara kelas Augmented dan Unaugmented mungkin v8 akan diperbaiki di area ini dan Anda dapat mengabaikan masalah perf.
Tapi, izinkan saya juga menambahkan ada kisahnyaArray.prototype.smoosh
. Versi singkatnya adalah Mootools, perpustakaan populer, dibuat sendiri Array.prototype.flatten
. Ketika komite standar mencoba untuk menambahkan yang asli Array.prototype.flatten
mereka menemukan tidak bisa tanpa melanggar banyak situs. Para devs yang mengetahui tentang istirahat menyarankan menamai metode es5 smoosh
sebagai lelucon tetapi orang-orang panik tidak mengerti itu adalah lelucon. Mereka memilih flat
bukannyaflatten
Moral dari cerita ini adalah Anda tidak harus memperluas objek asli. Jika Anda melakukannya, Anda bisa mengalami masalah yang sama tentang kerusakan barang-barang Anda dan kecuali perpustakaan khusus Anda menjadi sepopuler MooTools, vendor peramban tidak mungkin mengatasi masalah yang Anda sebabkan. Jika pustaka Anda menjadi sepopuler itu, itu akan menjadi semacam cara untuk memaksa orang lain mengatasi masalah yang Anda sebabkan. Jadi, tolong jangan Perluas Objek Asli