คำตอบที่มีประสิทธิภาพมากที่สุด (เช่นที่จับภาพเจตนาของสิ่งที่คุณพยายามทำในขณะที่ทำให้เกิดข้อบกพร่องน้อยที่สุด) คือ:
Object.size = function(obj) {
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
// Get the size of an object
var size = Object.size(myObj);
มีการเรียงลำดับของการประชุมใน JavaScript ที่คุณไม่ได้เพิ่มสิ่งต่าง ๆ ใน Object.prototypeเพราะมันสามารถแยกการแจกแจงในไลบรารีต่างๆ แม้ว่าการเพิ่มวิธีการไปยังวัตถุมักจะปลอดภัย
นี่คือการอัปเดตในปี 2559 และการปรับใช้ ES5 อย่างกว้างขวางและอื่น ๆ สำหรับ IE9 + และเบราว์เซอร์ที่มีความสามารถ ES5 + ที่ทันสมัยอื่น ๆ คุณสามารถใช้Object.keys()
เพื่อให้โค้ดข้างต้นกลายเป็น:
var size = Object.keys(myObj).length;
สิ่งนี้ไม่จำเป็นต้องแก้ไขต้นแบบที่มีอยู่ตั้งแต่Object.keys()
ตอนนี้ภายใน
แก้ไข : วัตถุสามารถมีคุณสมบัติเป็นสัญลักษณ์ซึ่งไม่สามารถส่งคืนได้ด้วยวิธีการ Object.key ดังนั้นคำตอบจะไม่สมบูรณ์โดยไม่ต้องพูดถึง
เพิ่มประเภทสัญลักษณ์ในภาษาเพื่อสร้างตัวระบุที่ไม่ซ้ำกันสำหรับคุณสมบัติของวัตถุ ประโยชน์หลักของประเภทสัญลักษณ์คือการป้องกันการเขียนทับ
Object.keys
หรือObject.getOwnPropertyNames
ไม่ทำงานสำหรับคุณสมบัติเชิงสัญลักษณ์ Object.getOwnPropertySymbols
จะกลับพวกเขาคุณจะต้องใช้
var person = {
[Symbol('name')]: 'John Doe',
[Symbol('age')]: 33,
"occupation": "Programmer"
};
const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1
let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2