ES5 中,使用 var 定义变量(var是 variable 的缩写)。
ES6 中,新增了 let 和 const 来定义变量:
-
• let - 定义变量,代替 var
-
• const - 定义常量
ES5中定义常量
ES5中可以通过 Object.defineProperty 来定义常量。.
// 定义常量 PI
Object.defineProperty(window, 'PI', {
value: 3.14,
writable: false,
});
var变量会挂载在 window 对象上
var var1 = 'var1';
console.log(var1); // var1
console.log(window.var1); // var1
let let1 = 'let1';
console.log(let1); // let1
console.log(window.let1); // undefined
const const1 = 'const1';
console.log(const1); // const1
console.log(window.const1); // undefined
使用 var 定义变量,容易造成全局污染(污染整个js的作用域)
var变量存在变量提升
console.log(var2); // undefined
var var2 = 'var2';
console.log(let2); // 报错:Uncaught ReferenceError: Cannot access 'let2' before initialization
let let2 = 'let2';
console.log(const2); // 报错:Uncaught ReferenceError: Cannot access 'const2' before initialization
const const2 = 'const2';
var声明不存在块级作用域
{
var var3 = 'var3';
let let3 = 'let3';
const cosnt3 = 'cosnt3';
}
console.log(var3); // var3
console.log(let3); // 报错:Uncaught ReferenceError: let3 is not defined
console.log(const3); // 报错:Uncaught ReferenceError: const3 is not defined
同一作用域下,var可以重复声明变量
var var4 = 'var4';
var var4 = 'var4';
console.log(var4); // var4
let let4 = 'let4';
let let4 = 'let4';
console.log(let4); // 报错:Uncaught SyntaxError: Identifier 'let4' has already been declared
const const4 = 'const4';
const const4 = 'const4';
console.log(const4); // 报错:Uncaught SyntaxError: Identifier 'const4' has already been declared
let和const的暂时性死区(DTC)
const const5 = 'const5';
function test() {
console.log(const5);
const const5 = 'const5';
}
test(); // 报错:Uncaught ReferenceError: Cannot access 'const5' before initialization
如果在当前块级作用域中使用了变量 const5,并且在当前块级作用域通过 let/const 声明了同名的变量,那么声明语句必须放在使用之前,也就是DTC。
const变量声明时必须赋值并且不能再修改
const const6 = 'const6';
const6 = 'const7'; // 报错:Uncaught TypeError: Assignment to constant variable.
如果const声明引用数据类型,不允许修改变量的内存指向,但对象里的属性是可以修改的。