javascript - Wie erzeugt join() abhängig von den Argumenten unterschiedliche Ergebnisse?




arrays function (4)

Da Sie ein Argument übergeben, das ein Array ist, konvertiert es es in eine Zeichenfolge und versucht dann, es mit den anderen Argumenten zu verknüpfen (es gibt keine), sodass es nur die Zeichenfolge zurückgibt.

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

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

Sie können dieses Problem lösen, indem Sie prüfen, ob nur ein Argument übergeben wurde.

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));

Ich kann nicht genau verstehen, warum der Aufruf von join () je nach Art der angegebenen Argumente unterschiedliche Ergebnisse liefert.

Folgendes habe ich gefunden:

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

Sollte ein gegebener Join (Argumente, '_') nicht in beiden obigen Tests eine durch _ Zeichenfolge erzeugen? Warum gibt # 1 stattdessen einen durch Kommas getrennten Wert zurück?


Das Ergebnis ist unterschiedlich, weil die arguments unterschiedlich sind.

Beim ersten Aufruf ( test([1,2,3]) haben Sie ein Argument, das ein Array ist. Beim zweiten Aufruf haben Sie 3 Argumente, von denen jedes eine Zahl ist.

Array.prototype.join soll über Arrays aufgerufen werden. Es wird jedes der Elemente im Array stringifizieren.

In Ihrem ersten Fall haben Ihre Argumente "array" nur ein Element, nämlich ein Array. Dieses Argument wird mit einem String versehen. Ein Array-String wird genau zu dem, was in Ihrem Code protokolliert wird.


Im ersten Beispiel rufen Sie .join für das Array auf, sondern für arguments . Diese Variable wird mit einem Array-ähnlichen Objekt gefüllt, das ein Array als ersten Index enthält. Im Wesentlichen nennen Sie das Äquivalent von:

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

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

anstelle dessen, was Sie im zweiten Beispiel tun (das Äquivalent von):

let myArguments = [1, 2, 3];

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


In Ihrem Code haben Sie im ersten Beispiel nur ein Argument, nämlich ein Array. Wenn Sie ein einzelnes Element verbinden, werden die Klammern entfernt:

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

Eine andere Möglichkeit, dies zu betrachten, besteht darin, ein anderes Array als Argument für test() :

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

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





function