let,const,var这三个命令均是用来声明变量。
let
- let声明的变量,只在let所在的代码块有效。
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
- let命令不存在变量提升
"变量提升"是指:变量可以在声明之前使用,var
会存在变量提升现象,值为undefined
;而let
要先声明再使用,否则会报错。
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
- let不允许重复声明
let
不允许在相同作用域内,重复声明一个变量。
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
const
const
的语法与let基本相似,有以下几点区别于let
命令
const
声明一个只读常量,一旦声明,常量的值就不可改变。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
- const声明的变量必须立即初始化,只声明而不赋值,会报错
const foo;
// SyntaxError: Missing initializer in const declaration
- const的本质
const
实际上保证的,并不是变量的值不得改动,而是变量指向的内存地址所保存的数据不能改动。对于简单的数据类型(数值,字符串、布尔值),值就是保存在变量指向的那个内存地址,因此等同于常量;对于复合类型的数据(对象、数组),变量指向的是内存地址,所以,const
只能保证这个指针是固定的(即总是指向另一个固定的地址)。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
上面代码中,常量foo存储的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,,但是对象本身是可变的,还能够继续添加新属性。