String.prototype.trim = function() {
var str = this.replace(/^\s+/, ""),
end = str.length - 1,
ws = /\s/;
while (ws.test(str.charAt(end))) {
end--;
}
return str.slice(0, end + 1);
}
解析:
使用正则表达式/^\s*/匹配字符串开始的空格,没有空跑的问题,所以选择正则匹配;
使用/\s*$/匹配字符串结尾空格,如果字符串较长,那么效率会比较低下,因为正则表达式需要从头开始扫描字符,直到确定了最后一个字符匹配位置$,才能最终匹配完成,某些浏览器做了优化,但是跨浏览性不好,性能不稳定~
鉴于上述原因,结尾使用字符串剪裁,不受长度影响。但是在结尾有长的空格时,仍然具有性能弱点。综合看,假如字符串含有一两个空格,这种方案巨快!但是代码略长,关于使用正则检测字符串结尾字符的解释,原书是这么写的:“请注意,此方案在循环中使用正则表达式检测字符串尾部的字符是否空格,尽管使用正则表达式增加了一点性能负担,但它允许你根据浏览器定义空格字符列表,以保持简短和兼容性”
下面写出最通用,性能最稳定版本,也是最容易想到的版本:
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/, "");
}
}
我个人觉得如果特别严格的需求,定制自己的trim逻辑,否则就按最简单的来~是不是感觉白说了,是的,瞎- -