站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

es6怎么聲明只讀常量

在es6中,可以使用const關(guān)鍵字來聲明只讀常量,語法“const 常量名 = 常量值;”;一旦聲明,常量必須進(jìn)行初始化且初始化的值就不能改變。const聲明的常量屬于塊作用域,受到“暫存死區(qū)”的約束,不會在window上創(chuàng)建任何全局屬性,不可重新分配,不可重新聲明。

es6怎么聲明只讀常量

本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。

在es6中,可以使用const關(guān)鍵字來聲明只讀常量。

es6 const關(guān)鍵字

const聲明一個只讀的常量。一旦聲明,常量必須進(jìn)行初始化且初始化的值就不能改變。

const PI = 3.1415; PI // 3.1415  PI = 3; // TypeError: Assignment to constant variable.
登錄后復(fù)制

const 常量遵守以下規(guī)則:

  • 是屬于塊作用域的。

  • 受到“暫存死區(qū)”的約束。

  • 它不會在 window 上創(chuàng)建任何全局屬性。

  • 不可重新分配。

  • 不可重新聲明。

const一旦聲明變量,就必須立即初始化。

const foo; // SyntaxError: Missing initializer in const declaration
登錄后復(fù)制

上面代碼表示,對于const來說,只聲明不賦值,就會報錯。

const的作用域與let命令相同:只在聲明所在的塊級作用域內(nèi)有效。

if (true) {   const MAX = 5; }  MAX // Uncaught ReferenceError: MAX is not defined
登錄后復(fù)制

const命令聲明的常量也是不提升,同樣存在暫時性死區(qū),只能在聲明的位置后面使用。

if (true) {   console.log(MAX); // ReferenceError   const MAX = 5; }
登錄后復(fù)制

上面代碼在常量MAX聲明之前就調(diào)用,結(jié)果報錯。

const聲明的常量,也與let一樣不可重復(fù)聲明。

var message = "Hello!"; let age = 25;  // 以下兩行都會報錯 const message = "Goodbye!"; const age = 30;
登錄后復(fù)制

const本質(zhì)

const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內(nèi)存地址所保存的數(shù)據(jù)不得改動。對于簡單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個內(nèi)存地址,因此等同于常量。但對于復(fù)合類型的數(shù)據(jù)(主要是對象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個指向?qū)嶋H數(shù)據(jù)的指針,const只能保證這個指針是固定的(即總是指向另一個固定的地址),至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。

const foo = {};  // 為 foo 添加一個屬性,可以成功 foo.prop = 123; foo.prop // 123  // 將 foo 指向另一個對象,就會報錯 foo = {}; // TypeError: "foo" is read-only
登錄后復(fù)制

上面代碼中,常量foo儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把foo指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。

下面是另一個例子。

const a = []; a.push('Hello'); // 可執(zhí)行 a.length = 0;    // 可執(zhí)行 a = ['Dave'];    // 報錯
登錄后復(fù)制

上面代碼中,常量a是一個數(shù)組,這個數(shù)組本身是可寫的,但是如果將另一個數(shù)組賦值給a,就會報錯。

如果真的想將對象凍結(jié),應(yīng)該使用Object.freeze方法。

const foo = Object.freeze({});  // 常規(guī)模式時,下面一行不起作用; // 嚴(yán)格模式時,該行會報錯 foo.prop = 123;
登錄后復(fù)制

上面代碼中,常量foo指向一個凍結(jié)的對象,所以添加新屬性不起作用,嚴(yán)格模式時還會報錯。

除了將對象本身凍結(jié),對象的屬性也應(yīng)該凍結(jié)。下面是一個將對象徹底凍結(jié)的函數(shù)。

var constantize = (obj) => {   Object.freeze(obj);   Object.keys(obj).forEach( (key, i) => {     if ( typeof obj[key] === 'object' ) {       constantize( obj[key] );     }   }); };
登錄后復(fù)制

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
国产亚洲精品激情都市| 55夜色66夜色国产精品| 日本精品无码一区二区三区久久久 | 中文精品久久久久人妻不卡| 国产精品午夜无码体验区| 亚洲精品免费视频| 亚洲精品视频在线观看你懂的| 亚洲精品无码久久久久APP | 国产在线拍揄自揄视精品不卡| 一区二区三区日韩| 亚洲国产精品免费在线观看| 久久久久久青草大香综合精品 | 国产精品永久在线观看| 精品一区二区三区东京热| 精品乱码久久久久久夜夜嗨| 国产成人精品亚洲一区| 久久这里都是精品| 日韩精品人妻系列无码专区免费| 国产三级精品三级| 亚洲国产日韩在线一区| 2020年国产精品| 亚洲国产精品综合久久久| 久久青青草原精品影院| 亚洲电影日韩精品 | 国产精品美女网站| 亚洲AV日韩精品久久久久久久| 亚洲国产精品无码观看久久| 3d动漫精品啪啪一区二区中 | 国产精品无码AV一区二区三区| 日本精品一区二区久久久| 国产综合精品一区二区| 国产精品视频第一页| 99久久99久久久精品久久| 国产精品美女久久久m| 国产一区二区精品久久岳| 国产精品午夜一级毛片密呀| 精品视频在线观看一区二区三区 | 青青青国产精品国产精品久久久久| 久久精品亚洲乱码伦伦中文| 国产成人精品高清不卡在线 | 少妇人妻偷人精品无码视频新浪|