使用参数数组调用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>
答案 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))
}