JavaScript ES6 -- let 和 const 语法

新增声明变量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 声明变量要注意 ,声明出来的是一个string ,number,bloom类型的值,不可以进行第二次赋值,const 出来的变量已声明未赋值也是会报错,在声明复合类型的数据,要注意指针问题,即上面代码常量obj 储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把obj 指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。

有兴趣的可以去阮一峰的博客 深入学习一下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值