JavaScript 应用为字符串原型调用提供奇怪的输出

JavaScript apply giving strange output for String prototype calls

本文关键字:输出 调用 应用 字符串 原型 JavaScript      更新时间:2023-09-26

当使用参数数组调用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

问题是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]);

为什么这么复杂?

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))
}