join()如何根据参数产生不同的结果?

时间:2019-06-17 07:54:11

标签: javascript function

我不太明白为什么下面的join()调用会根据提供的参数类型产生不同的结果。

这是我发现的东西:

var test = function() {
  var args = Array.prototype.join.call(arguments,"_");
  return args
};

console.log(test([1,2,3])) // #1: returns 1,2,3
console.log(test(1,2,3)) // #2: returns 1_2_3

给出join(arguments,'_'),是否应该在上面的两个测试中都生成一个_分隔的字符串?为什么#1会返回逗号分隔的值?

6 个答案:

答案 0 :(得分:12)

将数组传递给test时,arguments对象将成为数组数组,而不是普通值的普通数组。两者之间的区别

arguments = [[1,2,3]];

arguments = [1,2,3];

在数组数组上调用.join时,每个内部数组首先隐式地强制转换为字符串,从而产生'1,2,3'-内部数组的值 not 由定界符得到.join,只有外部数组的直接子集才由定界符.join

答案 1 :(得分:5)

在您的代码中,第一个示例中只有一个参数,即数组。加入单个元素将删除括号:

var test = function() {
  var args = Array.prototype.join.call(arguments,"_");
  return args
};

console.log(test([1,2,3])) // args = [[1,2,3]]
console.log(test(1,2,3)) // args = [1,2,3]

console.log([[1,2,3]].join('_'))
console.log([1,2,3].join('_'))

查看此问题的另一种方法是提供另一个数组作为test()的参数:

var test = function() {
  var args = Array.prototype.join.call(arguments,"_");
  return args
};

console.log(test([1,2,3], [4,5,6]))

答案 2 :(得分:4)

在第一个示例中,您不是在 array 上调用.join,而是在arguments上调用。该变量将填充一个类似数组的对象,该对象具有一个数组作为第一个索引,从本质上讲,您正在调用等效项:

let myArguments = [[1, 2, 3]];

console.log(myArguments.join("_"));

代替第二个示例中的操作:

let myArguments = [1, 2, 3];

console.log(myArguments.join("_"));

答案 3 :(得分:3)

第一个参数,第一个参数是[1,2,3],第二个参数不带任何参数,->输出是[1,2,3].toString()

第二次调用,它实际上是连接所有3个参数,从而导致输出1_2_3

答案 4 :(得分:3)

因为您要传递一个作为数组的参数-因此它将其转换为字符串,然后尝试将其连接到其他参数(没有参数),因此仅返回字符串。

var test = function() {
  var args = Array.prototype.join.call(arguments, "_");
  return args
};

console.log(test([1, 2, 3]));
console.log(test(1, 2, 3));

您可以通过检查是否仅传递了一个参数来解决此问题。

var test = function() {
  var args = arguments.length == 1 ? arguments[0].join("_") : Array.prototype.join.call(arguments, "_");
  return args;
};

console.log(test([1, 2, 3]));
console.log(test(1, 2, 3));

答案 5 :(得分:3)

结果不同,因为arguments不同。

在第一次调用(test([1,2,3])时,您有一个参数,它是一个数组。 在第二个调用中,您有3个参数,每个参数都是一个数字。

Array.prototype.join用于在数组上调用。它将字符串化数组中的每个项目。

在您的第一种情况下,参数“数组”只有一个成员,它本身就是数组。此参数将被置为字符串。字符串化数组将完全成为您代码中记录的内容。