我不太明白为什么下面的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会返回逗号分隔的值?
答案 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
用于在数组上调用。它将字符串化数组中的每个项目。
在您的第一种情况下,参数“数组”只有一个成员,它本身就是数组。此参数将被置为字符串。字符串化数组将完全成为您代码中记录的内容。