JavaScript适用于为String原型调用提供奇怪的输出

时间:2016-02-09 06:36:57

标签: javascript oop

使用参数数组调用String.prototype函数时,我会遇到意外行为。

'foo'.concat.apply(this, ['bar','faz']);
//actual=> [object global]barfaz
//expected=> foobarfaz

'foo'.repeat.apply(this, [3]);
//actual=> [object global][object global][object global]
//expected=> foofoofoo


我只收到原型函数调用的这些问题,这些函数调用的参数我用apply调用:

'FOO'.toLowerCase();
//actual & expected=> foo


我试图在没有apply的情况下手动传入参数,但在我的最终代码中,我需要apply参数的数组,所以似乎无法绕过apply。< / p>

2 个答案:

答案 0 :(得分:5)

问题是this在被调用时是解析的,而不是在方法内部访问时。在这种情况下,this正在解析global对象。此外,调用这些方法的对象变得无关紧要,因为apply的第一个参数设置了方法中的this值。

而是将字符串作为第一个参数传递。

String.prototype.concat.apply('foo', ['bar','faz']);

String.prototype.repeat.apply('foo', [3]);

执行此操作的替代方法:

''.concat.apply('foo', ['bar','faz']);

''.repeat.apply('foo', [3]);

答案 1 :(得分:-1)

为什么这么复杂?

var a = "foo", b = ["bar", "baz"];
a + b.join("");

或作为一种功能

//a utility
function string(v){ return v == null? "": String(v) };

function stringconcat(a,b){
  return (Array.isArray(a)? a.join(""): string(a))+
    (Array.isArray(b)? b.join(""): string(b))
}