การใช้งานวัตถุมาตรฐาน ( คุณสมบัติและวิธีการภายในวัตถุของ ES5.1 ) ไม่จำเป็นต้องมีObject
การติดตามจำนวนของคีย์ / คุณสมบัติดังนั้นจึงไม่มีวิธีมาตรฐานในการกำหนดขนาดของObject
โดยไม่มีการวนซ้ำอย่างชัดเจนหรือโดยปริยาย
ดังนั้นนี่คือทางเลือกที่ใช้บ่อยที่สุด:
1. Object.keys ของ ECMAScript ()
Object.keys(obj).length;
ทำงานโดยการวนซ้ำภายในคีย์เพื่อคำนวณอาร์เรย์ชั่วคราวและส่งคืนความยาว
- ข้อดี - ไวยากรณ์ที่อ่านได้และทำความสะอาด ไม่จำเป็นต้องใช้ไลบรารีหรือรหัสที่กำหนดเองยกเว้น shim หากการสนับสนุนดั้งเดิมไม่พร้อมใช้งาน
- Cons - โอเวอร์เฮดหน่วยความจำเนื่องจากการสร้างอาเรย์
2. โซลูชันบนห้องสมุด
ตัวอย่างจากห้องสมุดหลายแห่งในหัวข้อนี้เป็นสำนวนที่มีประโยชน์ในบริบทของห้องสมุด อย่างไรก็ตามจากมุมมองประสิทธิภาพการทำงานไม่มีอะไรที่จะได้รับเมื่อเทียบกับโค้ดที่ไม่มีไลบรารีที่สมบูรณ์แบบเนื่องจากเมธอดไลบรารีทั้งหมดนั้นห่อหุ้มแบบ for-loop หรือ ES5 Object.keys
(native หรือ shimmed)
3. การปรับให้เหมาะสมสำหรับ for-loop
ส่วนที่ช้าที่สุดของ for-loop นั้นโดยทั่วไปแล้วเป็นการ.hasOwnProperty()
เรียกเนื่องจากการเรียกใช้ฟังก์ชัน ดังนั้นเมื่อผมต้องการเพียงแค่จำนวนของรายการของวัตถุ JSON ที่ฉันเพิ่งข้ามโทรถ้าฉันรู้ว่ารหัสไม่ได้หรือจะขยาย.hasOwnProperty()
Object.prototype
มิฉะนั้นรหัสของคุณอาจได้รับการปรับให้เหมาะสมเล็กน้อยโดยการกำหนดk
local ( var k
) และโดยใช้ตัวดำเนินการเพิ่มคำนำหน้า ( ++count
) แทน postfix
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
ความคิดอื่นอาศัยการแคชhasOwnProperty
เมธอด:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
ไม่ว่าจะเร็วกว่านี้หรือไม่ในสภาพแวดล้อมที่กำหนดเป็นคำถามของการเปรียบเทียบ สามารถเพิ่มประสิทธิภาพที่ จำกัด ได้อย่างมาก