1. 字符串扩展
1.1 includes()
、startWith()
、endsWith()
传统上,JavaScript
只有indexOf
方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6
又提供了三种新方法
includes()
:返回布尔值,表示是否找到了参数字符串。startsWith()
:返回布尔值,表示参数字符串是否在原字符串的头部。-
endsWith()
:返回布尔值,表示参数字符串是否在原字符串的尾部let s = 'Hello world!'; s.startsWith('Hello') // true s.endsWith('!') // true s.includes('o') // true
这三个方法都支持第二个参数,表示开始搜索的位置
let s = 'Hello world!'; s.startsWith('world', 6) // true s.endsWith('Hello', 5) // true s.includes('Hello', 6) // false
上面代码表示,使用第二个参数
n
时,endsWith
的行为与其他两个方法有所不同。它针对前n
个字符,而其他两个方法针对从第n
个位置直到字符串结束。
1.2 repeat
repeat
方法返回一个新字符串,表示将原字符串重复n
次。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
- 参数如果是小数,会被向下取整。
- 如果
repeat
的参数是负数或者Infinity
,会报错。 -
0
到1
之间的小数,则等同于0
,这是因为会先进行取整运算。0
到-1
之间的小数,取整以后等于-0
,repeat
视同为0
。 - 参数
NaN
等同于0
。 - 如果
repeat
的参数是字符串,则会先转换成数字。
1.3 padStart()
、padEnd()
ES2017
引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()
用于头部补全,padEnd()
用于尾部补全
'x'.padStart(5, 'ab') // 'ababx'
'x'.padEnd(5, 'ab') // 'xabab'
- 如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
- 如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
- 如果省略第二个参数,默认使用空格补全长度。
2. 数值的扩展
2.1 Number.isFinite()
、Number.isNaN()
Number.isFinite()
用来检查一个数值是否为有限的(finite
)
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false
Number.isNaN()
用来检查一个值是否为NaN
和全局函数 isNaN()
相比,该方法不会强制将参数转换成数字,只有在参数是真正的数字类型,且值为 NaN
的时候才会返回 true
Number.isNaN(NaN); // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0 / 0) // true
// 下面这几个如果使用全局的 isNaN() 时,会返回 true。
Number.isNaN("NaN"); // false,字符串 "NaN" 不会被隐式转换成数字 NaN。
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN("blabla"); // false
// 下面的都返回 false
Number.isNaN(true);
Number.isNaN(null);
Number.isNaN(37);
Number.isNaN("37");
Number.isNaN("37.37");
Number.isNaN("");
Number.isNaN(" ");
2.2 Number.parseInt()
、Number.parseFloat()
ES6
将全局方法parseInt()
和parseFloat()
,移植到Number
对象上面,行为完全保持不变
// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45
这样做的目的,是逐步减少全局性方法,使得语言逐步模块化
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true
2.3 Number.isInteger()
Number.isInteger()
用来判断一个值是否为整数。需要注意的是,在 JavaScript
内部,整数和浮点数是同样的储存方法,所以 3
和 3.0
被视为同一个值
Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
3. Math 对象的扩展
ES6
在 Math
对象上新增了 17
个与数学相关的方法。所有这些方法都是静态方法,只能在 Math
对象上调用
3.1 Math.trunc()
Math.trunc
方法用于去除一个数的小数部分,返回整数部分
Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0
- 对于非数值,
Math.trunc
内部使用Number
方法将其先转为数值。 - 对于空值和无法截取整数的值,返回
NaN
3.2 Math.sign()
Math.sign
方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值
它会返回五种值。
参数为正数,返回
+1
参数为负数,返回
-1
参数为
0
,返回0
参数为
-0
,返回-0
-
其他值,返回
NaN
Math.sign(-5) // -1 Math.sign(5) // +1 Math.sign(0) // +0 Math.sign(-0) // -0 Math.sign(NaN) // NaN Math.sign('') // 0 Math.sign(true) // +1 Math.sign(false) // 0 Math.sign(null) // 0 Math.sign('9') // +1 Math.sign('foo') // NaN Math.sign() // NaN Math.sign(undefined) // NaN
3.3 Math.cbrt()
Math.cbrt
方法用于计算一个数的立方根
对于非数值,Math.cbrt
方法内部也是先使用Number
方法将其转为数值
Math.cbrt(-1) // -1
Math.cbrt(0) // 0
Math.cbrt(1) // 1
Math.cbrt(2) // 1.2599210498948734
3.4 Math.hypot()
Math.hypot
方法返回所有参数的平方和的平方根
Math.hypot(3, 4); // 5
Math.hypot(3, 4, 5); // 7.0710678118654755
Math.hypot(); // 0
Math.hypot(NaN); // NaN
Math.hypot(3, 4, 'foo'); // NaN
Math.hypot(3, 4, '5'); // 7.0710678118654755
Math.hypot(-3); // 3
4. 指数运算符
ES2016
新增了一个指数运算符(**
)
2 ** 2 // 4
2 ** 3 // 8
指数运算符可以与等号结合,形成一个新的赋值运算符(**=
)
let a = 1.5;
a **= 2;
// 等同于 a = a * a;
let b = 4;
b **= 3;
// 等同于 b = b * b * b;