字符串 trim , trimStart和trimEnd

703 阅读3分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

前言

ECMAScript 6.0 简称ES6 , 是 JavaScript 语言的新一代的标准,于在 2015 年 6 月发布,正式名称就是《ECMAScript 2015 标准》。一般情况,泛指, 5.1版以后的标准,涵盖了 ES2015、ES2016、ES2017、ES2018、ES2019、ES2020、ES2021 等等

我们一起来学习

  • String.prototype.trim
  • String.prototype.trimStart
  • String.prototype.trimEnd

均是对字符串去掉空白字符 ,从名字也能看出来, trim是去掉前后, trimStart去掉开始部分, trimEnd去掉结束部分。

那么第一个问题来了,空白字符,何为空白字符。

何为空白字符

大家都知道正则\s代表空格字符,其并不是单指某个字符,其实是一个集合,包含:

  • \f 换页
  • \n 换行符
  • \r 回车符
  • \t 制表符
  • \v 垂直制表符

除此之外还有两个特殊的空白字符

  • \uFEFF
    字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF统一码字符的名称。当以UTF-16UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8UTF-16UTF-32编码的标记。
    至于其是怎么工作的,我们单独的文章再来解释。

  • \xA0 \xa0是不间断空白符。 我们通常所用的空格是\x20,是在标准ASCII可见字符0x20~0x7e范围内。 而\xa0属于latin1(ISO/IEC_8859-1)中的扩展字符集字符,代表空白符nbsp(non-breaking space)。

除此之外,其实还有:

  • U+2060来表达零宽度无断空白。
'\u2060' // ''

core-js whitespaces里面是这么定义空白字符的。

// a string of all valid unicode whitespaces
module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
  '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';

我们执行一下:

'\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
  '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'
  
// '\t\n\v\f\r                 

'

很多都是看不见的,至于其他少见的空白字符,我们之后再说。

编码范围:说明 0080-00FF:C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)

String.prototype.trimStart

var text = " \v\f\t\xA0\uFEFF\r\n哈哈   ";
text.trimStart() //  '哈哈   '

Polfill也很简单:

var r=/^\s+/;
String.prototype.trimStart = function (){
   return this.replace(r,'')
}

String.prototype.trimEnd

var text = "哈哈 \v\f\t\xA0\uFEFF\r\n   ";
text.trimStart() //  '哈哈'

Polfill也很简单:

var r=/\s+$/;
String.prototype.trimStart = function (){
   return this.replace(r,'')
}

String.prototype.trim

var text = " \v\f\t\xA0\uFEFF\r\n   哈哈 \v\f\t\xA0\uFEFF\r\n   ";
text.trim() //  '哈哈'

Polfill也很简单: 这个版本源于MDN,\uFEFF\xA0被单独拿出来了,之前为什么没呢?

  String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  };

小结

今天你收获了吗?

引用

字节顺序标记