1.ES6 新增了let命令,用来声明变量。它的用法类似于var。 const声明一个只读的常量。一旦声明,常量的值就不能改变。
let:声明的是变量
一、不存在变量提升
二、暂时性死区,先声明在使用
三、不允许重复声明
四、块级作用域
const:常量
const声明一个只读的常量。一旦声明,常量的值就不能改变。特点有三:
console.log(a) //undefined a 变量提升到前面,相当于 var a
var a=10;
console.log(name)//10
var name=10
//这里我毫不犹豫想的肯定是undefined ,其实打印的是10,因为name是JavaScript内置的对象。
//name不是关键字,是window下自有的属性。所以一般不会用name当做变量名使用
let 和 const 声明的变量没有变量提升。
console.log(a);//报错 Cannot access 'a' before initialization
//变量无法提升;
let a = 10;
console.log(b);//报错 Cannot access 'b' before initialization
//变量无法提升;
const b = 10;
var 能重复声明。
var a = 10;
var a = 20;
console.log(a)//20
let 和 const 不能重复声明。
let a = 10;
let a = 20;//报错Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 10;
const b = 20;//报错 'b' has already been declared
var 和 let 声明时可以不用设置初始值。
var a,let b;
a = 10;
b = 20;
console.log(a,b)//10,20
const 声明时必须设置初始值,不能使用 null 占位。
const a;
a = 20;//报错 Missing initializer in const declaration
var 没有块级作用域
for(var i=0;i<3;i++){
console.log(i);//0,1,2
}
console.log(i);//3,没有块级作用域,外层也能访问
if(true){
var a = 10;
}
console.log(a);//10
let 和 const 有块级作用域
for(let i=0;i<3;i++){
console.log(i);//0,1,2
}
console.log(i);//报错 i is not defined,有块级作用域,外层不能访问
if(true){
let a = 10;
}
console.log(a);//报错 a is not defined
if(true){
const b = 10;
}
console.log(b);//报错 b is not defined
var 不存在暂时性死区
var a = 10;
if(true){
console.log(a);//10
var a = 20;
}
let 和 const 存在暂时性死区
var a = 10;
if(true){
console.log(a);//报错 Cannot access 'a' before initialization
let a = 20;
}
var b = 10;
if(true){
console.log(b);//报错 Cannot access 'b' before initialization
const b = 20;
}
常见面试题
function sayHi() {
console.log(name)
console.log(age)
var name = 'Lydia'
let age = 21
}
sayHi() //undefined 和 ReferenceError
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
// 0 1 2 和 3 3 3