想要修剪数组中的每个字符串,例如,给定
x = [' aa ', ' bb '];
产量
['aa', 'bb']
我的第一次试验是
x.map(String.prototype.trim.apply)
它得到了“TypeError:Function.prototype.apply在undefined上调用,这是一个未定义的而不是函数”在chrome中 .
然后我试了一下
x.map(function(s) { return String.prototype.trim.apply(s); });
有用 . 有什么不同?
11 回答
String.prototype.trim.apply
是Function.prototype.apply method,不受trim
的约束 . map将使用字符串,索引和数组作为参数调用它,而thisArg则不调用任何内容(undefined
) - 但是,apply
期望在函数上调用:你可以做的是传递
trim
函数作为call
的上下文:这里发生的是
或者这可以通过箭头功能解决:
如果您正在使用JQuery,那么更好的方法是这样做,因为它也适用于IE8(我需要支持IE8)是这样的:
首先,简单地做到:
然后,第一个不起作用的原因是字符串作为参数传递给回调,而不是作为上下文 . 当您没有将参数传递给
apply
时,您会得到与之相同的消息现在,主要是为了好玩,让's suppose you'对
map
以这种方式使用回调的事实感到不满意,并且你希望能够使用上下文传递函数,而不是参数 .然后你可以这样做:
我说“主要是为了好玩”,因为修改你不拥有的对象(这里是Array的原型)被广泛认为是一种不好的做法 . 但是你也可以创建一个实用函数,将数组和回调作为参数 .
没有依赖关系的简单变体:
ES6变体:
ES6功能变体:
我只是比较了修剪字符串数组的一些方法,以获得最短和最快的方法 . 谁有兴趣,这里是对jsperf的性能测试:http://jsperf.com/trim-array-of-strings
注意:jQuery就是在这里比较要键入的字符数;)
从Bergi的影响's perfect answer, i just would like to add, for those methods which won' t采取
this
参数,您可以完成以下相同的工作;保持简单和愚蠢:
代码
输出
所有主流浏览器都支持
forEach()
,但请注意IE
仅从版本9开始支持它 .Another ES6 alternative