var let及const
es6已经发布很久了,之前只会用var定义变量,学习了let和const后,又学到了一些作用域、JavaScript编译和深拷贝浅拷贝的知识。这章主要来说说这三个定义量的方法:
1.var
在没学习es6时,会经常用到var,var用来定义一个变量,变量数据类型可以是基础数据类型,也可以是引用数据类型。它可以定义在全局,也可以定义在局部,但最后都会变成全局变量。并且后执行的赋值会覆盖之前的赋值,例:
var name = '小黑' console.log(name) //小黑 function changeName() { console.log(name) //undefined var name = '小白' console.log(name) //小白 }
changeName() console.log(name) //小白
例子还是老例子,功能也没变。为什么会打印出undefined呢?js在执行之前会有一个编译过程,他会先在当前作用域中寻找执行时需要的量,如果有,就不再去外部找了,如果没有,就会跳出当前作用域去父级作用域找。此时编译时找到name,会先给这个变量赋值为undefined,在执行时,先执行的打印语句,所以在没有执行name赋值之前,name就是undefined。
在全局下用var定义一个变量name,给它赋值为‘小黑’,然后在局部改变name的值,全局的name也变了。这样就有一个弊端,在不同的作用域下,用同一个变量名,所有的变量都会发生改变,或者说,在不同作用域里,不可以使用相同的变量名,因为它会改变全局的变量,所以es6发布了新的定义变量的方法:
2.let
let和var作用一致,都是用来定义变量的。区别在于在:
1.同一作用域下同一个变量只能被let定义一次,而var可以重复定义多次;
let name = '小黑' let name = '小白' //报错 var name = '小黑' var name = '小白' //name = '小白'
2.用let定义变量会有暂时性死区,用let定义变量之前引用变量会直接报错,而用var定义变量之前引用变量会引用到undefined,称为变量提升;
console.log(name) //报错 let name = '小白' console.log(name) //undefined var name = '小白'
3.在全局用let定义了变量,在局部里定义相同变量名后,全局的变量不会发生改变。
let name = '小黑' function changeName(){ let name = '小白' console.log(name) //小白 } console.log(name) //小黑 var name = '小黑' function changeName(){ var name = '小白' console.log(name) //小白 } console.log(name) //小白
3.const
const的作用于let类似,它也有暂时性死区,相同的量名也可以定义在不同的作用域,并且在同一作用域下相同的量名只能被const定义一次。const与let的区别为:
1.const定义的变量必须有初始值;
let name //undefined const name //报错
2.const定义的量是通过指针来保存数据的,这个量其实就是指针指向的地址,指针的指向不能变,所以const声明的量不能被改变;
let name = '小黑' name = '小白' // '小白' const name = '小黑' name = '小白' // 报错
这节就说到这吧,希望小白和小黑能给大家带来快乐~~