先讲解下三者区别 具体分析往下翻
var | let | const |
函数作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |
var 和 let关键字都是用来声明变量的 但是使用let关键字声明的变量是具有块级作用域的,使用var的变量不具备作用域属性
let块级作用域
块级作用域 简单理解 就是一个大括号内的 就被称为块级作用域
案例1: a只能在if内访问到 在if外访问 就是报错未被定义的
<script>
if (true) {
let a = 10;
console.log(a); //10
}
console.log(a); //defind
</script>
案例2: 访问b b在第二个if里 所以应该在第二个if里打印 所以还是报错 没被定义
<script>
if (true) {
let a = 10;
console.log(a); //10
if (true) {
let b = 20;
console.log(b); //defind
}
console.log(b); //defind
}
console.log(a); //defind
</script>
案例3: 在for循环里 使用let变量 可以防止循环变量i变成全局变量
在for循环外部访问不到i 但是如果使用var 则打印 i=3
for (let i = 0; i < 3; i++) {
}
console.log(i); //报错defind
let没有变量提升
let关键字声明的变量没有变量提升 只能先声明后使用
console.log(num); //报错
let num = 100;
console.log(num); //100
let暂时性死区
var定义的num和if里定义的num 只是变量名一样 但不是同一个变量 let里的变量 只在if{ }里生效 所以被称为暂时性死区
<script>
var num = 10;
console.log(num); //10
if (true) {
let num = 20;
console.log(num); //20
}
console.log(num); //10
</script>
const 关键字
1.const关键字也是具有块级作用域的特点的
2.const关键字声明的常量必须赋初始值
案例1:如果不给初始值 控制台 则会报错 说const声明中缺少初始化
赋值之后 控制台报错则取消
<script>
const PI; // 报错 Missing initializer in const declaration
const PI = 3.14;
</script>
3.const常量值一旦声明之后不可被更改
案例1: 由于const 已经对pi赋值 所以不能再更改
<script>
const PI = 10;
PI = 100; //报错 常量值不可被更改
</script>
案例2: 不能直接对数组进行赋值 这会更改内存地址 通俗点说 就是如果想要更改arr里的值 就使 用索引号的方式更改 不要直接对元素进行赋值
<script>
const arr = [100, 200];
arr[0] = '你好'
arr[1] = 30
console.log(arr); // ['你好', 30]
arr = ['你好', 30]
console.log(arr); //报错 常量不能再赋值
</script>