let和const的知识点。[js笔记]

先简单的说一下const和let:


关于let:

一.作用

与var稍微类似,用于声明一个变量

二.特点

1.在块级作用域内有效,存在暂时性死区。

2.不能重复声明

3.不会预处理(预解析),不存在变量提升

三.应用

循环遍历加监听(流程处理)


关于const:

一.作用

定义一个常量

二.特点

1.不能修改(变量指向的那个内存地址不能改动)

2.声明必须赋值

3.除了不能改变指针,其它特点同let一样

三.应用

保存不用改变的数据


让我们带着种种疑问,来详细的说一下吧!。o( ̄▽ ̄)o

为什么说"使用let取代var是必然的结果"?

为什么会出现暂时性死区?预解析?................


关于const和let的问题详情:


预解析


js引擎运行js分为两步:预解析--->代码执行

1.预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面

2.代码执行:按照代码书写的顺序从上往下执行

变量预解析(常称为变量提升)和函数预解析(常称为函数提升)

1.变量提升:就是把所有的变量声明提升到当前作用域最前面 不提升赋值操作

2.函数提升:把所有的函数声明提升到当前作用域的最前面 不调用函数

如果搞懂了这些问题,来做点题目:

解释以下打印的结果,解释一下为什么?

1.坑点

console.log(num);//undefined

var num=10;

2.坑点

fun();//报错

var fun=function(){

console.log(22)

}

结合以上观点,便知道了。

为什么说"使用let取代var是必然的结果"?


暂时性死区


1.简单说

在代码块内,使用let、const命令声明变量之前,该变量都是不可用的。

这在语法上,称为暂时性死区。

2.详细说(某知乎说法)

ES6规定,let/const 命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。总之,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。这在语法上,称为 “暂时性死区”( temporal dead zone,简称 TDZ)。

3.深度说(ES6标准)

ES6标准中对let/const声明中的解释,当程序的控制流程在新的作用域(module function 或 block 作用域)进行实例化时,

在此作用域中用let/const声明的变量会先在作用域中被创建出来,

但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。

因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

来看看以下代码:

typeof a // ReferenceError: a is not definedlet a

let a

TDZ 也意味着 typeof 不再是一个百分之百安全的操作。


指针指向


let创建的变量

是可以更改指针指向(可以重新赋值)。

但const声明的变量

是不允许改变指针的指向。

详情:

实际上,const保证的

并不是变量的值不得改动,

而是变量指向的那个内存地址不能改动。

对于基本类型的数据(数值、字符串、布尔值),

值就保存在变量指向的那个内存地址,

因此等同于常量。

但对于引用类型的数据,变量指向数据的内存地址,保存的只是一个指针,

只能保证这个指针是固定不变的,

至于它指向的

数据结构

是不是可变的,就完全不能控制了。


最后再说一下:

昨日所有的前行,终成为明日惊喜的铺垫!

让我们一起加油吧!!![]~( ̄▽ ̄)~*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值