Thứ tự thuộc tính trong các Đối tượng bình thường là một chủ đề phức tạp trong Javascript.
Mặc dù trong ES5 rõ ràng không có đơn hàng nào được chỉ định, ES2015 có một đơn đặt hàng trong một số trường hợp nhất định. Cho là đối tượng sau:
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},
});
Điều này dẫn đến thứ tự sau (trong một số trường hợp nhất định):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
m: function() {},
Symbol(): "sym"
}
- các khóa giống như số nguyên theo thứ tự tăng dần
- các phím thông thường theo thứ tự chèn
- Ký hiệu theo thứ tự chèn
Do đó, có ba phân đoạn, có thể thay đổi thứ tự chèn (như đã xảy ra trong ví dụ). Và các khóa giống như số nguyên không dính vào thứ tự chèn nào cả.
Câu hỏi là, đối với phương thức nào, thứ tự này được đảm bảo trong thông số ES2015?
Các phương pháp sau đây đảm bảo thứ tự hiển thị:
- Object.assign
- Object.defineProperies
- Object.getOwnPropertyNames
- Object.getOwnPropertySymbols
- Reflect.ownKeys
Các phương thức / vòng lặp sau đây đảm bảo không có thứ tự nào cả:
- Object.keys
- tại
- JSON.parse
- JSON.opesify
Kết luận: Ngay cả trong ES2015, bạn không nên dựa vào thứ tự thuộc tính của các đối tượng bình thường trong Javascript. Nó dễ bị lỗi. Sử dụng Map
thay thế.