使用const聲明常量

思考中帶着問題去學習:

  1. 什麼是常量?他們的工做機制是什麼?
  2. 學會在何時使用常量?

常量不能被從新賦值

一旦將某個固定的值賦值給常量,任何從新給常量賦新值的嘗試都會致使錯誤發生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

複製代碼
相關文章
相關標籤/搜索