本文目录:
- 1.String.fromCodePoint()
- 2.String.raw()
- 3.实例方法:codePointAt()
- 4.实例方法:includes()、startsWith()、endsWith()
- 5.实例方法:repeat()
- 6.实例方法:padStart()、padEnd()
- 7.实例方法:trimStart()、trimEnd()
1.String.fromCodePoint()
ES5中使用String.fromCharCode()
方法,用于从Unicode码点返回字符,但是这个方法不能识别大于0xFFFF
的码点。
String.fromCharCode(0x20BB7); //"ஷ"
上面的例子中String.fromCharCode()
方法不能识别0x20BB7
码点,发生了溢出,最高位2
被舍弃,最后返回码点U+0BB7
对应的字符,而不是码点U+20BB7
对应的字符。
ES6提供了新的方法String.fromCodePoint()
,用于完善String.fromCharCode()
方法,String.fromCodePoint()
方法可以识别大于0xFFFF
的码点。
String.fromCodePoint(0x20BB7); //"𠮷"
上面的例子中,String.fromCodePoint()
方法可以识别0x20BB7
码点。
比较:String.fromCodePoint()
方法的作用正好与CodePointAt()
方法的作用相反,前者用于从Unicode码点返回字符,后者用于从字符返回Unicode码点。
2.String.raw()
ES6为String
对象提供了raw()
方法,用于返回一个斜杠都被转义的字符串(即斜杠前面再加一个斜杠),常用于模板字符串的处理方法。
String.raw`Hello \n World!`; //"Hello \\n World!"
如果原字符串的斜杠已经被转义,那么String.raw()
会进行再次转义。
String.raw`Hello \\ world!`; //"Hello \\\\ world!"
String.raw()
本质上是一个正常的函数,只是专用于模板字符串的标签函数。如果写成正常函数的形式,它的第一个参数,应该是一个具有raw
属性的对象,且raw
属性的值应该是一个数组,对应模板字符串解析后的值。
// `foo${1 + 2}bar`
// 等同于
String.raw({ raw: ['foo', 'bar'] }, 1 + 2) // "foo3bar"
3.实例方法:codePointAt()
JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2
个字节。对于那些需要4
个字节储存的字符(Unicode 码点大于0xFFFF
的字符),JavaScript 会认为它们是两个字符。
charCodeAt()
方法用于从字符返回Unicode码点(十进制),无法处理码点大于u0FFFF
的字符。
let str = "𠮷";
str.length; //2
str.charCodeAt(0); // 55362
str.charCodeAt(1); // 57271
注意:汉字“𠮷”的Unicode码点为0x20BB7
上面的例子中,由于汉字“𠮷”的Unicode码点大于0xFFFF
,所以javascript会将它识别为两个字符,str
的length
值会被误判为2,charCodeAt()
方法不能正确处理“𠮷”,只能分别返回它前两个字节的Unicode码点和后两个字节的Unicode码点。
注意: 码点大于u0FFFF
的字符需要四个字节存储。
ES6提供了codePointAt()
方法,它是定义在字符串的实例对象上,用于从字符串返回Unicode码点(十进制),它可以处理码点大于0xFFFF
的字符(四个字节存储的字符)。
let str = "𠮷a";
str.codePointAt(0); //134071
str.codePointAt(1); //57271
str.codePointAt(2); //97
上面的例子,javascript会将"𠮷a
"视为三个字符(6个字节),codePointAt
可以正确处理"𠮷
"字,所以str.codePointAt(0)
返回"𠮷
"字的十进制码点134071,即十六进制的0x20BB7
,codePointAt
处理的第二个字符是“𠮷
”字的后两个字节,所以str.codePointAt(1)
会返回“𠮷
”字后两个字节的十进制码点57271,第三个字符是"a
",str.codePointAt(2)
返回字符"a
"的十进制码点97。
注意:
1.如果处理的字符的码点小于0xFFFF
,charCodeAt
与codePointAt
返回结果相同。
2.虽然codePointAt
可以识别码点大于0xFFFF
的字符,但是javascript会把码点大于0xFFFF
的字符看作两个字符,这就会导致codePointAt
方法的参数错误。
let str = "𠮷a";
str.codePointAt(0); //134071
str.codePointAt(1); //57271
str.codePointAt(2); //97
上面的例子中,字符"a"在codePointAt
中对应的参数应该是1,但是codePointAt
中的参数是2对应的字符才是“a”,处理这个问题,可是使用for…of
,这是因为for…of
可以识别码点大于0xFFFF
的字符。
let str = "𠮷a";
for(let i of str){
console.log(i.codePointAt(0));
}
//134071
//97
返回结果转换为16进制:codePointAt
方法与charCodeAt
方法返回的码点都是十进制的,如果想转换为十六进制,可以使用toString
方法。
let str = "𠮷";
str.codePointAt(0); //134071
str.codePointAt(0).toString(16); //0x20BB7
实例: 使用codePointAt
方法判断一个字符是由两个字节组成还是由四个字节组成
function test(str){
return str.codePointAt(0)>0xFFFF;
}//如果是由四个字节组成返回true,否则返回false
let s1 = "𠮷";
let s2 = "a";
test(s1); //true
test(s2); //false
4.实例方法:includes()、startsWith()、endsWith()
javascript中只有indexof
方法可以判断一个字符串是否包含在另一个字符串中。
ES6又提供了三种方法,includes
,startsWith
,endsWith
,来判断一个字符串是否包含在另一个字符串中。
includes
返回布尔值,判断一个字符串是否包含参数字符串。startsWith
返回布尔值,判断参数字符串是否在原字符串的头部。endsWith
返回布尔值,判断参数字符串是否在原字符串的尾部。
let str = "abcdef";
let str1 = "ab";
let str2 = "ef";
str.includes(str1); //true
str.startsWith(str1); //true
str.endsWith(str2); //true
5.实例方法:repeat()
ES6提供了repeat
方法,返回一个新的字符串,表示重复几次原字符串。
let str = "hello";
str.repeat(2); //"hellohello"
str.repeat(3); //"hellohellohello"
如果参数是小数,将对小数取整。
let str = "Hi";
str.repeat(2.7); //"HiHi"
如果参数是负数或者Infinity
,将会报错。
let str = "Hi";
str.repeat(-2); // RangeError
str.repeat(Infinity); // RangeError
但是如果参数是-1到0之间的小数,则等同于0,因为会先做取整运算,-1~0之间的小数取整会得到0.
let str = "hello";
str.repeat(-0.5);//""
如果参数是
NaN
,也等同于0
如果参数是字符串,则会先转换为数值。
6.实例方法:padStart()、padEnd()
ES6提供了两个字符串补全方法padStart
方法用于头部补全。padEnd
方法用于尾部补全。
let str = "s";
str.padStart(5,"ab"); //"ababs"
str.padEnd(5,"ab"); //"sabab"
'x'.padStart(4, 'ab') // 'abax'
padStart
与padEnd
方法接受两个参数,第一个参数是补全生效的长度,第二个参数是用于补全的字符串。
如果省略了第二个参数,则默认使用空格补全。
'x'.padStrart(5);//" x"
'x'.padEnd(5); //"x "
7.实例方法:trimStart()、trimEnd()
ES2019 提供了trimStart()
、trimEnd()
两个方法,用于消除字符串中的空格。trimStart()
用于消除字符串开头的空格。trimEnd()
用于消除字符串结尾的空格。
let str1 = " x";
let str2 = "abc ";
str1.trimLeft();//"x"
str2.trimRight();//"abc"
trimLeft
和trimRight
分别是trimStart
和trimEnd
的别名。
除了空格键,这两个方法对字符串头部(或尾部)的 tab 键、换行符等不可见的空白符号也有效。