一、什么是ES6?
ES的全称是ECMAScript,它是由ECMA国际标准化组织制定的一项脚本语言的语法规范
ES6实际上是一个泛指,泛指ES2015及后续的版本
二、为什么使用ES6?
三、ES6的新增语法
1.let
ES6中新增的用于声明变量的关键字
- let声明的变量只在所处的块级有效,具有块级作用域(一对{}中声明的)
if(true) {
let a = 10;
}
console.log(a); //a is not defined
注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性
<script type="text/javascript">
/*
let关键字就是用来声明变量的
使用let关键字声明的变量具有块级作用域
在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
*/
/* -------在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
if (true) {
var a = 10;
let b = 20;
}
console.log(a);
console.log(b);
</script>
- 防止循环变量变成全局变量
在我们for循环的时候,如果使用var来声明变量,即使已经循环完了,在for循环的外面还是能访问得到这个计数的变量,如果使用了let(即使let是在for的括号里而不是在{}里,它依然和for的块级作用域绑定),就不能在for循环的外面使用该变量
<script type="text/javascript">
/*
let关键字就是用来声明变量的
使用let关键字声明的变量具有块级作用域
在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
防止循环变量变成全局变量
*/
/* -------防止循环变量变成全局变量--------- */
for (var i = 0; i < 2; i++) {
}
console.log(i);
for (let j = 0; j < 2; j++) {
}
console.log(j);
</script>
- 不存在变量提升
console.log(a); //a is not defined
let a = 20;
变量必须先声明再使用
- 使用let声明的变量具有暂时性死区
var temp = 123;
if(true) {
temp = 'abc';
let temp;
}
在块级作用域中声明的变量就和这个块级作用域进行了绑定 ,不会受外部影响,所以if里面的temp和外面声明的temp毫无关系,在if语句里面先使用temp变量再声明会报错
一旦在块级作用域中声明一个变量,这个变量就会和这个作用域进行绑定,具有暂时性死区
经典面试题(一)
var arr = [];
for(var i = 0; i < 2; i++) {
arr[i] = function() {
console.log(i);
}
}
arr[0](); //2
arr[1](); //2
当i=0、1时进行循环,将两个函数赋值给数组的第0、1个值,注意,此时的函数没有调用,在整个for循环执行完成,也就是i=2不符合条件的时候,就会去调用两个函数,在函数的当前作用域中,是不存在i变量的,根据作用域链,会继续向上查找,于是去到全局作用域查找,i就是for循环中的计数器i,当前i=2,所以两个输出的都是2
注意:此题的关键点在于变量i是全局的,函数执行时输出的都是全局作用域下的i值
经典面试题(二)
let arr = [];
for(let i = 0; i < 2; i++) {
arr[i] = function() {
console.log(i);
}
}
arr[0](); //0
arr[1](); //1
let关键字有块级作用域, 两次循环都会产生块级作用域,里面各有一个i的值,这两个i值相互不影响,因为是不同的作用域,执行函数的时候,在当前块级作用域中没有i,根据作用域链,要继续向上查找,找到的是自己的上一级也就是循环产生的作用域里的i值
2.const
作用:声明常量,常量就是值(内存地址)不能变化的量
使用const声明的常量具有以下特点:
- 具有块级作用域
if(true) {
const a = 10;
}
console.log(a); //a is not defined
<script type="text/javascript">
if (true) {
const a = 10;
if (true) {
const a = 100;
console.log(a);
}
console.log(a);
}
console.log(a);
</script>
- 声明常量时必须赋值
const PI; //Missing initializer in const declaration
- 常量赋值后,值不能修改(实质上是值对应的内存地址不可更改)
对于基本数据类型来讲,一旦赋值,值不可更改,比如数值、字符串类型的值
对于复杂数据类型来讲,不能重新赋值,但是可以更改数据结构内部的值,比如数组、对象
const PI = 3.14;
PI = 100; //Assignment to constant variable.
const ary = [100,200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); //['a','b'];
ary = ['a','b']; // Assignment to constant variable.
const ary = [100, 200];
ary[0] = 'a';
console.log(ary);
ary = [1, 2];
let、const、var的区别
- 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
- 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
- 使用const声明的常量,在后面出现的代码中不能再修改该常量的值
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改 |
什么时候使用const?定义了之后一般不改变的值,比如函数值,PI值,或者数学公式中不变的值