ลำดับคุณสมบัติใน Objects ปกติเป็นเรื่องที่ซับซ้อนใน Javascript
ในขณะที่ ES5 ไม่มีการระบุคำสั่งอย่างชัดเจน ES2015 มีคำสั่งในบางกรณี รับเป็นวัตถุต่อไปนี้:
o = Object.create(null, {
m: {value: function() {}, enumerable: true},
"2": {value: "2", enumerable: true},
"b": {value: "b", enumerable: true},
0: {value: 0, enumerable: true},
[Symbol()]: {value: "sym", enumerable: true},
"1": {value: "1", enumerable: true},
"a": {value: "a", enumerable: true},
});
ผลลัพธ์นี้ตามลำดับต่อไปนี้ (ในบางกรณี):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- คีย์ที่เหมือนจำนวนเต็มตามลำดับจากน้อยไปมาก
- ปุ่มปกติในลำดับการแทรก
- สัญลักษณ์ตามลำดับการแทรก
ดังนั้นจึงมีสามส่วนซึ่งอาจเปลี่ยนลำดับการแทรก (ดังที่เกิดขึ้นในตัวอย่าง) และปุ่มที่เหมือนจำนวนเต็มไม่ยึดตามคำสั่งแทรกเลย
คำถามคือสำหรับสิ่งที่วิธีการสั่งซื้อนี้รับประกันในสเป็ค ES2015?
วิธีการต่อไปนี้รับประกันลำดับที่แสดง:
- Object.assign
- Object.defineProperties
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
วิธีการ / ลูปต่อไปนี้รับประกันไม่มีการสั่งซื้อเลย:
- Object.keys
- สำหรับใน
- JSON.parse
- JSON.stringify
สรุป: แม้ใน ES2015 คุณไม่ควรพึ่งพาลำดับคุณสมบัติของวัตถุปกติใน Javascript มันมีแนวโน้มที่จะเกิดข้อผิดพลาด ใช้Map
แทน