介绍
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
ES6新增的东西很多,我们不可能马上就掌握所有知识点,所以在这把常用到的知识点总结下。
let 和 const
let
let和var类似,都是用来声明变量的,但它和var又有些不同:
let 声明的变量仅在包含它的代码块里有效
1
2
3
4
5
6
7
8
9//let实际上为 JavaScript 新增了块级作用域,let声明的变量只在包含它的 {} 里有效,在代码块外面访问不到它
{
var a = 1;
let b = 2;
}
console.log(a); //1
console.log(b); //Uncaught ReferenceError: b is not definedlet 不存在变量提升
1
2
3
4
5
6
7//var情况
console.log(a); //undefined
var a = 1;
console.log(b); //Uncaught ReferenceError: b is not defined
let b = 2;暂时性死区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响,所以在let声明变量之前,这个变量都是不可用的,这块区域就是“暂时性死区”
if(true){
a = 1; //ReferenceError
console.log(a); //ReferenceError
let a; //此处结束死区
console.log(a); //undefined
a = 2;
console.log(a); //2
//上面代码中,在 let 命令声明变量 a 之前,都属于变量 a 的“死区”。
//其实就是不允许变量提升的结果。
}let 不允许重复声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
var a = 1;
var a = 2; //不报错
}
{
let a = 1;
var a = 2; //Identifier 'a' has already been declared
}
{
let a = 1;
let b = 2; //Identifier 'a' has already been declared
}
//只要同作用域里有let声明了同一个变量,就会报错
const
const声明一个只读的常量。一旦声明,常量的值就不能改变。1
2
3
4const a = 1;
console.log(a); //1
a = 2; //"a" is read-only
值得注意的是,不是变量的值不可改动,而是变量指向的那个内存地址不得改动。
对于简单类型的数据(数值、字符串、布尔值),一旦被赋值就不可改动,但是对于引用类型,主要是对象和数组,可以修改里面的属性值。
1 | const arr = [1,2,3]; |
const其他特性和let相同,即上面let中的四点。
结构赋值
官方点说,ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
其实讲得明白点,就是左右匹配赋值,举个例子就明白了。
数组解构
1 | //先前给变量赋值,你需要一个一个赋值 |
对象解构
对于对象,同数组,需要注意的就是,数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
不就是属性名相同吗
1 | let {a,b} = {'a':1, 'b':2} |
字符串解构
1 | const [a, b, c, d, e] = 'hello'; |
模板字符串
ES6在字符串中扩展了不少东西,其中模板字符串简直就是神器
在之前拼接一个字符串,你需要这样:
1 | 'hello'+obj.name+','+'i am your friend' |
ES6中你可以这样:
1 | `hello ${obj.name} ,i am your friend` |
这样你或许看不出来这种优势,但是如果字符串很长时,这就是利器:1
2
3
4
5
6`
<ul>
<li>first</li>
<li>second</li>
</ul>
`
没错,它可以直接输出html结构,记住是保留空格和缩进的哟。当然如果你不想保留,也可以使用trim方法消除它,但我想用了这个方法的就不会想像之前那样一大串吧,所以就不多赘述了。
模板字符串中嵌入变量,需要将变量名写在${}之中。大括号内部可以放入任意的 JavaScript 表达式,可以进行运算,以及引用对象属性。1
2
3
4
5
6
7
8
9
10
11
12let x = 1;
let y = 2;
`${x} + ${y} = ${x + y}`
// "1 + 2 = 3"
`${x} + ${y * 2} = ${x + y * 2}`
// "1 + 4 = 5"
let obj = {x: 1, y: 2};
`${obj.x + obj.y}`
// "3"
也可以调用函数1
2
3
4
5function fn() {
return "Hello";
}
`${fn()} world` //hello world