ES6 中的变量
在 ES6 中,有三种方式可以声明变量
var
var
是 JavaScript 中最传统的声明变量的方式。它的作用域是整个封闭函数,也就是说,var
声明的变量在整个函数中都是可见的,无论声明在函数的哪个位置。
例子
javascriptfunction example() { console.log(x); // undefined,而不是报错 var x = 5; console.log(x); // 5 }
这个例子中,虽然x
是在console.log(x)
之后声明的,但是console.log(x)
并没有报错,而是输出了 undefined
。这是因为var
声明的变量会被提升到函数的顶部。
- 注:
在函数中使用使用
var
声明变量时候,该变量是局部的jsvar a = 20; function change() { var a = 30; } change(); console.log(a); // 20
如果在函数内不使用
var
,该变量是全局的jsvar a = 20; function change() { a = 30; } change(); console.log(a); // 30
let
let
是 ES6
新增的命令,用来声明变量
用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效
{
let x = 2;
console.log(x); // 2
}
console.log(x); // 报错:x is not defined
let
也不会变量提升,必须先声明变量,然后再使用它
console.log(x); // 报错:x is not defined
let x = 5;
只要块级作用域内存在let
命令,这个区域就不再受外部影响
并且,如果一个区域内存在 let
命令,那么这个区域从开始到 let
命令声明的位置,都属于 let
命令的 "暂时性死区"。在这个区域内,任何对这个声明的变量的引用都会导致错误。
var a = 123;
if (true) {
a = "abc"; // ReferenceError
let a;
}
let
不允许在相同作用域中重复声明
let x = 2;
let x = 3; // SyntaxError: Identifier 'x' has already been declared
const
const
用于声明常量,也就是说,一旦一个变量被 const
声明,就不能再被重新赋值。const
的作用域也是块级作用域。
例如:
const PI = 3.14;
PI = 1; // TypeError: Assignment to constant variable.
如果之前用var
或let
声明过变量,再用const
声明同样会报错
var a = 20;
let b = 20;
const a = 30;
const b = 30;
// 都会报错
const
实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动
对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量
对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的,并不能确保改变量的结构不变
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop; // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
区别
变量提升
var
声明的变量存在变量提升,即变量可以在声明之前调用,值为 undefined
let
和const
不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错
暂时性死区
var
不存在暂时性死区
let
和const
存在暂时性死区,只有等到声明变量的那一行代码出现,才可以获取和使用该变量
块级作用域
var
不存在块级作用域
let
和const
存在块级作用域
重复声明
var
允许重复声明变量
let
和const
在同一作用域不允许重复声明变量
修改声明的变量
var
和let
可以
const
声明一个只读的常量。一旦声明,常量的值就不能改变