Как join() дает разные результаты в зависимости от аргументов?

Я не совсем понимаю, почему приведенный ниже вызов 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

Ответ 1

Когда вы передаете массив для test, объект arguments становится массивом массивов, а не простым массивом простых значений. Это разница между

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

а также

arguments = [1,2,3];

Когда вы вызываете .join для массива массивов, каждый внутренний массив сначала неявно приводится к строке, что приводит к '1,2,3' - значения внутренних массивов не получают .join разделителем, только непосредственные .join внешнего массива получают .join разделителем.

Ответ 2

В вашем коде у вас есть только один аргумент в первом примере, который является массивом. Присоединение к одному элементу удалит скобки:

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('_'))

Ответ 3

Первый, первый аргумент - это [1,2,3] который соединяется со вторым аргументом, который является ничем → output - это [1,2,3].toString().

Второй вызов, он фактически объединяет все 3 аргумента, что приводит к 1_2_3.

Ответ 4

Поскольку вы передаете один аргумент, который является массивом - поэтому он преобразует его в строку, а затем пытается присоединить его к другим аргументам (их нет), поэтому он просто возвращает строку.

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

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

Ответ 5

Результат другой, потому что arguments разные.

При первом вызове (test([1,2,3]) вас есть один аргумент, который является массивом. Во втором вызове у вас есть 3 аргумента, каждый из которых является числом.

Array.prototype.join предназначен для Array.prototype.join поверх массивов. Будет приведен в соответствие каждый из элементов в массиве.

В вашем первом случае ваши аргументы "массив" имеют только один член, который является самим массивом. Этот аргумент будет строковым. Массив stringfied становится именно тем, что зарегистрировано в вашем коде.

Ответ 6

В первом примере вы вызываете не .join для массива, а для arguments. Эта переменная будет заполнена массивоподобным объектом, у которого массив является первым индексом, по сути, вы вызываете эквивалент:

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

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