什么是ES6?
ES的全称是ECMAScript,是由ECMA国际标准化组织制定的一项脚本语言的标准化规范。js就是基于ES标准创建的语言。
ES6泛指2015年之后发行的版本。
为何要学习ES6?
- 变量提升增加程序运行的不可预测性
- 语法过于松散
ES6新增的语法
let
ES6中新增的用来声明变量的。
-
let声明的变量只在所处的块级有效,也就是说js新增块级作用域。块级作用域即是在一个大括号里面。
(ES6之前,js中只有全局作用域和局部作用域)
if(true){ let a = 10; }
console.log(a) // a is not defined
-
可以防止内层变量覆盖外层变量
-
防止循环遍量变成全局变量,如for循环中的计数器
-
不存在变量提升 只能先声明再使用
console.log(a) //undefined
let a = 1;
- 使用let关键字声明的变量具有暂时性死区特性(绑定,内部与外部无关系)
var num1 = 100;
var num = 10;
if(true){
console.log(num); //10,可以访问外部的var num
console.log(num1); //Cannot access 'num1' before initialization
let num1 = 20; //let关键字将num1这个变量与这个大括号的块域进行绑定
}
经典题目
题目一
- 在此题中,数组arr[0]和arr[1]的内容都是一个函数,函数的内容为打印出i的值。
- 执行for循环时,只是将函数赋值给数组,并没有执行函数。
- 执行完循环之后,执行下面的arr0;实际上这是在调用arr[0]里面的函数,通过在函数后面加括号。
- 此时要输出i,但是在function里面并没有对i的声明,所以向上级作用域查找,发现有var定义的全局i。由于循环早已退出,此时i的值为2,所以输出两个2.
题目二
1.由于有let i,每个i都是不同的变量,所以每次循环时都创建一个新的块级作用域。
2.循环结束后,由于函数内部没有i,所以去上一级作用域(也就是循环产生的块级作用域)查找i。
const
声明常量,值(内存地址)不能变
- 具有块级作用域
- 声明常量必须赋值
- 赋值后,值不能修改
分为两种情况:基本数据类型的常量值不能修改;
复杂数据结构里面的值可以改,但是整个结构不可以直接赋值。
例:
如图所示,arr[0]可以修改成功,是因为它没有改变数组arr的内存地址。
而arr = [‘a’,‘b’];就不行,因为新的数组会修改arr的内存地址。
var、let、const的区别
如果要存储的数据不变化,用const。js效率更高,不要实时监控它的改变。