原文鏈接:http://www.fly63.com/article/detial/952
由一個有個問題引入:const定義的對象屬性是否可以改變?如果你面試回答不可以,那么面試官會告訴你回答錯了,這難道const定義的並非一定為常量?下面先看下const的定義:
const是用來定義常量的,而且定義的時候必須初始化,且定義后不可以修改。
這對於基本類型的數據而言:如果定義的時候不初始化值的話就會報錯,錯誤內容就是沒有初始化。並且const定義的基本數據類型的變量確實不能修改。例如:
1、不初始化的情況
const PI // Uncaught SyntaxError: Missing initializer in const declaration
2、修改變量的情況
const PI=3.14159 PI=3 Uncaught TypeError: Assignment to constant variable.
上面說的const定義的屬性可變,是針對對象或者數組的。例如:
1、const定義對象:
const Obj = {}; Obj.name = "fly63"; console.log(Obj.name); // 打印fly63
2、const定義數組
Arr=[3,4] Arr[0]=1 console.log(Arr) //輸出[1,4] //不應許直接賦值,回報錯:Uncaught TypeError: Assignment to constant variable. Arr=[1,4]
為什么會這樣呢?這是由於對象或者數組屬於引用數據類。
const實際上保證的,並不是變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。
對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同於常量。但對於復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的(即總是指向另一個固定的地址),至於它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。