为什么不将`''。。(简单)直接传递给`[] .map()`的回调工作?

时间:2012-02-16 00:53:33

标签: javascript

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

我认为[].map()使用''.trim()会有效...

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

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

  

TypeError:String.prototype.trim调用null或undefined

jsFiddle

我在数组中看不到任何nullundefined值。

我在Chrome 17中定义了

String.prototype.trim()Array.prototype.map()

为什么这不起作用?我觉得我忽略了一些显而易见的事情。

我意识到我可以在那里循环或删除一个函数。然而,这不是这个问题的重点。

4 个答案:

答案 0 :(得分:33)

@Slace所说的是正确的解释。 @ ThomasEding的答案也有效,但有一个可怕的无效,它可能在一个循环中创建函数,即not a good thing to do

另一种做法是(reference here)

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

标准浏览器免责声明:这适用于Function.prototype.callString.prototype.trim适用的任何地方,对于旧浏览器,您可以轻松地将trim替换为{{3}像这样:

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

更新:Interstingly,虽然这在Chrome中效果最快,但@ ThomasEding的方法在IE10和FF20中的运行速度稍快 - polyfill

答案 1 :(得分:25)

这是因为没有使用正确的trim上下文调用this。请记住,this是动态绑定在JS中的。您必须创建一个包装器以传递给trim以正确绑定this

[' a', ' b   ', 'c'].map(function (str) {
  return str.trim();
});

答案 2 :(得分:19)

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

答案 3 :(得分:3)

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

[' hello  ', '  world'].map(str => str.trim());