数组的扩展
扩展运算符
1 | console.log(...[1, 2, 3]) //1 2 3 |
扩展运算符的应用
替代数组的 apply 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25function f(x, y, z) {}
var args = [0, 1, 2]
//ES5 写法
f.apply(null, args)
//ES6 写法
f(...args)
//用 Math.max 求数组中最大的数
//ES5 写法
Math.max.apply(null, [2, 33, 3])
//ES6 写法
Math.max(...[2, 33, 3])
//用 push 将一个数组添加到另一个数组尾部
var arr1 = [0, 1, 2]
var arr2 = [3, 4, 5]
//ES5 写法
Array.prototype.push.apply(arr1, arr2)
//ES6 写法
arr1.push(...arr2)合并数组
1
2
3
4
5
6
7
8
9var arr1 = ["a"]
var arr2 = ["b", "c"]
var arr3 = ["d"]
//ES5 写法
arr1.concat(arr2, arr3)
//ES6 写法
;[...arr1, ...arr2, ...arr3]与解构赋值结合
尾调用
尾调用
Tail Call 是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数。
1 | function f(x) { |
尾调用不一定出现在函数尾部,只要是最后一步操作即可。
1 | function f(x) { |
尾调用优化
函数调用会在内存中形成一个 call frame,保存调用位置和内部变量等信息。所有的 call frame 形成一个 call stack。
尾调用由于是函数的最后一步操作,所以不需要保留外层函数的 call frame,这就叫 Tail Call Optimization,即只保留内层函数的调用帧。
尾递归
递归非常耗内存,因为需要同时保存多个 call frame,很容易发生 stack overflow。但对于尾递归来说,由于只存在一个 call frame,所以不会发生溢出。
1 | function Fibonacci(n) { |
函数的扩展
函数的默认值
在 ES6 之前,不能直接为函数指定默认值,只能采用变通的方法:
1 | function log(x, y) { |
ES6 允许为函数的参数设置默认值:
1 | function log(x, y = "world") { |
~运算符
~运算符
位运算符是三步处理的过程:
- 把运算数转换成 32 位数字
- 把二进制数转换成它的二进制反码
- 把二进制数转换成浮点数
1 | var iNum1 = 25 //25 等于 00000000000000000000000000011001 |
~~技巧
这是刷题时看见别人的代码里使用的东西,通常用来代替 Math.trunc()的方法。
1 | //单个 ~ |
当原始输入不确定时,~~可以将任何非数字类型转换成 0:
1 | console.log(~~[]) //0 |
Math的扩展
Number的扩展
正则的扩展
基本用法
1 | var regex = new RegExp("xyz", "i") |
match()、replace()、search()、split()
String.prototype.match 调用 RegExp.prototype[Symbol.match]
String.prototype.replace 调用 RegExp.prototype[Symbol.replace]
String.prototype.search 调用 RegExp.prototype[Symbol.search]
String.prototype.split 调用 RegExp.prototype[Symbol.split]
字符串的扩展
codePointAt()
JavaScript-16 的格式储存,每个字符固定为两个字节。需要四个字节储存的字符,JavaScript 会认为那是两个字符。
ES6 提供了 codePointAt 方法,能够正确处理四个字节储存的字符,返回一个字符的码点。
String.fromCodePoint()
识别 UTF-32 字符。
includes()、startsWith()、endsWith()
1 | var s = "hello world" |
repeat()
1 | "x".repeat(3) //'xxx' |
解构赋值
基本用法
1 | let [a, b, c] = [1, 2, 3] |