JavaScript ES6新增语法
新增声明变量let const
1、let
(1)let是ES6新增的一种声明变量,用let声明的变量会有一个作用域效果
{
var str = "hello TikTok!"
let stt = "hello word!"
console.log(stt) //hello word!
}
console.log(str) //hello TikTok!
console.log(stt) //stt is not defined
上面代码可知 let 声明的变量会有一个作用域块效果,let 声明的变量只有在它当前的代码块可用,可以利用 let 这种特性做一些私有变量封装,可以做迭代器,计时器…
(2)let 声明的变量不存在声明变量的提升
console.log(str) //undefined
console.log(stt) //stt is not defined
var str = "hello TikTok!"
let stt = "hello word!"
上面的代码可知,用var声明的变量的,在执行的时候,str 已经被定义出来,还未赋值会打印出undefined,这个特性比较奇怪,因为代码是由上到下的顺序执行,为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
(3)暂时性死区
var str = "hello TikTok!"
function fn(){
console.log(str) //str is not defined
let str = 123
}
fn()
如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
(4)不允许重复声明变量
var str = "hello TikTok!"
var str = "str1"
console.log(str) //str1
let stt = "hello word!"
let stt = "stt1"
console.log(stt) //stt is not defined
2、const
(1)const 也是ES6中新增的一个命令,用来定义一个变量,const定义出来的变量同样有局部作用域的效果
{
var str = "hello TikTok!"
const stt = "hello word!"
console.log(stt) //hello word!
}
console.log(str) //hello TikTok!
console.log(stt) //stt is not defined
由上可知,const 和 let 命令特性很相似,const 的特性和 let 的(2),(3),(4)一致,这里就不一一列举了
(2)const 独有的特性
const声明一个只读的常量。一旦声明,常量的值就不能改变
const a = 10;
console.log(a) //10
a = 20 // Assignment to constant variable 常量变量赋值
console.log(a)
这种情况只存在于声明基本数据类型值,比如number,string,bloom,变量指向的那个内存地址所保存的数据不得改动,值就保存在变量指向的那个内存地址,因此等同于常量。
对于复合类型的数据,比如object,Array,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
const obj = {}
obj.eat = 'food'
console.log(obj) // { eat: 'food' }
obj = {}
console.log(obj) // Assignment to constant variable.
var、let、const 这三者的共同点都是都是声明变量。
不同点let const 与 var 声明的变量不存在声明提升,再者 let ,const 有自己局部作用域。
在用const 声明变量要注意 定义的变量只允许在声明变量的代码块中使用,不可以进行第二次声明赋值,而 const 定义出来的属于一个常量,要注意的是声明出来的是一个string ,number,bloom类型的值,不可以进行第二次赋值,const 出来的变量已声明未赋值也是会报错,在声明复合类型的数据,要注意指针问题,即上面代码常量obj 储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把obj 指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
有兴趣的可以去阮一峰的博客 深入学习一下