目录
var
1.var存在变量提升
console.log(a)
var a = 1
执行上述代码,结果是undefined
这是因为,用var去声明一个变量并赋值,不管在什么位置,都会先将变量的声明提到最前面,也就是所谓的变量提升,上述代码实际如下:
var a;
console.log(a)
a = 1
2.用var声明的变量,可以重新赋值
var name = '小明'
var name = '小红'
console.log(name)
可以看到,输出结果为“小红”
3.var没有块级作用域
function f(){
for (var i=0;i<4;i++){
//...
}
console.log(i)
}
f()
执行上述代码,输出结果为
这是因为,var没有块级作用域,所以可以在for循环的外部访问到for循环定义的i
let
1.let声明的变量不能够再次声明
如图所示,重复用let声明a,会报错,而用var则不会
2.let没有变量提升
执行如下代码
console.log(a)
let a = 1
会报错
3.let不影响作用域链
{
let a = 5
{
console.log(a)
}
}
输出结果为5
const
1.const声明之后必须赋值,否则会报错
2.const定义的值不能被修改
执行如下代码
const A = 1;
A = 2;
会报错
解构赋值
ES6允许按照一定模式,从数组或者对象中提取值,对变量进行赋值,称为解构,这种写法属于模式匹配,只要等号两边模式相同,变量就会被赋值
对数组的解构赋值
let [a,b,c] =[1,2,3] //a=1,b=2,c=3
let [aa,[[bb],cc]] = [1,[[2]],3] //aa=1,bb=2,cc=3
let [ , ,z] = [1,2,3] //z=3
let [x,...y] = [1,2,3,4] //x=1,y=[2,3,4]
let [aaa,bbb] = [1] //aaa=1,bbb=undefined
//解构值允许设置默认值
let [aaaa= true] = [] //aaaa=true
let [aaaaa,bbbbb=1] = [11] //aaaaa=11,bbbbb=1
let [xa,xb = 2] = [1,undefined] //xa=1,xb=2
//ES6中使用严格的全等运算符,只有当一个变量严格等于undefined,才会被赋值为undefined
//默认值可以用解构赋值的其他变量,但该变量必须已经声明
let [xaa=1,yaa = x] = [] //xaa=1 yaa=1
let [xaaa=1,yaaa = x] = [2] //xaaa=2 yaaa=2
let [k = m,m = 1] = [] //报错,因为m之前未被声明就拿去给k用
对象的解构赋值
let {a1,b1} = {a1:1,b1:1} //a1=1,b1=1
let {ab} = {aa:11,bb:22} //ab=undefined,因为没有同名属性,解构失败
let {aaa:bbb} = {aaa:"aaa",bbb:"bbb"} //bbb="aaa"
//对象的解构赋值机制是先找到同名变量,再赋值给对应变量,这里aaa的值是变量bbb,但是后面aaa的值变为"aaa",所以相当于将"aaa"赋值给了bbb
let obj1={
o:[
'hello',
{j:'world'}
]
}
let {o:[h,{j}]} = obj1 //先找到同名的属性o,再给o里面的属性赋值,所以h="hello" j="world"
解构赋值相关操作
1.不引入其他变量来交换两个变量的值
let a = 1;
let b = 2;
[a,b] = [b,a] //实现变量值交换
console.log(a)
console.log(b)
2.数组去重
let arr1 = [1,2,1,3,3,4]
let arr2 = [...new Set(arr1)] //使用new Set()对数组元素进行去重
console.log(arr2)
输出结果如下
欢迎指正