首页 > 其他 > 详细

ES 字符串操作

时间:2021-04-19 15:03:42      阅读:25      评论:0      收藏:0      [点我收藏+]

字符

   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浅拷贝数组元素:
定义:方法返回一个从开始到结束(不包括结束)选择的数组浅拷贝到一个新的数组对象,且原数组对象不被修改。

 

ES 字符串操作

原文:https://www.cnblogs.com/zhishiyv/p/12442749.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!