let关键字
- let关键字就是用来声明变量的
- 在大括号中使用let关键字声明的变量具有块级作用域
- 在大括号中如果是使用var声明的变量不具备块级作用域特性
- 优点在于防止循环变量变成全局变量,你比如说,使用for循环,var i=0在循环外面打印i依然可以得到即这个变量在外面可以访问,如果是let的话在循环外面是访问不到的
- 不存在变量提升,必须先声明再提升
- 暂时性死区,在一个大括号中使用let关键字,就会使变量和这个块级区进行绑定,即这个块级区和外部的定义的变量没有任何光系。
if(true) {
let b = 20;
console.log(b);
if(true) {
let c = 30;
}
console.log(c);//not defined
}
看个栗子
这里的循环时当i=2时跳出循环,注意此时的i=2是全局变量。然后下面的函数执行又是在全局作用于下的的i值,所以调用函数打印i的值,两次都是2.
用let
还是上面那个栗子,如果我们把var改成let
那么,由于每一次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,函数执行的时候输出的是自己上一级(循环产生的块级作用域)作用域下的i的值
- 两次循环结束后会产生两个块级作用域,这两个块级作用域中都有自己的变量i,他们俩互不影响,因为都属于自己的块级作用域中
- 在函数执行的时候,函数内部没有自己的变量i,所以要向上一级的作用域中进行查找。这里的上一级指的就是循环产生的块级作用域。
const关键字
作用:声明常量,常量就是指(内存地址)不能变化的量
- 块级作用域
- 声明常量的时候需要赋初始值
- 常量赋予后,值不能更改(分两种情况)
- 常量声明后值不可更改
const PI=3.14
PI=100//报错 - 可以修改数组中的元素,但是不能重新定义
const ary = [100,200];
ary[0] = 123; //可以因为没有修改地址
ary = [1,2] //不可以
console.log(ary);
- 常量声明后值不可更改
if(true) {
const a = 10;
if(true) {
const a = 20;
console.log(a);//20
}
console.log(a);//10
对于let,const,var的区别
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升(可以先使用再声明) | 不存在变量提升 | 不存在变量提升 |
值可以更改 | 值可以更改 | 值不可以更改 |
解构赋值
从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构
//数组解构允许一一对应的关系从数组中提取值,然后将值赋给变量
let [a.b.c] = [1,2,3]
console.log(a)
console.log(b)
console.log(c)
let ary = [1,2,3];
let [a,b,c,d] = ary;
console.log(c)
console.log(d)//undifine
对象解构
按照一定模式,从数组或对象中提取值,将提取出来的值赋给另外的变量
//对象解构允许我们使用变量的名字匹配对象的属性,匹配成功将对象属性的值赋值给变量
let person = {name: 'nannan', age: 20}
let {name,age} =person;
console.log(name);//nannan
let person = {name: 'nannan', age: 20}
let {name: myName } = person;
console.log(myName)//nannan