React全家同学习之ES6之字符串的扩展

ES6加强了对Unicode的支持,并且扩展了字符串对象。

1、字符的Unicode表示法

JavaScript 允许采用 \uxxxx形式表示一个字符,其中“XXXX”表示字符的码点。但是这种表示法只限于\u0000 --\uFFFF之间的字符。超出这个范围的字符,必须用两个双子节的形式表达。如果直接在\u后面跟上超过0xFFFF的数值,JavaScript会理解成\u 20BB+7.由于\u20bb是一个不可打印字符,所以只会显示一个空格,后面跟着一个7.

ES6对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。

如:“\uDB42\uDFB7”       //”吉“

         "\u{20BB7}"     //  "吉"

      ‘\u{1F680}’ ==='\uD83D\uDE80'        //true

磁粒子表明,大括号表示法与四字节的UTF-16编码是等价的。

2、codePonitAt()

      javaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符,JavaScript会认为她们是两个字符。

ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的码点。

     codePointAt方法的参数,是字符在字符串中的位置(从0开始)。

     总之,codePontAt方法会正确返回32位的UTF-16字符的码点。对于哪些两个字节存储的常规字符,它的返回结果与charCodeAt方法相同。

codePontAt方法返回的是码点的十进制值。如果想要十六进制的值,可以使用toString方法转换一下。

  事实上,codePintAt方法是测试一个字符由两个字节还是四个字节组成的最简单的方法。32Bit

eg:

   function is32Bit(c){

      return c.codePointAt(0) > 0xFFFF;

}

 is32Bit("a")  //false


3、String.fromCodePoint()
 ES5 提供String.fromCharCode方法,用于从码点返回对应的字符。

ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。

 4、字符串的遍历器接口

ES6为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历。

eg:

     for (let codePoint of 'foo') {
  console.log(codePoint)
}
// "f"
// "o"
// "o"

5、at()方法。

ES5对字符串对象提供charAt方法,返回字符串给定位置的字符。该方法不能识别码点大于0xFFFF的字符。

ES6提出字符串实例的at方法,可以识别Unicode编号大于0xFFFF的字符,返回正确的字符。

6、normalize()

ES6提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。

    

normalize方法可以接受一个参数来指定normalize的方式,参数的四个可选值如下。

  • NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。
  • NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。
  • NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize方法不能识别中文。)
  • NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
7、includes(), startsWith(), endsWith()
传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。


8、reapt()
用于返回一个新字符串,表示将原字符串重复n次。
eg:'x'.repeat(3)  //"xxx"
参数如果是小数,会被取整。
参数如果是负数或Infinity,会报错。
如果参数是0到-1之间的小数,则等同于0。
如果repeat的参数是字符串,则会先转换成数字。
参数NaN等同于0。
9、padStart(),padEnd()
如果某个字符串不够指定长度,会在头部或尾部补全。padStart用于头部补全,padEnd用于尾部补全。
padStart和padEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。
如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
eg:'abc'.padStart(10, '0123456789')
// '0123456abc'
如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
eg:
    'xxx'.padStart(2, 'ab') // 'xxx'
    'xxx'.padEnd(2, 'ab') // 'xxx'
如果省略第二个参数,则会用空格补全长度
eg:
    'x'.padStart(4) // '   x'
    'x'.padEnd(4) // 'x   '


用途:
       (1)是为数值补全指定位数。下面代码生成10位的数值字符串。
      eg:'1'.padStart(10, '0') // "0000000001"
          '12'.padStart(10, '0') // "0000000012"

      (2)提示字符串格式。
        eg:'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"

  10、模板字符串
         ES6引入了模板字符串解决这个问题。
eg:
         $('#result').append(`
        There are <b>${basket.count}</b> items
         in your basket, <em>${basket.onSale}</em>
         are on sale!
         `);
      
 模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
 模板字符串中嵌入变量,需要将变量名写在${}之中。

11、String.raw()
      String.raw方法,往往用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串。
  eg:String.raw'Hi\n${2+3}!';           //"Hi \\ n5 !"


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值