สรุป:
const
และObject.freeze()
ตอบสนองวัตถุประสงค์ที่แตกต่างกันโดยสิ้นเชิง
const
มีไว้สำหรับการประกาศตัวแปรที่ต้องมอบหมายทันทีและไม่สามารถกำหนดใหม่ได้ ตัวแปรที่ประกาศโดยconst
จะถูกกำหนดขอบเขตบล็อกและไม่ใช่ฟังก์ชันที่กำหนดขอบเขตเหมือนตัวแปรที่ประกาศด้วยvar
Object.freeze()
เป็นวิธีการที่ยอมรับวัตถุและส่งคืนวัตถุเดียวกัน ตอนนี้อ็อบเจ็กต์ไม่สามารถลบคุณสมบัติใด ๆ หรือเพิ่มคุณสมบัติใหม่ได้
ตัวอย่างconst
:
ตัวอย่างที่ 1: ไม่สามารถกำหนดใหม่ได้ const
รหัสต่อไปนี้แสดงข้อผิดพลาดเนื่องจากเราพยายามกำหนดตัวแปร foo ที่ถูกประกาศด้วยconst
คีย์เวิร์ดอีกครั้งเราไม่สามารถกำหนดใหม่ได้
ตัวอย่างที่ 2: โครงสร้างข้อมูลที่กำหนดให้const
สามารถกลายพันธุ์ได้
const object = {
prop1: 1,
prop2: 2
}
object.prop1 = 5;
object.prop3 = 3;
console.log(object);
ในตัวอย่างนี้เราประกาศตัวแปรโดยใช้const
คีย์เวิร์ดและกำหนดอ็อบเจกต์ให้ แม้ว่าเราจะไม่สามารถกำหนดให้กับตัวแปรที่เรียกว่าอ็อบเจกต์นี้ได้ แต่เราสามารถเปลี่ยนอ็อบเจกต์ได้เอง หากเราเปลี่ยนคุณสมบัติที่มีอยู่หรือเพิ่มคุณสมบัติใหม่สิ่งนี้จะมีผล การปิดใช้งานการเปลี่ยนแปลงใด ๆ Object.freeze()
ต่อความต้องการวัตถุเรา
ตัวอย่างObject.freeze()
:
ตัวอย่างที่ 1: ไม่สามารถกลายพันธุ์วัตถุที่ถูกแช่แข็งได้
object1 = {
prop1: 1,
prop2: 2
}
object2 = Object.freeze(object1);
console.log(object1 === object2);
object2.prop3 = 3;
delete object2.prop1;
console.log(object2);
ในตัวอย่างนี้เมื่อเราเรียกObject.freeze()
และให้object1
เป็นอาร์กิวเมนต์ฟังก์ชันจะส่งคืนอ็อบเจ็กต์ซึ่งตอนนี้ 'ถูกตรึง' หากเราเปรียบเทียบการอ้างอิงของวัตถุใหม่กับวัตถุเก่าโดยใช้ตัว===
ดำเนินการเราสามารถสังเกตได้ว่าพวกเขาอ้างถึงวัตถุเดียวกัน นอกจากนี้เมื่อเราพยายามเพิ่มหรือลบคุณสมบัติใด ๆ เราจะเห็นว่าสิ่งนี้ไม่มีผลใด ๆ (จะทำให้เกิดข้อผิดพลาดในโหมดเข้มงวด)
ตัวอย่างที่ 2: ออบเจ็กต์ที่มีการอ้างอิงจะไม่ถูกตรึงอย่างสมบูรณ์
const object = {
prop1: 1,
nestedObj: {
nestedProp1: 1,
nestedProp2: 2,
}
}
const frozen = Object.freeze(object);
frozen.prop1 = 5;
frozen.nestedObj.nestedProp1 = 5;
console.log(frozen);
ตัวอย่างนี้แสดงให้เห็นว่าคุณสมบัติของวัตถุที่ซ้อนกัน (และอื่น ๆ ตามโครงสร้างข้อมูลอ้างอิง) ยังคงเปลี่ยนแปลงได้ ดังนั้นจึงObject.freeze()
ไม่ 'ตรึง' วัตถุอย่างสมบูรณ์เมื่อมีคุณสมบัติที่เป็นข้อมูลอ้างอิง (เช่น Arrays, Objects)