为什么不能直接将 `''.trim()` 传递给 `[].map()` 的回调函数?

问题描述 投票:0回答:4

我有一个字符串数组。我想修剪数组中的每个字符串。

我认为将

[].map()
''.trim()
一起使用会起作用...

[' a', ' b   ', 'c'].map(String.prototype.trim);

...但我的控制台说...

TypeError:String.prototype.trim 调用为 null 或未定义

jsFiddle.

我在数组中看不到任何

null
undefined
值。

String.prototype.trim()
Array.prototype.map()
是在 Chrome 17 中定义的,我正在用它来测试。

为什么这不起作用?我感觉我忽略了一些明显的事情。

我意识到我可以在其中循环或删除一个函数。但这不是这个问题的重点。

javascript
4个回答
35
投票

@Slace 所说的是正确的解释。 @ThomasEding 的答案也有效,但有一个可怕的低效率,它可能在循环内创建函数,这不是一件好事

另一种做法是(参考此处)

[' a', ' b   ', 'c'].map(Function.prototype.call, String.prototype.trim);  
// gives ["a", "b", "c"]

标准浏览器免责声明:这将在

Function.prototype.call
String.prototype.trim
可以工作的地方工作,对于较旧的浏览器,您可以轻松地用
polyfill
替换 trim,如下所示:

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

更新:有趣的是,虽然这在 Chrome 中运行速度最快,但 @ThomasEding 的方法在 IE10 和 FF20 中运行速度稍快 - http://jsperf.com/native-trim-vs-regex-trim-vs-mixed


25
投票

SO是一场狗屎秀。感谢您的搭车。


20
投票

trim
位于
String
原型上,这意味着它期望
this
上下文是字符串的上下文,而
map
上的
Array
方法提供当前数组项作为第一个参数,并且
 this
上下文是全局对象。


3
投票

使用 ES6 语法,就可以像这样简单:

[' hello  ', '  world'].map(str => str.trim());
© www.soinside.com 2019 - 2024. All rights reserved.