let
ES6中新增的用于声明变量的关键字
let声明的变量只在所处的块级作用域有效
es6 新增了块级作用域
if(true){ // 块级作用域
let a = 2
}
console.log(a) // a is not defined
在业务逻辑比较复杂的时候,可防止内层变量覆盖外层变量
使用let声明的变量才具有块级作用域 var是没有的
if(true){ // 块级作用域
let a = 2
var b = 2
}
console.log(b) // 2
console.log(a) // a is not defined
防止循环变量变成全局变量
for(var i = 0; i < 2; i++){
}
console.log(i) //2
for(let i = 0; i < 2; i++){
}
console.log(i) //i is not defined
不存在变量提升
因为没有变量提升 所以不能在声明之前使用
只能先声明在使用
console.log(a) // a is not defined
let a = 3;
在 es5中 变量提升
console.log(ff);//undefined
var ff = 'ff'
es6 访问不到ff
console.log(ff);//报错 ncaught ReferenceError: Cannot access 'ff' before initialization
let ff = 'ff'
//或
//const ff
const
声明常量,常量就是值(内存地址)不能变化的量
具有块级作用域
if(true){
const a = 1
}
console.log(a)// a is not defined
声明时必须赋值
const F; //Uncaught SyntaxError: Missing initializer in const declaration
// 声明常量时丢失了初始值
声明常量后,值不能修改
对应基本数据类型 不能修改
const f = 1
f = 2 // Uncaught TypeError: Assignment to constant variable. 不能更改此常量的值
对应复杂数据类型,不能直接修改,但可以修改属性
const obj = {name:"obj"}
obj.name = "gg"
console.log(obj)// {name: "gg"}
obj = [] // Uncaught TypeError: Identifier 'obj' has already been declared 标识符'obj'已经声明了
let const var 的区别
- 使用 var 声明的变量,其作用域为 该语句所在的函数内,且存在变量提示
- 使用 let 声明的变量,其作用域为 该语句所在的代码块内,不存在变量提示
- 使用 const 声明的是常量,在后面出现的代码中 不能在修改该常量的值