Perf ยังเป็นเหตุผล บางครั้งคุณอาจต้องวนคีย์ มีหลายวิธีในการดำเนินการนี้
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
ฉันมักจะใช้for of Object.keys()
มันเป็นสิ่งที่ถูกต้องและค่อนข้างสั้นไม่จำเป็นต้องเพิ่มเช็ค
แต่มันช้ากว่ามาก
เพียงแค่คาดเดาเหตุผลที่Object.keys
ช้าก็ชัดเจนObject.keys()
ต้องทำการจัดสรร ในความเป็นจริง AFAIK จะต้องจัดสรรสำเนาของคีย์ทั้งหมดตั้งแต่นั้นมา
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
เป็นไปได้ว่าเอ็นจิ้น JS สามารถใช้โครงสร้างคีย์ที่ไม่เปลี่ยนรูปได้เพื่อที่Object.keys(object)
จะส่งคืนข้อมูลอ้างอิงที่วนซ้ำบนคีย์ที่ไม่เปลี่ยนรูปและobject.newProp
สร้างอ็อบเจกต์คีย์ที่ไม่เปลี่ยนรูปใหม่ทั้งหมด แต่อย่างใดก็ตามมันช้าลงอย่างชัดเจนถึง 15x
แม้แต่การตรวจสอบhasOwnProperty
ก็ช้าลงถึง 2 เท่า
จุดทุกที่คือว่าถ้าคุณมี perf รหัสที่สำคัญและจำเป็นที่จะต้องห่วงกุญแจแล้วคุณต้องการเพื่อให้สามารถใช้งานได้โดยไม่ต้องโทรfor in
hasOwnProperty
คุณสามารถทำได้ก็ต่อเมื่อคุณไม่ได้แก้ไขObject.prototype
โปรดทราบว่าหากคุณใช้Object.defineProperty
เพื่อแก้ไขต้นแบบหากสิ่งที่คุณเพิ่มไม่สามารถระบุได้สิ่งเหล่านั้นจะไม่ส่งผลต่อพฤติกรรมของ JavaScript ในกรณีข้างต้น น่าเสียดายที่อย่างน้อยใน Chrome 83 จะส่งผลต่อประสิทธิภาพ
ฉันเพิ่มคุณสมบัติที่ไม่สามารถนับได้ 3000 รายการเพื่อพยายามบังคับให้ปัญหาเกี่ยวกับความสมบูรณ์ปรากฏขึ้น ด้วยคุณสมบัติเพียง 30 รายการการทดสอบจึงใกล้เกินไปที่จะบอกได้ว่ามีผลกระทบอย่างสมบูรณ์หรือไม่
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 และ Safari 13.1 ไม่พบความแตกต่างระหว่างคลาส Augmented และ Unaugmented บางที v8 จะได้รับการแก้ไขในพื้นที่นี้และคุณสามารถเพิกเฉยต่อปัญหาที่สมบูรณ์แบบได้
แต่ขอฉันเพิ่มด้วยมีเรื่องราวของArray.prototype.smoosh
. รุ่นสั้น Mootools Array.prototype.flatten
ห้องสมุดที่นิยมทำของตัวเอง เมื่อคณะกรรมการมาตรฐานพยายามเพิ่มเนทีฟArray.prototype.flatten
พวกเขาพบว่าไม่สามารถทำได้โดยไม่ทำลายไซต์จำนวนมาก นักพัฒนาที่ค้นพบเกี่ยวกับการหยุดพักแนะนำให้ตั้งชื่อเมธอด es5 smoosh
เป็นเรื่องตลก แต่ผู้คนกลับไม่เข้าใจว่ามันเป็นเรื่องตลก พวกเขาตัดสินflat
แทนflatten
คุณธรรมของเรื่องราวคือคุณไม่ควรขยายวัตถุพื้นเมือง หากคุณพบปัญหาเดียวกันกับการทำลายสิ่งของและเว้นแต่ว่าไลบรารีเฉพาะของคุณจะได้รับความนิยมเท่ากับ MooTools ผู้จำหน่ายเบราว์เซอร์ก็ไม่น่าจะแก้ไขปัญหาที่คุณเกิดได้ หากห้องสมุดของคุณได้รับความนิยมอย่างนั้นการบังคับให้คนอื่นแก้ไขปัญหาที่คุณเกิดขึ้น ดังนั้นโปรดอย่าขยายวัตถุดั้งเดิม