一旦将某个固定的值赋值给常量,任何从新给常量赋新值的尝试都会致使错误发生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
复制代码