trim, 作用是去除字符串左右两边的空白字符, 我们肯定不会陌生.
由于原生的String.prototype.trim支持并不广泛, 所以还是要自己实现.

下面是收集的各种实现方法, 作为学习之用.

1.先去除开头的, 再去除结尾的

function trim(str) {return str.replace(/^\s\s*/, '').replace(/\s*\s$/, '');
}

2.和版本1相似,不过比1慢一些,主要原因是它假设至少存在一个空白字符. Prototype.js中用的是它, 不过叫strip.

function trim(str) {return str.replace(/^\s+/, '').replace(/\s+$/, '');
}

3.比上面两个慢一些

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

4.早期的jquery中使用它, 也是本人喜欢的方式, 看起来很优雅. 但不如3快一些.

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

5.利用String.prototype.match, 慢

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

6.据说在IE6下很慢, 不过我没见过IE6…

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

7.在6上加非捕获性分组, 比6快一些

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

8.据说在IE6下, 效果比6, 7快很多, 秒杀FF3

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

9.使用懒惰匹配代替非捕获性分组, 在ff下有所改善, 在ie下不如8那么快

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

10.源自PHP.js(改编自http://locutus.io/php/strings/trim/), 与php的trim函数用起来一致

// example 1: trim('    Kevin van Zonneveld    ')
// returns 1: 'Kevin van Zonneveld'
// example 2: trim('Hello World', 'Hdle')
// returns 2: 'o Wor'
// example 3: trim(16, 1)
// returns 3: '6'
function trim(str, charlist) {// 列举所有可能的空白字符var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';var l = 0; // 长度var i = 0; // 循环索引str += ''; // 转字符串// 自定义要删除的字符if (charlist) {whitespace = (charlist + '').replace(/([[\]().?/*{}+$^:])/g, '$1')}l = str.length;// 从头删除空白字符for (i = 0; i < l; i++) {if (whitespace.indexOf(str.charAt(i)) === -1) {str = str.substring(i);break;}}// 重新计算长度l = str.length;// 从尾部删除空白字符for (i = l - 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 : ''
}

11.10的”压缩版”

function trim(str) {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;
}

12.比10好记, 性能差一些(书中有误)

function trim(str) {var str = str.replace(/^\s\s*/, '');ws = /\s/,i = str.length;// 找到最后一个非空白字符while (ws.test(str.charAt(--i))){// noop}return str.slice(0, i + 1);
}

13.据说比10慢, 比11, 12快, 不过处理的字符有限(书中有误)

function trim(str) {var len = str.length;for (var i = 0; str.charCodeAt(i) <= 32; ++i) {// noop}for (var j = len - 1; j > i && str.charCodeAt(j) <= 32; j--) {// noop}return str.slice(i, j + 1);
}

jquery从版本1.4以后, 把字符\u00A0也加入了空白字符列表, 这是Prototype.js成员的发现.

总结: 最好的方案为10, 可根据需要自行选用.

参考:
* 《Javascript框架设计》(p40-p43)
* http://locutus.io/php/strings/trim/

欢迎补充指正!

js语言扩展之trim相关推荐

  1. javascript语言扩展:可迭代对象(3)

    除了前2篇文章中描述的可迭代对象以外,在js语言扩展中的生成器对象,也可以作为可迭代对象. 这里用到一个新的关键字yield,该关键字在函数内部使用,用法和return类似,返回函数中的一个值:yie ...

  2. 用C语言扩展PHP功能

    用C语言扩展PHP功能 建议读者群:熟悉c,linux,php    PHP经过最近几年的发展已经非常的流行,而且PHP也提供了各种各样非常丰富的函数. 但有时候我们还是需要来扩展PHP.比如:我们自 ...

  3. R语言扩展包dplyr——数据清洗和整理

    R语言扩展包dplyr--数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报  分类: R Programming(11)  ...

  4. ML之SVM:利用Js语言设计SVM算法(SMO算法+线性核/高斯核)

    ML之SVM:利用Js语言设计SVM算法(SMO算法+线性核/高斯核) 目录 输出结果 设计思路 设计代码(部分代码) 输出结果 设计思路 设计代码(部分代码) var doTest = functi ...

  5. ML之RF:利用Js语言设计随机森林算法【DT之CART算法(gain index)】并应用随机森林算法

    ML之RF:利用Js语言设计随机森林算法[DT之CART算法(gain index)]&并应用随机森林算法 目录 输出结果 设计思路 代码实现(部分代码) 输出结果 设计思路 代码实现(部分代 ...

  6. Python:C语言扩展

    Python:C语言扩展 (2013-05-29 14:38:02) 转载▼ 标签: 杂谈 分类:Python   没有什么比对着书敲的代码仍然出错更令人沮丧了.<Python编程入门经典> ...

  7. 用C语言扩展Python的功能的实例

    用C语言扩展Python的功能的实例 分类: C/C++ 编程技巧 Programes 2008-04-23 09:31 1232人阅读 评论(0)收藏 举报 python扩展语言cmethodsnu ...

  8. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  9. python代码用c语言封装_使用C语言扩展Python程序的简单入门指引

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型 ...

最新文章

  1. 云计算&大数据 “下一幕”智能变革之力
  2. 多个VSTO解决方案间传输变量
  3. spring cloud全家桶_阿里架构师玩转spring全家桶(实战篇),附赠3本spring电子书...
  4. java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...
  5. php curl 批量,关于用php的curl批量抓取内容
  6. 服务器操作系统分两大类,服务器的操作系统分哪几类
  7. openstack中文文档
  8. 企业中该如何防止僵尸网络的入侵?
  9. 【JWT】JWT+HA256加密 Token验证
  10. (转)基于深度组合的选股策略
  11. 非参数统计的Python实现—— Kruskal-Wallis 单因素方差分析
  12. 酒店的月收入报表java_统计报表_宾馆明细收入报表
  13. MATLAB FFT与fftshift
  14. Ubuntu12.10 GT650M 混合显卡/双显卡驱动安装
  15. android测试篇(四)android专项测试之压力测试
  16. Spark MLlib矩阵分解源码分析
  17. Cleartext HTTP traffic to xxx not permitted解决
  18. 如何建立维基百科页面(Wikipedia)
  19. 同一wifi下小米电视无法投屏
  20. 在ASF根据事件(Event)下载SAR数据

热门文章

  1. 使用adb命令操控Android手机
  2. java语言能干什么
  3. Windows安装达梦数据库(Intel CPU)
  4. Linux (CentOS) 系统下载地址
  5. 手写杀毒软件——放心的安全卫士
  6. Anaconda的卸载及安装(图文详解)
  7. 记一次fastadmin图片上传大小受限制的修改
  8. CPU、内存、缓存的关系
  9. 单点登录(4):单点登录实现(附源码)
  10. IDEA配置注释模板