2. 字符串和正则表达式
1.更好的Unicode支持
UTF-16 ----> Unicode支持
1.1 UTF-16的码位
16个位只能表示2^16中字符,其实是不够的。——>基本多文种平面。超出这个范围需要某个辅助平面。
UTF引入了代理对,用两个16位的单元表示一个字符。所里字符串,有的是用一个单元位表示的,有的是用两个字符位进行表示的。如果处理代理对的UTF-16的字符串将会得到与预期不同的结果。比如读取length,使用es5种的.charCodeAt()。读取一个字符的length可能是2。会返回每个16位编码单元相应的字符串。
1.2 codePointAt
接受编码单元格的位置而非字符串的位置。返回与字符串中给定位置对应的码位。
如果一个 字符串的.charCodeAt()>0xfffff
,这个字符就是非BMP字符串。
1.3 String.fromCodePoint()
将编码转化为字符。codePointAt()。相反的方法。
将编码转化为字符。String.fromCharCode()。和charCodeAt()相反的方法。
1.4 normalize()
Unicode中,如果我们对不同的字符串进行排序或者比较。我们可能会得到他们是等效的的结果。1 || 2
- 码位没有任何区别。
- 兼容性问题。
方法作用,提供Unicode的标准化形式。
1.5 正则表达式
u修饰符
1.编码单元模式——>字符模式
ES6不支持字符串码位数量的检测。
function (text) {
let rlt = text.match(/[\s\S]/gu);
return rlt.length ? rlt.length : 0;
}
但是运行效率很低
- 检测u修饰符的支持情况
function hasRegExpu() {
try {
var ptn = new RegExp('.', 'u');
return true
} catch (ex) {
return false
}
}
2.其他字符串变更
2.1 字符串中子串识别
- indexOf() ——> 可以识别准确位置 可以传入正则表达式,会转化为字符串搜索他
- includes() ——> true /false 不可以传入正则表达式
- startWith(字符串, 字符串位置) ——> true /false 不可以传入正则表达式
- endWith(字符串, 字符串位置) ——> true /false 不可以传入正则表达式
2.2 repeat方法
字符串.repeat(次数)
3. 其他正则表达式语法变更
3.1 正则表达式y修饰符
影响正则表达式中sticky属性。字符串中字符开始匹配,通知搜索从正则表达式的lastIndex(下一次匹配开始)属性开始,在指定位置没能匹配成功,会停止匹配。
let text = 'hello1 hello2 hello3',
p = /hello\d\s?/,
result = p.exec(text),
gP = /hello\d\s?/g,
gresult = gP.exec(text),
sP = /hello\d\s?/y,
sresult = sP.exec(text);
console.log(result[0], gresult[0], sresult[0]);
p.lastIndex = 1;
gP.lastIndex = 1;
sP.lastIndex = 1;
result = p.exec(text);
gresult = gP.exec(text);
sresult = sP.exec(text);
// 报错
console.log(result[0], gresult[0], sresult[0]);
执行操作时,y修饰符会把上次匹配后面一个字符的索引保存在lastIndex中;如果匹配为空,lastIndex会被重置为0.
注意:
1. 只有调用exec()和test()这些正则表达式对象方法才会涉及lastIndex属性。match()不会触发粘滞行为
2.粘滞正则表达式,如果使用^字符来匹配字符串开端。只会从字符串的其实位置或者多行模式的首行匹配
。。。
正则表达式没缕清。
4. 模板字面量
ES6提供的ES5填补
- 多行字符串
- 基本的字符串格式化
- HTML转义
4.1 基本语法
`字符串`
4.2 多行字符串
使用单双引号,字符串必须在同一行。在ES6之前解决办法
var msg = "Mul \
string"
msg // "Mul string"
var msg = "Mul \n \
string"
msg // "Mul
string"
ES6解决办法
let msg = `Mul
msg
`
msg // Mul
// msg
4.3 简化多行字符串
在反撇号中所有的空白福都属于字符串的一部分,所以千万小心
let msg = `Mul
msg
`
console.log(msg);
// Mul
// msg
4.3 字符串占位符
let name = "MIKE"
console.log(`hello ${name}`) // hello MIKE 可以是变量,表达式等 可以多重嵌套
不要嵌入未定义变量,会报错。
4.4 标签模板
每个标签模板都可以执行模板字面量上的转换并返回最终的字符串值
tag`hello word`
这里的模板标签就是tag
- 定义标签
标签可以是一个函数,调用时传入加工过的模板字面量各部分数据,但是必须结合咩哥部分创建结果
eg:
// 第一个参数必须是数组, 之后所有参数都是每一位占位符的解释值。
function tag(literals, ...subtitutions) {
// 返回一个字符串
}
let person = 'Mike';
let age = 28;
function myTag(strings, personExp, ageExp) {
var str0 = strings[0]; // "that "
var str1 = strings[1]; // " is a "
let ageStr;
if (ageExp > 99){
ageStr = 'centenarian';
} else {
ageStr = 'youngster';
}
return str0 + personExp + str1 + ageStr;
}
let output = myTag`that ${ person } is a ${ age }`;
//输出字符串
在模板字面量中使用原始的值
let msg = `mul\nstring`;
let msg2 = String.raw(msg);
// msg2 `mul\\nstring