Как 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("_"));