Perf aynı zamanda bir nedendir. Bazen anahtarların üzerinden geçmeniz gerekebilir. Bunu yapmanın birkaç yolu var
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Genelde for of Object.keys()
doğru şeyi yaptığı için kullanıyorum ve nispeten kısa, çeki eklemeye gerek yok.
Ama çok daha yavaştır .
Sebebinin Object.keys
yavaş olduğunu tahmin etmek bile belli, Object.keys()
bir tahsis yapmak zorunda. Aslında AFAIK, o zamandan beri tüm anahtarların bir kopyasını tahsis etmek zorundadır.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
JS motorunun bir çeşit değişmez anahtar yapısı kullanması mümkündür, böylece Object.keys(object)
değişmez anahtarlar üzerinde yinelenen ve object.newProp
tamamen yeni bir değişmez anahtar nesnesi oluşturan bir referans şey döndürür , ancak her neyse, açıkça 15 kata kadar daha yavaştır.
Kontrol bile hasOwnProperty
2 kata kadar daha yavaştır.
Bütün bunların amacı, eğer mükemmel derecede hassas bir kodunuz varsa ve anahtarlar üzerinde döngü yapmanız gerekiyorsa, o zaman for in
aramak zorunda kalmadan kullanmak isteyebilirsiniz hasOwnProperty
. Bunu yalnızca değiştirmediyseniz yapabilirsinizObject.prototype
Object.defineProperty
Prototipi değiştirmek için kullanırsanız , eklediğiniz şeyler numaralandırılamazsa, yukarıdaki durumlarda JavaScript'in davranışını etkilemeyeceğini unutmayın. Ne yazık ki, en azından Chrome 83'te performansı etkiliyorlar.
Herhangi bir performans sorununu ortaya çıkmaya zorlamak için 3000 numaralandırılamayan özellik ekledim. Yalnızca 30 özellik ile testler, herhangi bir mükemmel etki olup olmadığını söyleyemeyecek kadar yakındı.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 ve Safari 13.1, Augmented ve Unaugmented sınıfları arasında performans açısından hiçbir fark göstermedi, belki v8 bu alanda düzeltilecek ve performans sorunlarını görmezden gelebilirsiniz.
Ama şunu da ekleyeyim hikayesi varArray.prototype.smoosh
. Kısa versiyon, popüler bir kütüphane olan Mootools'dur Array.prototype.flatten
. Standartlar komitesi bir yerli eklemeye çalıştığında, pek Array.prototype.flatten
çok siteyi kırmadan yapamayacağını buldular. Arayı öğrenen geliştiriciler, es5 yöntemini smoosh
bir şaka olarak adlandırmayı önerdiler, ancak insanlar bunun bir şaka olduğunu anlamamasından korktular . Onlar yerleşmiş flat
yerineflatten
Hikayenin ahlaki, yerel nesneleri genişletmemeniz gerektiğidir. Bunu yaparsanız, eşyalarınızın kırılmasıyla ilgili aynı sorunla karşılaşabilirsiniz ve belirli kitaplığınız MooTools kadar popüler olmadıkça, tarayıcı satıcılarının neden olduğunuz sorunu çözme olasılığı düşüktür. Kitaplığınız bu kadar popüler hale gelirse, neden olduğunuz sorunla ilgili olarak herkesi çalışmaya zorlamak bir tür anlamsızlık olur. Bu nedenle, lütfen Yerel Nesneleri Genişletmeyin