let
变量不提升
let
声明的变量不存在变量提升,只能先完成声明,再使用,否则会报错
console.log(a); // undefined
console.log(b); // Uncaught ReferenceError: b is not defined
var a = 1;
let b = 2;
只在当前代码块内有效
let
声明的变量只在let
命令所在的代码块内有效
if (true) { var a = 2; let b = 3 };
console.log(a); // 2
console.log(b); // Uncaught ReferenceError: b is not defined
var a = [];
for (var i = 0; i < 5; i++) {
a[i] = function () { console.log(i); }
}
// 这里的i都指向全局变量i
a[2](); // 5
a[4](); // 5
console.log(i); //5
var b = [];
for (let k = 0; k < 5; k++) {
b[k] = function () { console.log(k); }
}
// k是用let声明的,每循环一次等于重新声明一次k,js引擎会记住上次k的值,在这个值的基础上进行计算
b[2](); // 2
b[4](); // 4
console.log(k); // Uncaught ReferenceError: k is not defined
//for循环的()内是父作用域,{}内是子作用域
for (var v = 0; v < 2; v++) {
let v = 'h';
console.log(v);
}
// h
// h
// h
不允许重复声明
let
不允许在相同作用域内重复声明同一个变量
function func() {
let a = 2;
let a = 6;
}
func() // Uncaught SyntaxError: Identifier 'a' has already been declared
const
声明的常量只读
const
声明一个只读的常量,一旦声明,这个常量指向的内存地址
不得改动
对于基本数据类型
来说,就是值
不可改变
const a = 2;
a = 3; // Uncaught TypeError: Assignment to constant variable.
对于对象或数组等复杂数据类型
来说,就是指针
不可改变
const a = { num: 2 };
const b = [1];
a.num = 3; // 不报错,内存地址未变
b[0] = 'hi'; // 不报错,内存地址未变
a = {}; // Uncaught TypeError: Assignment to constant variable
声明的同时必须赋值
const
声明常量时必须赋值,不能留到后面再赋值
const a;
a = 2; //Uncaught SyntaxError: Missing initializer in const declaration
const
与let
相同,只能先声明再使用,且只在声明所在的块级作用域内有效