字符串
Unicode表示法
1.采用\uxxxx表示字符,仅限\u0000 ~ \uFFFF
2.超过部分会理解成加法如:
“\u20BB7”理解为\u20BB + 7
es6写法要求将码点放入大括号即可正确解读,如:
“\u{20BB7}”
“\u41” //SyntaxError: Invalid Unicode escape sequence
“\u{41}” //A
3. 大括号表示法和四字节的UTF-16编码等价
codePointAt()
1.js内字符以UTF-16格式存储,每个字符两个字节,需4字节存储的字符(码点大于0xFFFF),js认为其是2个字符(测试发现不会将所有汉字认为是两个字符的)
var s = "��";
s.length //2
s.charAt(0) //''
s.charAt(1) //''
s.charCodeAt(0) //55362
s.charCodeAt(1) //57271
'��'.charCodeAt(0) //55357
var s = "��a";
s.codePointAt(0) //134071
s.codePointAt(1) //57271(后两个字节)
s.codePointAt(2) //97
2.codePointAt返回码点十进制值,可使用toString转换
s.codePointAt(0).toString(16) //”20BB7”
3.for…of循环可以识别32位UTF-16字符
for (let ch of s){
console.log(ch.codePointAt(0))
}
//134071
//97
4.测试字符为2字节还是4字节:
function is32Bit(c){
return c.codePointAt(0) > 0xFFFF;
}
String.fromCodePoint()
1.String.fromCharCode()返回码点对应的字符串(无法识别32位,会将超出位数舍弃)
String.fromCharCode(0x20BB7) //"ஷ"
String.fromCharCode(0x0BB7) //"ஷ"
2.String.fromCodePoint()可识别大于0xFFFF字符,多个参数时合并为一个字符串返回
String.fromCodePoint(0x78, 0x1f680, 0x79); //"x��y"
3.定义在String对象上
字符串的遍历器接口
1.可使用for…of循环遍历,识别大于0xFFFF码点,传统for循环无法识别
at()
1.(ES7提供目前不适用)可识别大于0xFFFF码点,es5的charAt()方法无法识别
normalize() | Unicode正规化
语调和重音符号的表示方法:
1. 直接使用带重音符号字符,如 Ǒ ("\u01D1")
2. 合成符号, 如 Ǒ ("\u004f\u030c")
1.但是’\u01D1’ == ‘\u004f\u030c’ //false(因为前者length=1,后者length=2)
2.’\u01D1’.normalize() == ‘\u004f\u030c’.normalize() //true
3.normalize()接受’NFC’(返回字符合成形式),’NFD’(返回字符分解形式),’NFKC’,’NFKD’四个参数
4.无法识别3个及3个以上的字符合成
“\u004f\u030c\u030c” //Ǒ̌
includes(),startsWidth(),endsWidth() | 字符串搜索
1.原:indexOf()
新增:
includes() 是否包含
startsWidth() 是否以xx开头
endsWidth() 是否以xx结尾
2.第二个参数:开始搜索的位置
3. 返回布尔值
repeat() | 字符串重复
1.将原字符串重复几次,返回新字符串
2.参数为小数会将小数位丢掉(‘-0.9’丢掉小数位为’-0’,即’0’)
3.参数为负数Infinity,报错
4.参数为NaN 等同于 0
5.参数为字符串会先转换为数字
padStart(), padEnd() | 字符串补全
- 第一个参数:字符串最小长度; (原字符串长度大于指定最小长度,返回原字符串)
第二个参数:用来补全的字符串(省略使用空格补全)
'x'.padStart(4, 'ab') //abax
模板字符串
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);
- ‘`’反引号内可为:普通字符串,多行字符串,变量(用${}访问)
- 若模版字符串中需要用到反引号,前面要加反斜杠转义
- 所有的空格,缩紧,回车都会被保留在输出中
- 访问变量的${}中可以是表达式,也可以是函数
var obj = {x:1, y:2};
`${obj.x} + ${obj.y}`
//3
function f(){}
`${f()}`
- 若大括号中不是字符串,则按一般规则其转化为字符串
- 模板中的字符变量没有声明,报错
- 引用模板字符串本身(没看懂)
模板编译
- (没看懂)
标签模板
- 函数名加模板字符串,用此函数来处理模板字符串
alert`aaa`
alert(aaa)
var a = 5
var b = 10
tag`Hello ${ a + b } world ${ a * b }`;
//字符串返回给函数的第一个参数:['Hello', 'world', '']
//第二个参数:15
//第三个参数:50
- 使用函数处理字符串,接收多个参数
第一个:数组,变量外的字符串[‘Hello’, ‘world’, ”]
第二 ~ n 个参数:变量计算后的值 ,在这里第二个参数是15 第三个参数是50 - 应用:过滤html字符串中的特殊字符,防止恶意输入
多语言转换(i18n)
自定义模板处理函数(hashTemplate)
js中嵌入其他的语言(jsx) - 函数处理字符串,字符串的返回值,第一个参数还有一个raw属性,也指向一个数组,内容与原第一个参数的区别是里面的反斜杠被转义了
tag`First line\nSecond line`
function tag(strings) {
console.log(strings.raw[0]);
// "First line\\nSecond line"
}
String.raw() | 将字符串中的反斜杠转义
1.String.raw\n
输出 \n (已转义的不再转义)
String.raw({ raw: 'test' }, 0, 1, 2);
// 't0e1s2t'
// 等同于
String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2);