3、字符串的扩展
ES6加强了对Unicode的支持,并且扩展了字符串的对象。
在JavaScript中,字符以UTF-16的格式存储,每个字符固定为2个字节。对于4个字节存储的字符,JavaScript不能正确处理,字符串长度会被误判为2。而且charAt方法无法读取到字符,charCodeAt方法只能分别返回前两个字节和后两个自己的值。
ES6提供了codePointAt方法,能够正确处理4个字节存储的字符,返回一个字符的Unicode编号。
codePointAt方法是测试一个字符有两个字节还是4个字节组成最简单的方法。
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
is32Bit("?") // true
is32Bit("a") // false
该方法用于从Unicode编号返回对应的字符串,作用与codePointAt正好相反。
String.fromCodePoint(134071) //"?"
注意:fromCodePoint方法定义在String对象上,而codePointAt方法定义在字符串的实例对象上。
JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表示字符的Unicode编号。
"\u0061"
//"a"
但是,这种表示方法只限于\u0000--\uFFFF之间的字符。超出这个范围必须用双字节的形式表达。
"\uD842\uDFB7"
//"?"
ES6针对这一问题做出了改进,只要将超过0xFFFF的编号放入大括号,就能的得到正确解读。
"\u{20BB7}"
//"?"
contains():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
var s = "Hello world!";
s.startsWith("Hello") //true
s.endsWith("!") //true
s.contains("o") //true
这三个方法都支持第二个参数,表示开始搜索的位置。
var s = "Hello world!";
s.startsWith("o", 4) //true
s.endsWith("o", 8) //true
s.contains("o", 8) //false
repeat()返回一个新字符串,表示将源字符串重复n次。
"x".repeat(3) //"xxx"
"hello".repeat(2) //"hellohello"
模板字符串是增强版的字符串,用反引号(`)标识。他可以当做普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
//普通字符串
`In Javascript '' is a line-feed`
//多行字符串
`In Javascript this is
not legal.`
//字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
var x = 1;
var y = 2;
console.log(`${x} + ${y} = ${x+y}`) //"1+2=3"
在模板中嵌入变量需要将变量名写入${}中。
4、数值的拓展
ES6提供了二进制和八进制数值的新写法,分别用前缀0b和0o表示。
0b111110111 === 503 //true
0o767 === 503 //true
八进制用0o前缀表示的方法,将要取代已经在ES5中逐步淘汰的加前缀0的写法。
ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两种特殊值。
它们与传统的isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,在进行判断,而这种新方法只对数值有效,对于非数值一律返回false。
isFinite(25) //true
isFinite("25") //true
Number.isFinite(25) //true
Number.isFinite("25") //false
isNaN(NaN) //true
isNaN("NaN") //true
Number.isNaN(NaN) //true
Number.isNaN("NaN") //false
ES6将全局方法parseInt()和parseFloat(),移植到了Number对象上面,行为保持不变。
这样做的目的是逐渐减少全局方法,是语言逐步模块化。
Number.isInteger()用来判断一个值是否为整数。注意的是,在JavaScript内部,整数和浮点数使用同样的存储方式,所以3和3.0被视为同一个值。
Number.isInteger(25) //true
Number.isInteger(25.0) //true
Number.isInteger(25.1) //false
JavaScript能够准确表示的整数范围为-53 ~
53。ES6引入了Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER这两个常量,用来表示这个范围的上下限。Number.isSafeInteger()则用来判断一个整数是否在这个范围内。
var inside = Number.MAX_SAFE_INTEGER;
var outside = inside + 1;
Number.isInteger(inside) //true
Number.isSafeInteger(inside) //true
Number.isInteger(outside) //true
Number.isSafeInteger(outside) //false
Math.trunc()用于去除一个数的小数部分,返回七整数部分。
ES6在math对象上提供了许多新的方法
Math.acosh(x),Math.asinh(x)......