我在字符串上调用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")
);