js去除空格的12种实用方法


Posted in Javascript onNovember 08, 2013

实现1

String.prototype.trim = function() {
 return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

看起来不怎么样, 动用了两次正则替换,实际速度非常惊人,主要得益于浏览器的内部优化。一个著名的例子字符串拼接,直接相加比用Array做成的StringBuffer 还快。base2类库使用这种实现。

实现2

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

和实现1 很相似,但稍慢一点,主要原因是它最先是假设至少存在一个空白符。Prototype.js使用这种实现,不过其名字为strip,因为 Prototype的方法都是力求与Ruby同名。

实现3

String.prototype.trim = function() {
 return this.substring(Math.max(this.search(/\S/), 0),this.search(/\S\s*$/) + 1);
}

以截取方式取得空白部分(当然允许中间存在空白符),总共 调用了四个原生方法。设计得非常巧妙,substring以两个数字作为参数。Math.max以两个数字作参数,search则返回一个数字。速度比上 面两个慢一点,但比下面大多数都快。

实现4

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

这个可以称得上实现2的简化版,就是 利用候选操作符连接两个正则。但这样做就失去了浏览器优化的机会,比不上实现3。由于看来很优雅,许多类库都使用它,如JQuery与mootools

实现5

String.prototype.trim = function() {
 var str = this;
 str = str.match(/\S+(?:\s+\S+)*/);
 return str ? str[0] : '';
}

match 是返回一个数组,因此原字符串符合要求的部分就成为它的元素。为了防止字符串中间的空白符被排除,我们需要动用到非捕获性分组(?:exp)。由于数组可 能为空,我们在后面还要做进一步的判定。好像浏览器在处理分组上比较无力,一个字慢。所以不要迷信正则,虽然它基本上是万能的。

实现6

String.prototype.trim = function() {
 return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, '$1');
}

把符合要求的部分提供出来,放到一个空字符串中。不过效率很差,尤其是在IE6中。

实现7

String.prototype.trim = function() {
 return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, '$1');
}

和实现6很相似,但用了非捕获分组进行了优点,性能效之有一点点提升。

实现8

String.prototype.trim = function() {
 return this.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
}

沿着上面两个的思路进行改进,动用了非捕获分组与字符集合,用?顶替了*,效果非常惊人。尤其在IE6中,可 以用疯狂来形容这次性能的提升,直接秒杀火狐。

实现9

String.prototype.trim = function() {
 return this.replace(/^\s*([\S\s]*?)\s*$/, '$1');
}

这次是用懒惰匹配 顶替非捕获分组,在火狐中得到改善,IE没有上次那么疯狂。

实现10

String.prototype.trim = function() {
 var str = this,
 whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
 for (var i = 0,len = str.length; i < len; i++) {
  if (whitespace.indexOf(str.charAt(i)) === -1) {
   str = str.substring(i);
   break;
  }
 }
 for (i = str.length - 1; i >= 0; i--) {
  if (whitespace.indexOf(str.charAt(i)) === -1) {
   str = str.substring(0, i + 1);
   break;
  }
 }
 return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}

我 只想说,搞出这个的人已经不是用牛来形容,已是神一样的级别。它先是把可能的空白符全部列出来,在第一次遍历中砍掉前面的空白,第二次砍掉后面的空白。全 过程只用了indexOf与substring这个专门为处理字符串而生的原生方法,没有使用到正则。速度快得惊人,估计直逼上内部的二进制实现,并且在 IE与火狐(其他浏览器当然也毫无疑问)都有良好的表现。速度都是零毫秒级别的。

实现11

String.prototype.trim = function() {
 var str = this,
 str = str.replace(/^\s+/, '');
 for (var i = str.length - 1; i >= 0; i--) {
  if (/\S/.test(str.charAt(i))) {
   str = str.substring(0, i + 1);
   break;
  }
 }
 return str;
}

实现10已经告诉我们普通的原生字符串截取方法是远胜于正则替换,虽然是复杂一点。但只要正则 不过于复杂,我们就可以利用浏览器对正则的优化,改善程序执行效率,如实现8在IE的表现。我想通常不会有人在项目中应用实现10,因为那个 whitespace 实现太长太难记了(当然如果你在打造一个类库,它绝对是首先)。实现11可谓其改进版,前面部分的空白由正则替换负责砍掉,后面用原生方法处理,效果不逊 于原版,但速度都是非常逆天。

实现12

String.prototype.trim = function() {
 var str = this,
 str = str.replace(/^\s\s*/, ''),
 ws = /\s/,
 i = str.length;
 while (ws.test(str.charAt(--i)));
 return str.slice(0, i + 1);
}

实现10与实现11在写法上更好的改进版,注意说的不是性能速 度,而是易记与使用上。和它的两个前辈都是零毫秒级别的,以后就用这个来工作与吓人。

JS(去掉前后空格或去掉所有空格)的用法

1、 去掉字符串前后所有空格:

代码如下:

function Trim(str){ 
 return str.replace(/(^\s*)|(\s*$)/g, ""); 
}

说明:

如果使用jQuery直接使用$.trim(str)方法即可,str表示要去掉前后所有空格的字符串。

2、 去掉字符串中所有空格(包括中间空格,需要设置第2个参数为:g)

代码如下:

function Trim(str,is_global){
  var result;
  result = str.replace(/(^\s+)|(\s+$)/g,"");
  if(is_global.toLowerCase()=="g")
      {
        result = result.replace(/\s/g,"");
       }
      return result;
}
Javascript 相关文章推荐
jQuery学习笔记之jQuery的动画
Dec 22 Javascript
JS模拟面向对象全解(二、类型与赋值)
Jul 13 Javascript
JavaScript中“基本类型”之争小结
Jan 03 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
Nov 15 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
Aug 21 Javascript
基于node实现websocket协议
Apr 25 Javascript
js实现带缓动动画的导航栏效果
Jan 16 Javascript
Vuex和前端缓存的整合策略详解
May 09 Javascript
深入浅析JavaScript中的RegExp对象
Sep 18 Javascript
React中的render何时执行过程
Apr 13 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 Javascript
通过实例了解Javascript柯里化流程
Mar 03 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 #Javascript
javascript获取url上某个参数的方法
Nov 08 #Javascript
jqgrid 编辑添加功能详细解析
Nov 08 #Javascript
动态加载JS文件的三种方法
Nov 08 #Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
Nov 08 #Javascript
jQuery 获取和设置select下拉框的值实现代码
Nov 08 #Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
Nov 08 #Javascript
You might like
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
PHP内核探索:变量概述
2014/01/30 PHP
php命名空间学习详解
2014/02/27 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
[01:05]DOTA2完美大师赛趣味视频之选手教你打职业
2017/11/23 DOTA
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
详解python算法常用技巧与内置库
2020/10/17 Python
python递归函数用法详解
2020/10/26 Python
Python实现微信表情包炸群功能
2021/01/28 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
C#笔试题
2015/07/14 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
应征英语教师求职信
2013/11/27 职场文书
同学聚会老师邀请函
2014/01/28 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL