ES6 新特性

发布于2021-02-05

ES6 板字符串

模板字符串是 ES6 中非常重要的一个新特性,这个特性使得处理相关业务变得更加容易。

基础用法

javascript

let a = `hello world` console.log(a) // hello world
JavaScript
注意这里不是双引号,而是反撇号`
在模板字符串中,还可以拼接 html 元素,同时空格、缩进、换行都会被保留,并且如果模板字符串中的变量没有声明,将报错。

javascript

let str = ` <div> <ul> <li>11</li> <li>22</li> </ul> </div> `
JavaScript
上面代码中,<div>标签前面会有一个换行。如果你不想要这个换行,可以使用 trim 方法消除它。

javascript

let str = ` <div> <ul> <li>11</li> <li>22</li> </ul> </div> `.trim() console.log(str)
JavaScript
在模版字符串内使用反引号`时,需要在它前面加转义符\

javascript

let a = `hello \\\\n` console.log(a)
JavaScript

嵌入变量

javascript

let name = 'jacky' let str = '我叫' + name + ',大家好' console.log(str) // 我叫jacky,大家好
JavaScript
当有变量参与拼接时,ES5 下必须用+号这样的形式进行拼接,这样很麻烦而且很容易出错。 ES6 新增了字符串模版,可以很好的解决这个问题。这时再引用 str 变量就需要用\${name}这种形式了。

javascript

let name = 'jacky' let str = '我叫${name},大家好' console.log(str) // 我叫jacky,大家好
JavaScript
如果大括号内部是一个字符串,将会原样输出:

javascript

let world = '666' let a = `hello ${'world'}` console.log(a) // hello world
JavaScript

对运算的支持

在\${}里面,可以写任意的 JS 表达式,比如我们用它进行运算

javascript

let a = 1 let b = 2 let c = `${a + b}` console.log(c) //3 let obj = { x: 1, y: 2 } console.log(`${obj.x + obj.y}`) // 3
JavaScript

模板字符串调用函数

javascript

function fn() { return 'Hello World' } console.log(`foo ${fn()} bar`) // foo Hello World bar
JavaScript
 
 

ES6 之变量的解构赋值

1.什么是解构?

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。它在语法上比 ES5 所提供的更加简洁、紧凑、清晰。它不仅能减少你的代码量,还能从根本上改变你的编码方式。

2.数组解构

以前,为变量赋值,我们只能直接指定值,比如

javascript

let a = 1 let b = 2 let c = 3
JavaScript
现在可以用数组解构的方式来进行赋值

javascript

let [a, b, c] = [1, 2, 3] console.log(a, b, c) // 1, 2, 3
JavaScript
这是数组解构最基本类型的用法,还可以解构对象数组

javascript

// 对象数组解构 let [a, b, c] = [{ name: 'jacky' }, { name: 'monkey' }, { name: 'houge' }] console.log(a, b, c) // {name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}
JavaScript

3.数组模式和赋值模式统一

这条可以理解为等号左边和等号右边的形式要统一,如果不统一解构将失败。

javascript

let [a, [b, c], d] = [1, [2, 3], 4] console.log(a, b, c, d) // 1 2 3 4 // 提取除第二、三个外的所有数值 let [a, , , d] = [1, 2, 3, 4] console.log(a, d) //1 4 let [a, ...b] = [1, 2, 3, 4] console.log(a, b) // 1 [2, 3, 4] let [a, , , ...d] = [1, 2, 3, 4, 5] console.log(a, d) // 1 [4, 5]
JavaScript
如果解构不成功,变量的值就等于undefined

javascript

let [a, b, c] = [2, 3] console.log(a, b, c) // 2 3 undefined let [c] = [] console.log(c) // undefined
JavaScript
上述是完全解构的情况,还有一种是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组,解构依然可以成功。

javascript

let [x, y] = [1, 2, 3] console.log(x, y) // 1 2 let [a, [b], d] = [1, [2, 3], 4] console.log(a, b, d) // 1 2 4
JavaScript

4.解构的默认值

解构赋值允许指定默认值。

javascript

let [a, b = 2] = [1] console.log(a, b) // 1 2 let [a = 1, b = 2, c, d = 13] = [10, 11, 12] console.log(a, b, c, d) // 10 11 12 13
JavaScript

5.对象的解构赋值

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

javascript

// 对象解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而非前者。 let obj = { a: 'aaa', b: 'bbb' } let { a: x, b: y } = obj console.log(x, y) // aaa bbb let { a, b } = { a: 'aaa', b: 'bbb' } console.log(a, b) // aaa bbb // 不按照顺序 let { b, a } = { a: 'test1', b: 'test2' } console.log(a, b) // test1 test2 // 嵌套解构 let { obj: { name }, } = { obj: { name: 'jacky', age: '22' } } console.log(name) // jacky // 稍微复杂的嵌套 let obj = { p: ['Hello', { y: 'World' }], } let { p: [x, { y }], } = obj console.log(x, y) // Hello World
JavaScript
如果变量名与属性名不一致,必须写成下面这样。

javascript

var { foo: rename } = { foo: 'aaa', bar: 'bbb' } console.log(rename) // aaa console.log(foo) // Uncaught ReferenceError: foo is not defined
JavaScript
如果在解构之前就定义了变量,这时候再解构会出现问题。下面是错误的代码,编译会报错(因为 js 引擎会将{a}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 js 将其解释成代码块,才能解决这个问题)

javascript

let a; let obj = { a: "aaa" }; {a} = obj; // Uncaught SyntaxError: Unexpected token '='
JavaScript
要解决报错,使程序正常,这时候只要在解构的语句外边加一个圆括号就可以了

javascript

let a let obj = { a: 'aaa' } ;({ a } = obj) console.log(a) // aaa
JavaScript

6.函数参数

函数的参数也可以使用解构赋值。

javascript

function add([x, y]) { return x + y } add([1, 2]) // 3
JavaScript
函数参数的解构也可以使用默认值。

javascript

function fn(x, y = 7) { return x + y } console.log(fn(3)) // 10
JavaScript

7.字符串解构

字符串被转换成了一个类似数组的对象。

javascript

const [a, b, c, d, e, f] = 'hello' console.log(a) //h console.log(b) //e console.log(c) //l console.log(d) //l console.log(e) //o console.log(f) //undefined
JavaScript

8.数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

plain

let {toString: s} = 0; console.log(s === Number.prototype.toString); // true let {toString: s} = true; console.log(s === Boolean.prototype.toString); // true
Plain text
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefinednull无法转为对象,所以对它们进行解构赋值,都会报错。

javascript

let { prop: x } = undefined // TypeError let { prop: y } = null // TypeError
JavaScript

9.解构赋值的应用

1.交换变量的值

通常交换两个变量的方法需要一个额外的临时变量,如下

javascript

let a = 1 let b = 2 let temp temp = a a = b b = temp console.log(a, b) // 2 1
JavaScript
用 ES6 解构赋值的话,会变得很简洁

javascript

let a = 1 let b = 2 ;[a, b] = [b, a] console.log(a, b) // 2 1
JavaScript

2.从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

javascript

// 返回一个数组 function example() { return [1, 2, 3] } let [a, b, c] = example() // 返回一个对象 function example() { return { foo: 1, bar: 2, } } let { foo, bar } = example()
JavaScript

3.访问数组中元素

有种场景,比如有一个数组(可能为空)。并且希望访问数组的第一个、第二个或第 n 个项,但如果该项不存在,则使用指定默认值。 通常会使用数组的length属性来判断

javascript

const list = [] let firstItem = 'hello' if (list.length > 0) { firstItem = list[0] } console.log(firstItem) // hello
JavaScript
如果用 ES6 解构赋值来实现上述逻辑

javascript

const list = [] const [firstItem = 'hello'] = list console.log(firstItem) // 'hello'
JavaScript

4.提取 JSON 数据

javascript

let jsonData = { id: 42, status: 'OK', data: [867, 5309], } let { id, status, data: number } = jsonData console.log(id, status, number) // 42, "OK", [867, 5309]
JavaScript

5.遍历 Map 结构

任何部署了 Iterator 接口的对象,都可以用for...of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。

javascript

const map = new Map() map.set('first', 'hello') map.set('second', 'world') for (let [key, value] of map) { console.log(key + ' is ' + value) } // first is hello // second is world
JavaScript
如果只想获取键名,或者只想获取键值,可以写成下面这样。

javascript

// 获取键名 for (let [key] of map) { // ... } // 获取键值 for (let [, value] of map) { // ... }
JavaScript
文章部分内容参考:阮一峰老师的《ECMAScript 6 入门》一书
消息队列选型对象存储Minio
Loading...
©2021-2025 Arterning.
All rights reserved.