一旦將某個固定的值賦值給常量,任何從新給常量賦新值的嘗試都會致使錯誤發生javascript
//案例-1
const NORMAL_NUMBER=123; //定義一個常量
NORMAL_NUMBER=12; //嘗試從新賦值
console.log(NORMAL_NUMBER); // 報錯
複製代碼
以上代碼會讓咱們的思惟變得很混亂,咱們腦海中會認爲這是一成不變的常量,常量是不變的,因此咱們不能給它從新賦值,可是你會發現,這裏所說的"不變"和"不能從新賦值"有什麼區別呢?java
//案例-2
const normalObject={}; //定義一個常量
normalObject.propertyOne='this is property of One';
normalObject.propertyOne='this is a new property'; //從新給對象的屬性賦值
console.log(normalObject.propertyOne); //'this is a new property';
複製代碼
此時輸出的是對象屬性propertyOne從新賦值後的屬性值數組
//案例-3
normalObject={newProperty:'eastboat'} //嘗試從新賦值一個新的對象,將屬性定義爲newProperty
console.log(normalObject); //TypeError: Assignment to constant variable.
複製代碼
由上述可知,從新賦值與變量的綁定有關,也就是將名稱綁定到某條數據上,如上案例1,NORMAL_NUMBER變量是被綁定到了數據123上面,因此從新賦值就會報錯;而常量是不可變的,這裏的不變是屬於綁定時所含的實際數據的屬性,如上案例2和3所示,常量綁定的是一個對象,咱們都知道js中字符串,數組等都是不可變,可是對象是可變的(引用類型),因此建立後的對象咱們將可變的值(屬性)賦給它。若是將常量從新定義爲一個新的對象(指向一個新的地址),此時就會報錯,因此咱們只能修改對象數據自己的值,而不能直接修改常量自己。安全
const num=0;
num++;
console.log(num)
複製代碼
如今咱們再看一個案例:函數
let strA='hello';
let strB=strA;
strB += ‘,world’;
console.log(strA) //hello
console.log(strB) //hello,world
複製代碼
+=
的緣由,由於有新的值產生,那麼此時你能夠再次思考下面代碼發生了什麼?
const strA='hello';
const strB=strA.concat(',world!')
複製代碼
有時候直覺讓咱們以爲報錯,可是請記住concat是對字符串進行的操做,不改變現存的字符串或對含有此字符串的變量進行從新賦值,因此此時strB獲得的是一個新的字符串學習
//最多見使用常量建立標識
const ADD_PERSON='ADD_PERSON';
const DEL_PERSON='DEL_PERSON';
let personArr=[];
function actionHandler(action){
if(action.type==ADD_PERSON){
personArr.push(action.person)
}else if(action.type==DEL_PERSON){
personArr.splice(personArr.indexOf(action.person),1)
}
}
複製代碼
若是上面的personArr
不會被從新賦值,咱們是否可使用const來聲明?ui
const ADD_PERSON='ADD_PERSON';
const DEL_PERSON='DEL_PERSON';
const personArr=[];
function actionHandler(action){
if(action.type==ADD_PERSON){
personArr.push(action.person)
}else if(action.type==DEL_PERSON){
personArr.splice(personArr.indexOf(action.person),1)
}
}
複製代碼
設想:我如今須要一個動做來清空列表,可能咱們本能的會想到,使用item=[]
來清空數組,可是上面咱們使用的是const
聲明的常量,常量是不能被從新賦值的this
const ADD_PERSON='ADD_PERSON';
const DEL_PERSON='DEL_PERSON';
const DEL_ALL_PERSON='DEL_ALL_PERSON'; //增長清空數組行爲
const personArr=[];
function actionHandler(action){
if(action.type==ADD_PERSON){
personArr.push(action.person)
}else if(action.type==DEL_PERSON){
personArr.splice(personArr.indexOf(action.person),1)
}else if(action.type==DEL_ALL_PERSON){
personArr.splice(0,personArr.length) //清空數組
}
}
複製代碼
最後看一個案例spa
//常量與綁定值有關,不與所綁定值裏面的數值有關,函數僅僅是返回數值,而不是綁定的值
//因此新的let綁定的值能夠安全的進行從新賦值
function getValue(){
const val=123;
return val
}
let myVal=getValue();
console.log(myVal+=1); //124
複製代碼