ES6简介,Let关键字,constjiben

117 阅读3分钟

1.ES6简介

ECMA是一个标准 JavaScript是ECMAScript的实现。

ES6是ECMAScript的一个版本,是2015年发布的,ES2015.

2.let关键字

ES6新增的关键字,用来声明变量。用法类似于var,但是所声明的变量,只在let所在的代码块有效。

Snipaste_2021-10-28_19-03-02.png var定义的变量遇到for循环的大括号是不会形成作用域的。所以在上面代码调用时,调用的是一个全局的变量。

Snipaste_2021-10-28_19-03-02.png 以上代码中,i是使用let声明的,当前的i只在本轮的循环中有效。每一个循环中的i其实都是一个新的变量。所以输出的是6.

Snipaste_2021-10-28_19-03-02.png 结果:输出3次abc。

原因:在代码块中的变量i与for循环中的变量i不在用一个作用域。

2.1 不存在变量提升

var 存在变量提升。即变量在声明之前使用时,值为undefined。js会将声明语句放在所有js代码之前执行。

Snipaste_2021-10-28_19-03-02.png

Snipaste_2021-10-28_19-03-02.png 结果:提示错误Cannot access 'a' before initialization

2.2 暂时性死区

Snipaste_2021-10-28_19-03-02.png 结果:提示错误Cannot access 'a' before initialization

使用变量时,会先寻找同一作用域下的变量。以上代码中,tmp=abc会优先寻找到下面的let tmp而let tmp不存在变量提升,所以提示错误。

总结:在代码块中,使用let命令声明变量之前,该变量都是不可用的状态,在语法上,称为“暂时性死区”

2.3 不允许重复声明

let不允许在相同的作用域中,重复声明同一个变量。

Snipaste_2021-10-28_19-03-02.png

Snipaste_2021-10-28_19-03-02.png 以上代码中,函数的形参a与函数内部的a作用域相等,所以会报错。

Snipaste_2021-10-28_19-03-02.png

3.块级作用域

3.1 为什么需要块级作用域

ES5 只有全局作用域和局部作用域(函数作用域),没有块级作用域。

缺点1:内部变量可能会覆盖外层的变量

Snipaste_2021-10-28_19-03-02.png 上面案例中,if代码块外部原意为使用外层的date,内部使用内部的date。但是函数执行后,结果却为undefined,原因是存在变量的提升。导致内部的date覆盖了外部的date变量

缺点2:for循环中的计数变量泄露为全局变量。

Snipaste_2021-10-28_19-03-02.png 以上案例中,for·循环中的变量i只是用来作为计数使用,但是for循环执行完成后,它没有消失,而是作为全局变量仍然存在。以后可能不会再使用,造成资源的浪费。

3.2 ES6块级作用域

Snipaste_2021-10-28_19-03-02.png 块级作用域下的变量不会对外层的变量造成影响,同时支持多层嵌套。

Snipaste_2021-10-28_19-03-02.png ES6的块级作用域必须有大括号,所以使用if判断时,不可以省略大括号。

4.案例

Snipaste_2021-10-28_19-03-02.png

Snipaste_2021-10-28_19-03-02.png 以上案例,使用let关键字实现点击li,弹出相当元素的下标。

const

1.基本用法

const也是用来声明变量的,不过它声明的是一个只读的常量。一旦声明,值不可修改。

Snipaste_2021-10-28_19-03-02.png

1.2 必须初始化

Snipaste_2021-10-28_19-03-02.png 因为const声明的变量的值不可修改,所以,const一旦声明变量,则必须初始化。

1.3 一般变量名大写

规范。

1.4 也有块级作用域

const与``let`相同,只会在声明的所在代码块作用域内生效。

Snipaste_2021-10-28_19-03-02.png

1.5 不存在变量提升

Snipaste_2021-10-28_19-03-02.png

1.6 不可重复声明

Snipaste_2021-10-28_19-03-02.png

1.7 对于数组和对象中的元素进行修改,不算对常量的改变

const变量保存的变量指向的值的内存地址。对于简单的数据(数值,字符串,布尔值)值保存在变量指向的内存地址。

对于复合数据类型,变量指向的内存地址,只是该对象的地址,其中的内容发生变化不会使该对象的内存地址发生变化。

Snipaste_2021-10-28_19-03-02.png