Object ใน JavaScript การแจง property หรือ Enumerating
method มาตรฐานที่รับสืบทอดมาจะไม่สามารถแจงได้ แต่ property ที่เพิ่มเข้าไปโดยโค้ดตามปกติจะถูกแจงได้
let o = {x: 1, y: 2, z: 3}; // Three enumerable own properties o.propertyIsEnumerable("toString") // => false: not enumerable for(let p in o) { // Loop through the properties console.log(p); // Prints x, y, and z, but not toString }
การเช็คเพื่อข้าม property ที่สืบทอดมา และข้าม method
for(let p in o) { if (!o.hasOwnProperty(p)) continue; // Skip inherited properties } for(let p in o) { if (typeof o[p] === "function") continue; // Skip all methods }
ยังมี mothod ที่สามารถใช้ดึงรายการของชื่อ property ออกมาเป็น array
- Object.keys() คืนชื่อของ property ที่เป็น enumberable, own properties และชื่อ property ต้องเป็น String (ชื่อที่เป็น Symbol จะถูกข้าม)
- Object.getOwnPropertyNames() คืนชื่อของ property ที่เป็น enumberable+non-enumerable, own properties และชื่อ property ต้องเป็น String (ชื่อที่เป็น Symbol จะถูกข้าม)
- Object.getOwnPropertySymbols() คืนชื่อของ property ที่เป็น Symbol ทั้งหมด
- Reflect.ownKeys() คืนชื่อของ property ที่เป็น own property ทั้งหมด enumerable+non-enumberable, string+Symbol
การเรียง property จากการแจง
Array ของชื่อ Property ที่ได้มาจาก method ด้านบนจะเรียงตาม:
- Property ที่เป็นตัวเลขเต็มบวกจะเริ่มก่อน เรียงจากมากไปหาน้อย
- ต่อด้วย property ที่มีชื่อเป็น String ซึ่งรวมไปถึงตัวเลขจำนวนลบ โดยจะเรียงตามลำดับที่ถูกใส่เข้ามาใน Object
- จากนั้นจึงเป็น property ที่มีชื่อเป็น Symbol เรียงตามลำดับที่ถูกใส่เข้ามาใน Object
ลูป for/in ก็จะเรียงตามนี้แต่จะไล่ property ที่เป็นของ object เองจนหมดก่อนที่จะขยับไล่ขึ้นไปตาม prototype chain.
Comments
Post a Comment