JavaScript trim函数大赏
实现1String.prototype.trim function() {returnthis.replace(/^\s\s*/,).replace(/\s\s*$/,);}看起来不怎么样动用了两次正则替换实际速度非常惊人主要得益于浏览器的内部优化。一个著名的例子字符串拼接直接相加比用Array做成的StringBuffer还快。base2类库使用这种实现。实现2String.prototype.trim function() {returnthis.replace(/^\s/,).replace(/\s$/,);}和实现1很相似但稍慢一点主要原因是它最先是假设至少存在一个空白符。Prototype.js使用这种实现不过其名字为strip因为Prototype的方法都是力求与Ruby同名。实现3String.prototype.trim function() {returnthis.substring(Math.max(this.search(/\S/), 0),this.search(/\S\s*$/) 1);}以截取方式取得空白部分当然允许中间存在空白符总共调用了四个原生方法。设计得非常巧妙substring以两个数字作为参数。Math.max以两个数字作参数search则返回一个数字。速度比上面两个慢一点但比下面大多数都快。实现4String.prototype.trim function() {returnthis.replace(/^\s|\s$/g,);}这个可以称得上实现2的简化版就是利用候选操作符连接两个正则。但这样做就失去了浏览器优化的机会比不上实现3。由于看来很优雅许多类库都使用它如JQuery与mootools实现5String.prototype.trim function() {varstr this;str str.match(/\S(?:\s\S)*/);returnstr ? str[0] :;}match是返回一个数组因此原字符串符合要求的部分就成为它的元素。为了防止字符串中间的空白符被排除我们需要动用到非捕获性分组?:exp。由于数组可能为空我们在后面还要做进一步的判定。好像浏览器在处理分组上比较无力一个字慢。所以不要迷信正则虽然它基本上是万能的。实现6String.prototype.trim function() {returnthis.replace(/^\s*(\S*(\s\S)*)\s*$/,$1);}把符合要求的部分提供出来放到一个空字符串中。不过效率很差尤其是在IE6中。实现7String.prototype.trim function() {returnthis.replace(/^\s*(\S*(?:\s\S)*)\s*$/,$1);}和实现6很相似但用了非捕获分组进行了优点性能效之有一点点提升。实现8String.prototype.trim function() {returnthis.replace(/^\s*((?:[\S\s]*\S)?)\s*$/,$1);}沿着上面两个的思路进行改进动用了非捕获分组与字符集合用?顶替了*效果非常惊人。尤其在IE6中可以用疯狂来形容这次性能的提升直接秒杀火狐。实现9String.prototype.trim function() {returnthis.replace(/^\s*([\S\s]*?)\s*$/,$1);}这次是用懒惰匹配顶替非捕获分组在火狐中得到改善IE没有上次那么疯狂。实现10String.prototype.trim function() {varstr this,whitespace \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000;for(vari 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;}}returnwhitespace.indexOf(str.charAt(0)) -1 ? str :;}我只想说搞出这个的人已经不是用牛来形容已是神一样的级别。它先是把可能的空白符全部列出来在第一次遍历中砍掉前面的空白第二次砍掉后面的空白。全过程只用了indexOf与substring这个专门为处理字符串而生的原生方法没有使用到正则。速度快得惊人估计直逼上内部的二进制实现并且在IE与火狐其他浏览器当然也毫无疑问都有良好的表现。速度都是零毫秒级别的。实现11String.prototype.trim function() {varstr this,str str.replace(/^\s/,);for(vari str.length - 1; i 0; i--) {if(/\S/.test(str.charAt(i))) {str str.substring(0, i 1);break;}}returnstr;}