ES 对Unicode的支持
允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点,这种表示方法,码点在 \u0000~\uFFFF之间,超出这个范围的字符,需要用双字节的形式表示
字符串遍历接口:
1、for ... of .. (注: 除了遍历字符串,这个遍历器最大的优点是可以识别大于oxFFFF的码点)
for (let codePoint of ‘sufeng‘) { console.log(codePoint) } // "s" // "u" // "f" // "e" // "n" // "g"
ES6引入了模板字符串解决这个问题,模板字符串是增强版的字符串,用反引号·``切换到英文输入法模式下找到电脑键盘 Esc 下面的键,敲两下就出现了反引号,它可以当做普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
模板字符串中嵌入变量,需要将变量名写在${}之中,大括号内部可以放入任意的javascript表达式,可以进行运算,以及引用对象属性,不过如果大括号内的值不是字符串,将按照一般规则转为字符串,比如,大括号中是一个对象,将默认调用对象的toString方法。
模板字符串甚至还能嵌套,示例如下
const tmpl = addrs => ` <table> ${addrs.map(addr => ` <tr><td>${addr.first}</td></tr> <tr><td>${addr.last}</td></tr> `).join(‘‘)} </table> `; . . . const data = [ { first: ‘<Jane>‘, last: ‘Bond‘ }, { first: ‘Lars‘, last: ‘<Croft>‘ }, ]; console.log(tmpl(data));
模板字符串的引用
下面代码,模板字符串写成了一个函数的返回值,执行这个函数,就相当于执行这个 模板字符串了。
let func = (name) => `Hello ${name}!`; func(‘Jack‘) // "Hello Jack!"
模板编译
let template = ` <ul> <% for(let i=0; i < data.supplies.length; i++) { %> <li><%= data.supplies[i] %></li> <% } %> </ul> `;
上边的代码,在模板字符串中,放置了一个常规模板,该模板使用<% %>放置JavaScript代码,使用<%= ...%>输出JavaScript表达式
字符串对象的方法:
String.fromCodePoint 用于从Unicode码点返回对应字符。
String.raw() ES6还原原生的String对象,提供了一个raw()方法,往往用于模板字符串的处理方法。
codePointAt() 在JavaScript内部,字符以UTF-16的格式存储,每个字符固定为2个字节,对于哪些需要4个字节储存的字符,JavaScript就会人为他们是两个字符。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,chartAt()方法无法读取整个字符,charCodeAt()方法只能分别返回前两个字节和后两个字节的值。ES6提供的codePointAt()方法,能够正确处理4个字节储存的字符。
codePointAt()方法返回的是码点的十进制值,如果想要十六进制的值,可以使用toString() 方法转换下
let s = ‘??a‘; s.codePointAt(0).toString(16) // "20bb7" s.codePointAt(2).toString(16) // "61"
你可能注意到,codePointAt()方法的参数,仍然是不正确的,比如,字符a在字符串s的位置序号应该是1,但是必须向codePointAt()方法传入2,解决这个问题的方法有
1 使用for ... of 循环
let s = ‘??a‘; for (let ch of s) { console.log(ch.codePointAt(0).toString(16)); }
2 另外一种方法也可以,使用扩展运算符(...)进行展开操作
let arr = [...‘??a‘]; // arr.length === 2 arr.forEach( ch => console.log(ch.codePointAt(0).toString(16)) );
normalize() ES6 提供字符串实例的normalize() 方法,用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。
normalize()方法,,可以接受一个参数来指定normalize的方式,四个可选值如下:
1 NFC 默认参数,表示“标准等价合成”
2 NFD 表示“标准等价分解”
3 NFKC 表示”兼容等价合成“
4 NFKD 表示兼容等价分解 在兼容等价的前提下,返回和橙子复分解的多个简单字符
不过,normalize方法目前不能识别三个或三个以上字符的合成,这种情况下,还是只能用正则表达式,通过Unicode编号区间判断
实例方法:includes() startsWith() endWith()
传统上,JavaScript 只有indexof方法,可以用来确定一个字符串是否包含在另一个字符串中,ES6又提供了三种新方法。
includes(): 返回布尔值,表示是否找到了参数字符串
startsWith(): 返回布尔值,表示参数字符串是否在原字符串的头部
endsWith(): 返回布尔值,表示参数字符串是否在原字符串的尾部,
三个方法,都支持第二个参数,表示开始搜索的位置
实例方法 repeat
repeat方法返回一个新字符串,表示将原字符串重复n次,
NAN 等同于 0
‘na‘.repeat(NaN) // ""
参数取整运算
‘na‘.repeat(2.9) // "nana" ‘na‘.repeat(-0.9) // ""
参数是负数或者Infinity
// Infinity 表示无穷 ‘na‘.repeat(Infinity) // RangeError ‘na‘.repeat(-1) // RangeError
如果参数是字符串,则会先转换成数字
‘na‘.repeat(‘na‘) // "" ‘na‘.repeat(‘3‘) // "nanana"
实例方法:padStart(), padEnd()
前者用于头部补全,pageEnd用以尾部补全
‘x‘.padStart(5, ‘ab‘) // ‘ababx‘ ‘x‘.padStart(4, ‘ab‘) // ‘abax‘ ‘x‘.padEnd(5, ‘ab‘) // ‘xabab‘ ‘x‘.padEnd(4, ‘ab‘) // ‘xaba‘
如果原字符串的长度,等于或大于最打长度,则字符串补全不生效,返回源字符串
‘xxx‘.padStart(2, ‘ab‘) // ‘xxx‘ ‘xxx‘.padEnd(2, ‘ab‘) // ‘xxx‘
如果用来补全的字符串与原字符串,两者的长度值和超过了最大长度,则会截去超出位数的补全字符串。
‘abc‘.padStart(10, ‘0123456789‘) // ‘0123456abc‘
padStart()
的常见用途是为数值补全指定位数。下面代码生成 10 位的数值字符串。
‘1‘.padStart(10, ‘0‘) // "0000000001" ‘12‘.padStart(10, ‘0‘) // "0000000012" ‘123456‘.padStart(10, ‘0‘) // "0000123456"
另一个用途是提示字符串格式。
‘12‘.padStart(10, ‘YYYY-MM-DD‘) // "YYYY-MM-12" ‘09-12‘.padStart(10, ‘YYYY-MM-DD‘) // "YYYY-09-12"
ES2019 对字符串实例新增了trimStart()
和trimEnd()
这两个方法。它们的行为与trim()
一致,trimStart()
消除字符串头部的空格,trimEnd()
消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。
实例方法:replaceAll() 返回一个新的字符串,不会改变原字符串
字符串的实例方法replace()
只能替换第一个匹配。
) // ‘aa_bcc‘
如果要替换所有的匹配,不得不使用正则表达式的g
修饰符。
‘aabbcc‘.replace(/b/g, ‘_‘) // ‘aa__cc‘
引入了replaceAll()
方法,可以一次性替换所有匹配。
‘aabbcc‘.replaceAll(‘b‘, ‘_‘) // ‘aa__cc‘
截取字符串前 i 个字符
str = str.substring(0,i);
去掉字符串的前 i 个字符
str = str.substring(i)
splice() 添加、删除数组元素,然后返回被删除的项目或者添加后的项目
array.splice(index,howmany,item1,item2,....,intemX);
参数
index 必须,整数,规定添加、删除项目的位置,使用负数时可从数组结尾处规定位置。
howmany 必须 要删除的项目数量,如果为0,表示不做删除
item1,...,itemX向数组中添加新的元素
slice浅拷贝数组元素:
定义:方法返回一个从开始到结束(不包括结束)选择的数组浅拷贝到一个新的数组对象,且原数组对象不被修改。
原文:https://www.cnblogs.com/zhishiyv/p/12442749.html