为什么字符串连接应用不能按预期工作



我在字符串上调用concat(),如下所示:

> "1".concat("2","3")
< "123"

现在,我想为我有一个字符串数组来连接 togther 的情况执行此操作。 但它并没有达到我的期望:

> "1".concat.apply(["2","3"])
< "2,3"

不仅缺少第一个元素,而且在传递的两个元素之间插入了一个逗号,就像它将 apply 中的参数转换为字符串然后返回它一样。

如何使用申请? 我不能使用String.prototype.concat.apply因为第一个参数实际上是一个变量,可以是字符串或数组。 我宁愿不做一些可怕的黑客,我必须检测类型,然后为参数可能的每个可能类型提供一个单独的语句。

需要明确的是,我正在尝试实现一个函数concat()该函数适用于任何有意义的第一个参数类型(例如字符串或数组(。 到目前为止,它看起来像这样,但不起作用:

function concat(x) {
    var args = Array.prototype.slice.call(arguments,1)
    return x.concat.apply(args)
}

apply的第一个参数是上下文,它必须是字符串。你会使用

const arr = ["2","3"];
console.log("1".concat(...arr));
console.log(String.prototype.concat.apply("1", arr));
console.log("".concat.apply("1", arr));

在您的特定情况下,我建议使用 rest/spread 语法:

function concat(x, ...args) {
    return x.concat(...args);
}

或在 ES5 中

function concat(x) {
    var args = Array.prototype.slice.call(arguments, 1);
    return x.concat.apply(x, args);
//                        ^
}

在JavaScript中使用本机函数时,我建议先阅读MDN。

通过调用"1".concat,您可以获得字符串对象的原始函数,从而丢失上下文。如果要使用 apply 调用函数,第一个参数是函数用作其this对象或上下文的对象。

所以"1".concat.apply(["2", "3"])在语义上等同于(""+["2", "3"]).concat()

我想你想做的是以下几点:

var unboundConcat = String.prototype.concat;
return unboundConcat.apply("1", ["2", "3"]);

使用原型String.prototype并使用函数 .join() 连接数组值。

console.log(String.prototype.concat("1", ["2","3"].join('')))

如果你想根据

String 或 Array 原型使用 concat,你可以使用 Object.getPrototypeOf((

var stringOrArray = "1"
   
console.log(Object.getPrototypeOf(stringOrArray).concat.apply(stringOrArray, ["2","3"]))
stringOrArray = ["1", "5"]
   
console.log(Object.getPrototypeOf(stringOrArray).concat.apply(stringOrArray, ["2","3"]))

apply的第一个参数是上下文,或this

在 ES6 中:

  • aORs = 数组或字符串
  • concatWith = 您要连接数组或字符串的内容

    let concat = (aORs) => (concatWith) => aORs.concat(concatWith);

let concat = (aORs) => (concatWith) => aORs.concat(concatWith);
console.log(
  concat(["a", "b"])(1)
); 
//["a", "b", 1]
console.log(
  concat("1")(" 2")
);
// "1 2"

ES5

function concat(aORs) {
 return function(concatWith) {
   return aORs.concat(concatWith);
 }
}

function concat(aORs) {
  return function(concatWith) {
    return aORs.concat(concatWith);
  }
}
console.log(
  concat("1")("abc")
);
console.log(
  concat([1, 2, 3])("abc")
);

相关内容

  • 没有找到相关文章

最新更新