1.const
1.1 const声明一个只读的常量,一旦声明,这个常量的值就不能被改变。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.改变常量的值会报错
1.2 const一旦声明,就必须赋值,不可以留到以后再赋值。
1.3 const和let一样,都只在声明的块级作用域{}内有效。
if (true) {
const MAX = 5;
}
MAX;
这里的MAX声明和后面的调用不在一个作用域。
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
1.4 const 的声明也与let一样,不可重复使用
var message = "你好!我是第一次声明";
let msg = "好累,想喝四果汤";
const message = "你好!我是第二次声明!";//Uncaught SyntaxError: Identifier 'message' has already been declared
const msg = "我想吃炸鸡"; //Uncaught SyntaxError: Identifier 'msg' has already been declared
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
1.5 常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,对象本身是可变的,可以为其添加新属性。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
1.6 常量a本身是一个数组,数组本身可写,但是如果把另一个数组赋值给a,就会报错。
const a = [];
a.push('Hello');
// console.log(a); //["Hello"]
a.length = 0;
// console.log(a); //[]
a = ['Dave']; //报错
1.7 顶层对象,在浏览器环境指的是window对象
es6文档中:
var a = 1;
console.log(window.a); //1
let b = 1;
console.log(window.b); //undefined
全局变量a是用var声明的,所以它是顶层对象的属性;全局变量b是用let声明的,所以它不是顶层对象的属性,返回undefined。