js中的const 命令

js中的const 命令

一直以來我在我字典裏認爲const 命令就是用來聲明一個常量,然後並非如此,這也是我在工作中偶然發現的,然後查了下文檔才得知,記錄在檔,以供參考:

const 定義

const聲明一個只讀的常量 。一旦聲明, 常量的值就不能改變。
常量 所謂的常量就是不能改變的值

const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.

上面代碼表明改變常量的值會報錯。

const聲明的變量不得改變值,這意味着,const一旦聲明變量,就必須立即初始化,不能留到以後賦值。
接下來讓我們見證它的值是如何變得:

const 不爲人知的祕密

並不是變量的值不能改動,而是指向的那個內存地址所保存的數據不得改動;數據一半存儲在堆中,
對於簡單的基本數據類型(string number boolean null undefined)值保存在指向的那個內存地址,因此等同於常量。
對於引用數據類型(object array ),變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針
是固定的(即指向另一個固定的地址),至於它指向的數據結構是不是可變的,就完全不能夠控制了。

const foo = {};
// 爲 foo 添加一個屬性,可以成功
foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個對象,就會報錯
foo = {}; // TypeError: "foo" is read-only

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

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] );
    }
  });
};

本文參考於阮老師ECMAScript 6 入門一書
不積硅步無以至千里。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章