可變性是改變值的能力。可變值可以更改,不可變值則無法更改。 一個常見的誤解是“const”關鍵字使變數不可變。
實際上,「const」只阻止重新分配。對於非物件類型,值只能透過重新指派來更改,因此用“const”聲明它們實際上使它們不可變。 例如,考慮以下程式碼:
const num = 5; num = 7; // illegal reassignment of const variable
在此程式碼中無法變更 num 的值。請注意,使用 ++ 或 -- 仍然被視為重新分配,如果我們嘗試在使用 const 聲明的變數上使用它們,則錯誤訊息中會指出這一點。
const num = 5; num++;//illegal reassignment of constant
產生的誤差是:
Uncaught TypeError: Assignment to constant variable.
物件在可變性方面有著根本的不同,因為它們的值可以在不重新分配變數的情況下改變。請注意,「const」不會阻止屬性的重新分配。僅阻止變數名稱重新分配。
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
物件也可以有改變內部值的方法。
const obj = { num: 5, increment(){ this.num++; } } obj.increment(); console.log(obj.num); //6
透過使用「const」宣告物件並使用 Object.freeze() 可以使物件實際上不可變。
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
請注意,如果我們使用嚴格模式,嘗試更改 num 值實際上會導致崩潰,並顯示以下錯誤訊息:
Cannot assign to read only property 'num'
使用不含「const」的 Object.freeze() 已經足以使該物件不可變。但是,它並不使變數名稱不可變。
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
此版本程式碼中發生的情況是 obj 被重新指派。 freeze() 應用於共享相同名稱的前一個對象,但新對象從未被凍結,因此它是可變的。
有時您可能希望允許物件中的值發生更改,但又不想允許新增或刪除屬性。 這可以透過使用 Object.seal() 來實現。
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
冷凍和密封適用於整個物體。如果您想要讓特定屬性不可變,可以使用defineProperty() 或defineProperties() 來完成。這兩者之間的選擇取決於您想要影響單一屬性還是多個屬性。
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
本例中定義了一個新屬性,但也可以在現有屬性上使用defineProperty()。 請注意,如果「configurable」之前設定為 false,則無法變更為 true,但如果原來為 true,則可以設定為 false,因為此變更算是一種配置。
在大多數情況下,您不需要保證物件是不可變的。當出現這種需要時,通常凍結物件就足夠了,但如果出現這種需要,我們還有其他選項可以進行更精細的控制。
以上是JavaScript 中的物件可變性的詳細內容。更多資訊請關注PHP中文網其他相關文章!