70 votes

Pourquoi ne le fait pas .join() de travailler avec les arguments de la fonction?

Pourquoi ce travail (renvoie "un, deux, trois"):

var words = ['one', 'two', 'three'];
$("#main").append('<p>' + words.join(", ") + '</p>');

et ce travail (renvoie "la liste: 111"):

var displayIt = function() {
    return 'the list: ' + arguments[0];
}   
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');

mais pas cette (retours à vide):

var displayIt = function() {
    return 'the list: ' + arguments.join(",");
}   
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');

Que dois-je faire pour que mes "arguments" variable à utiliser .join() sur celui-ci?

90voto

John Feminella Points 116878

Cela ne fonctionne pas car l' arguments objet n'est pas un tableau, bien qu'il ressemble à ça. Il n'a pas d' join méthode:

>>> var d = function() { return '[' + arguments.join(",") + ']'; }
>>> d("a", "b", "c")
TypeError: arguments.join is not a function

Pour convertir arguments à un tableau, vous pouvez le faire:

var args = Array.prototype.slice.call(arguments);

Maintenant, join fonctionne:

>>> var d = function() {
  var args = Array.prototype.slice.call(arguments);
  return '[' + args.join(",") + ']';
}
>>> d("a", "b", "c");
"[a,b,c]"

Alternativement, vous pouvez utiliser du jQuery makeArray, qui tentera à son tour de "quasi-tableaux" comme arguments dans des tableaux:

var args = $.makeArray(arguments);

Voici ce que le Mozilla de référence (mon préféré de ressources pour ce genre de chose) a à dire à ce sujet:

L' arguments objet n'est pas un tableau. Il est similaire à un tableau, mais ne pas toutes les propriétés de la matrice à l'exception de length. Par exemple, il n'a pas la méthode pop. ...

L' arguments objet est disponible seulement dans un corps de fonction. La tentative de l'accès à l'objet arguments à l'extérieur d'un fonction de la déclaration de résultats dans un erreur.

21voto

CMS Points 315406

Si vous n'êtes pas intéressé sur les autres Array.prototype méthodes, et que vous voulez tout simplement à utiliser join, vous pouvez l'appeler directement, sans avoir à les convertir à un tableau:

var displayIt = function() {
    return 'the list: ' + Array.prototype.join.call(arguments, ',');
};

Aussi, vous pourriez trouver utile de savoir que la virgule est le séparateur par défaut, si vous ne définissez pas un séparateur, par spec la virgule sera utilisé.

2voto

Doug Neiner Points 34940

Suffit d'utiliser le jQuery fonction utilitaire makeArray

arguments n'est pas un Tableau, c'est un objet. Mais, depuis qu'il sorte "semblable au tableau", vous pouvez appeler le jQuery fonction utilitaire makeArray à le faire fonctionner:

var displayIt = function() {
    return 'the list: ' + $.makeArray(arguments).join(",");
}   
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');

Qui sera de sortie:

<p>the list: 111,222,333</p>

2voto

SpYk3HH Points 10533

Vous pouvez l'utiliser jQuery .joinObj Extension/Plugin que j'ai fait.

Comme vous le verrez dans ce fiddle, vous pouvez l'utiliser comme suit:

$.joinObj(args, ",");

ou

$.(args).joinObj(",");

Code Du Module:

(function(c){c.joinObj||(c.extend({joinObj:function(a,d){var b="";if("string"===typeof d)for(x in a)switch(typeof a[x]){case "function":break;case "object":var e=c.joinObj(a[x],d);e!=__proto__&&(b+=""!=b?d+e:e);break;default:"selector"!=x&&"context"!=x&&"length"!=x&&"jquery"!=x&&(b+=""!=b?d+a[x]:a[x])}return b}}),c.fn.extend({joinObj:function(a){return"object"===typeof this&&"string"===typeof a?c.joinObj(this,a):c(this)}}))})(jQuery);

1voto

Peter McG Points 6385

Vous pouvez utiliser typeof pour voir ce qui se passe ici:

>>> typeof(['one', 'two', 'three'])
"object"
>>> typeof(['one', 'two', 'three'].join)
"function"
>>> typeof(arguments)
"object"
>>> typeof(arguments.join)
"undefined"

Ici vous pouvez voir que typeof renvoie "objet" dans les deux cas, mais seulement l'un des objets a une jointure d'une fonction déterminée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X