- const 用来声明常量。一旦声明,就不能改变。
- const在声明必须初始化,只声明不赋值会出错
- const的作用域与let一样,只在声明的块级作用域有效。
- const命令声明的常量也不提升,同样存在暂时性死去,只能在声明后使用。
- 对于复合型变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个变量声明为常量要非常小心。
const foo = {};
foo.prop = 123;
console.log(foo.prop);//123
foo = {}
console.log(foo);//Uncaught TypeError: Assignment to constant variable.
上面的代码中,常量foo储存的是一个地址,指向一个对象。不可改变的只是这个地址而不是对象。
下面是另一个例子
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,value) => {
if(typeof obj[key] == 'Object'){
constantize(obj[key]);
}
});
}
ES5中只有两种声明变量的方法:var命令和我function命令。ES6除let和const命令,还有另外两种声明变量的方法:import命令和class命令。所以,ES6一共有6种声明变量的方法。