ES6中对字符串处理的优点

Wesley13
• 阅读 795

[toc]

1、字符的Unicode表示法

ES6之前 Unicode 只能表示 \u0000 -- \uFFFF 之间的字符。 ES6可以表示超过这个 范围的unicode字符 如

//原来 ES6 之前
"\uD842\uDFB7"
// "𠮷"

"\u20BB7"
// " 7"

// ES6 

"\u{20bb7}"
// "𠮷"

//🚀
"\u{1F680}" === "\uD83D\uDE80"

好多中文是的Unicode是超过 \uFFFF 的,有了这种表示,我们就可以用一个字节 表示表示一个字符而不像原来用两个字节。

JavaScript 的6中表示一个字符的方法

'\z' === 'z'  // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true

2、字符串的遍历接口

for...of

他的优点 普通的for循环,不能识别编码大于 '\uffff' 的码点字符会把它拆分为两个

//普通遍历会把超表示范围的码点 是被为两个,拆分后如果是不可打印字符会输出空
let text = String.fromCodePoint(0x20BB7)
for (let i = 0;i < text.length; i++){
    console.log(text[i]);
}
//"�"
//"�"
 
// 用 for...of
for (let i of text) {
  console.log(i);
}
// "𠮷"

3、直接输入 U+2028 和 U+2029(分行符 和 分段符)

JavaScript 规定有5个字符,不能在字符串里面直接使用,只能使用转义形式。 U+005C:反斜杠(reverse solidus) U+000D:回车(carriage return) U+2028:行分隔符(line separator) U+2029:段分隔符(paragraph separator) U+000A:换行符(line feed) 例如想输出 反斜杠\ 只能先转意 \ 或者 \005c

4、JSON.stringify() 的改造

根据标准,JSON 数据必须是 UTF-8 编码。但是,现在的JSON.stringify()方法有可能返回不符合 UTF-8 标准的字符串。 具体来说,UTF-8 标准规定,0xD800到0xDFFF之间的码点,不能单独使用,必须配对使用。比如,\uD834\uDF06是两个码点,但是必须放在一起配对使用,代表字符𝌆。这是为了表示码点大于0xFFFF的字符的一种变通方法。单独使用\uD834和\uDFO6这两个码点是不合法的,或者颠倒顺序也不行,因为\uDF06\uD834并没有对应的字符。 JSON.stringify()的问题在于,它可能返回0xD800到0xDFFF之间的单个码点。 JSON.stringify('\u{D834}') // "\u{D834}" 为了确保返回的是合法的 UTF-8 字符,ES2019 改变了JSON.stringify()的行为。如果遇到0xD800到0xDFFF之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。

JSON.stringify('\u{D834}') // ""\uD834"" JSON.stringify('\uDF06\uD834') // ""\udf06\ud834""

5、字符串模版 用反引号包裹

// 普通字符串
`In JavaScript '\n' is a line-feed.`

// 多行字符串
`In JavaScript this is
 not legal.`

console.log(`string text line 1
string text line 2`);

// 字符串中嵌入变量
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

字符串模版中要包含 反引号 ` 就需要用转移字符

let greeting = `\`Yo\` World!`;

使用字符串模版表示多行字符串,所有的空格和缩进都会被保存在输出之中

$('#list').html(`
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`);

字符模版中可以嵌入变量 ,不过要用 ${var} 包裹,

function authorize(user, action) {
  if (!user.hasPrivilege(action)) {
    throw new Error(
      // 传统写法为
      // 'User '
      // + user.name
      // + ' is not authorized to do '
      // + action
      // + '.'
      `User ${user.name} is not authorized to do ${action}.`);
  }
}

字符模版中可以写表达式 字符串模板中可以调用函数

function fn() {
  return "Hello World";
}

`foo ${fn()} bar`

字符串模板可以嵌套

const tmpl = addrs => `
  <table>
  ${addrs.map(addr => `
    <tr><td>${addr.first}</td></tr>
    <tr><td>${addr.last}</td></tr>
  `).join('')}
  </table>
`;

6、标签模板

alert `123`
//等同于
alert(123)

字符串模板紧跟在一个函数名之后。形成一个函数调用的功能。

[字符串扩展](http://es6.ruanyifeng.com/#docs/string 字符串扩展)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Peter20 Peter20
3年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
ES6学习笔记(3)
参考书《ECMAScript6入门》http://es6.ruanyifeng.com/字符串的扩展ES6之前只能识别\\u0000\\uFFFF之间的字符,超过此范围,识别会出错;ES6弥补了这个错误ES6扩展的新方法codePointAt"𠮷".CodePointAt(0)//返回超过\\u00
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Wesley13 Wesley13
3年前
ES6之路第三篇:字符串的扩展
字符的Unicode表示法1"\u{20BB7}"2//"𠮷"34"\u{41}\u{42}\u{43}"5//"ABC"67lethello123;8hell\u{6F}//123910'\u{
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这