【发布时间】:2016-05-15 04:56:43
【问题描述】:
什么是从字符串中去除前导和尾随空格的干净高效的 JavaScript 实现?
例如:
" dog"
"dog "
" dog "
" dog "
全部变成
"dog"
【问题讨论】:
-
@Gumbo:trim 有点新,可能不支持跨浏览器。不知道,但你永远无法判断跨浏览器支持。
标签: javascript trim strip
什么是从字符串中去除前导和尾随空格的干净高效的 JavaScript 实现?
例如:
" dog"
"dog "
" dog "
" dog "
全部变成
"dog"
【问题讨论】:
标签: javascript trim strip
来自MDN 的更好的polyfill,支持删除BOM 和NBSP:
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}
请记住,修改内置原型会带来性能损失(由于 JS 引擎放弃了许多运行时优化),并且在性能关键的情况下,您可能需要考虑替代定义 myTrimFunction(string) .话虽如此,如果您的目标是不支持原生 .trim() 的旧环境,您可能需要处理更重要的性能问题。
【讨论】:
对于jquery用户,$.trim(s)怎么样
【讨论】:
如果您已经在使用 jQuery,那么您可能想看看 jQuery 已经提供的jQuery.trim()。
【讨论】:
Gumbo 已经在评论中指出了这一点,但作为答案需要重复:trim() 方法是在 JavaScript 1.8.1 中添加的,并且被所有现代浏览器(Firefox 3.5+、IE 9、Chrome 10、Safari)支持5.x),虽然 IE 8 和更早版本不支持它。用法很简单:
" foo\n\t ".trim() => "foo"
另见:
【讨论】:
如果您不是编写新代码来修剪字符串,而是查看调用“strip()”的现有代码并想知道它为什么不起作用,您可能想检查它是否尝试包含类似prototypejs 框架,并确保它确实被加载了。
该框架为所有 String 对象添加了一个 strip 函数,但如果例如你升级了它,你的网页仍然引用旧的 .js 文件,它当然不能工作。
【讨论】:
使用这个:
if(typeof(String.prototype.trim) === "undefined")
{
String.prototype.trim = function()
{
return String(this).replace(/^\s+|\s+$/g, '');
};
}
trim 函数现在可以作为字符串上的一流函数使用。例如:
" dog".trim() === "dog" //true
编辑:接受 J-P 的建议,将正则表达式模式合并为一个。还根据 Christoph 的建议添加了全局修饰符。
在重新创建它之前,采用了 Matthew Crumley 关于嗅探修剪功能的想法。这是在客户端使用的 JavaScript 版本更新并因此具有自己的本机修剪功能的情况下完成的。
【讨论】:
trim() 必须将this 转换为字符串类型,即您必须将this.replace(...) 更改为String(this).replace(...) 或('' + this).replace(...);这允许将call() 或apply() 函数转换为非字符串值
trim(),例如 String.prototype.trim.apply(42) 或 MyObj.prototype.trim = String.prototype.trim; new MyObj().trim();
/\s/ 不会删除 ES3 规范定义的所有空白字符。我最近写了关于浏览器处理/\s/ - thinkweb2.com/projects/prototype/whitespace-deviations 的方式以及如何解决它。
replace(/^\s+/, '').replace(/\s+$/, '');) 在许多浏览器中实际上稍微快一些,因此您不应该出于性能考虑而选择单正则表达式版本。选择你觉得更易读的那个。
Steven Levithan 曾经写过如何实现Faster JavaScript Trim。绝对值得一看。
【讨论】:
这是我使用的函数。
function trim(s){
return ( s || '' ).replace( /^\s+|\s+$/g, '' );
}
【讨论】: