首頁 > web前端 > 前端問答 > es6怎麼聲明只讀常數

es6怎麼聲明只讀常數

青灯夜游
發布: 2023-01-11 17:38:56
原創
2004 人瀏覽過

在es6中,可以使用const關鍵字來宣告只讀常數,語法「const 常數名稱 = 常數值;」;一旦聲明,常數必須初始化且初始化的值就不能改變。 const聲明的常數屬於區塊作用域,受到「暫存死區」的約束,不會在window上建立任何全域屬性,不可重新分配,且不可重新宣告。

es6怎麼聲明只讀常數

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

在es6中,可以使用const關鍵字來宣告只讀常數。

es6 const關鍵字

const宣告一個只讀的常數。一旦聲明,常數必須進行初始化且初始化的值就不能改變。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.
登入後複製

const 常數遵守下列規則:

  • 是屬於區塊作用域的。

  • 受到「暫存死區」的約束。

  • 它不會在 window 上建立任何全域屬性。

  • 不可重新分配。

  • 不可重新宣告。

const一旦宣告變量,就必須立即初始化。

const foo;
// SyntaxError: Missing initializer in const declaration
登入後複製

上面程式碼表示,對於const來說,只宣告不賦值,就會報錯。

const的作用域與let指令相同:只在宣告所在的區塊層級作用域內有效。

if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined
登入後複製

const指令宣告的常數也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用。

if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}
登入後複製

上面程式碼在常數MAX宣告之前就調用,結果報錯。

const宣告的常數,也與let一樣不可重複宣告。

var message = "Hello!";
let age = 25;

// 以下两行都会报错
const message = "Goodbye!";
const age = 30;
登入後複製

const本質

const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體位址所保存的資料不得改變。對於簡單類型的資料(數值、字串、布林值),值就保存在變數指向的那個記憶體位址,因此等同於常數。但對於複合類型的資料(主要是物件和陣列),變數指向的記憶體位址,保存的只是指向實際資料的指針,const只能保證這個指標是固定的(即總是指向另一個固定的位址) ,至於它所指向的資料結構是不是可變的,就完全不能控制了。因此,將一個物件聲明為常數必須非常小心。

const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
登入後複製

上面程式碼中,常數foo儲存的是一個位址,這個位址指向一個物件。不可變的只是這個位址,即不能把foo指向另一個位址,但物件本身是可變的,所以依然可以為其添加新屬性。

下面是另一個例子。

const a = [];
a.push('Hello'); // 可执行
a.length = 0;    // 可执行
a = ['Dave'];    // 报错
登入後複製

上面程式碼中,常數a是一個數組,這個數組本身是可寫的,但是如果將另一個數組賦值給a,就會報錯。

如果真的想將物件凍結,應該使用Object.freeze方法。

const foo = Object.freeze({});

// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;
登入後複製

上面程式碼中,常數foo指向一個凍結的對象,所以新增屬性不起作用,嚴格模式時還會報錯。

除了將物件本身凍結,物件的屬性也應該凍結。下面是一個將物件徹底凍結的函數。

var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, i) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};
登入後複製

【相關推薦:javascript影片教學程式設計影片

以上是es6怎麼聲明只讀常數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板