L' arguments
objet en JavaScript est une verrue étrange - il agit comme un tableau dans la plupart des situations, mais ce n'est pas en fait un objet tableau. Comme il est vraiment tout autre chose , il ne possède pas les fonctions utiles à partir Array.prototype
comme forEach
, sort
, filter
et map
.
Il est très simple de construire un nouveau tableau à partir d'un objet arguments avec une simple boucle for. Par exemple, cette fonction trie ses arguments:
function sortArgs() {
var args = [];
for (var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
return args.sort();
}
Cependant, c'est une chose plutôt pitoyable à faire simplement pour avoir accès aux fonctions de tableau JavaScript extrêmement utiles. Existe-t-il un moyen intégré de le faire en utilisant la bibliothèque standard?
javascript
arrays
sorting
arguments
variadic-functions
Andrew Coleson
la source
la source
Réponses:
ES6 utilisant les paramètres de repos
Si vous pouvez utiliser ES6, vous pouvez utiliser:
Paramètres de repos
Comme vous pouvez le lire dans le lien
Si vous êtes curieux de connaître la
...
syntaxe, elle s'appelle Spread Operator et vous pouvez en lire plus ici .ES6 utilisant Array.from ()
Utilisation de Array.from :
Array.from
convertissez simplement les objets de type tableau ou itérables en instances de tableau.ES5
Vous pouvez en fait simplement utiliser
Array
laslice
fonction de sur un objet arguments, et il le convertira en un tableau JavaScript standard. Vous n'aurez qu'à le référencer manuellement via le prototype d'Array:Pourquoi ça marche? Eh bien, voici un extrait de la documentation ECMAScript 5 elle - même :
Par conséquent,
slice
fonctionne sur tout ce qui a unelength
propriété, ce qui estarguments
pratique.Si
Array.prototype.slice
c'est trop de bouchée pour vous, vous pouvez l'abréger légèrement en utilisant des littéraux de tableau:Cependant, j'ai tendance à penser que l'ancienne version est plus explicite, donc je la préférerais à la place. Abuser de la notation littérale du tableau semble hacky et semble étrange.
la source
0
sert? Puisqu'il n'y a aucun argument que vous voulez passer, pourquoi ne pouvez-vous pas simplement utiliservar args = Array.prototype.slice.call(arguments);
? [ La page des arguments MDC ] ( developer.mozilla.org/en/JavaScript/Reference/… ) suggère la méthode sans le0
.function sortArgs(...argsToSort) { return argsToSort.sort(); }
de MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Cela vaut également la peine de référencer cette page wiki de bibliothèque de promesses Bluebird qui montre comment gérer l'
arguments
objet dans un tableau d'une manière qui rend la fonction optimisable sous le moteur JavaScript V8 :Cette méthode est utilisée en faveur de
var args = [].slice.call(arguments);
. L'auteur montre également comment une étape de construction peut aider à réduire la verbosité.la source
Certaines méthodes de tableau sont intentionnellement conçues pour ne pas exiger que l'objet cible soit un tableau réel. Ils nécessitent uniquement que la cible ait une propriété nommée longueur et indices (qui doivent être zéro ou des entiers plus grands).
la source
Utilisation:
Array(arg1, arg2, ...)
Retour[arg1, arg2, ...]
Array(str1)
Retour[str1]
Array(num1)
renvoie un tableau contenant desnum1
élémentsVous devez vérifier le nombre d'arguments!
Array.slice
version (plus lente):Array.push
version (plus lente, plus rapide que la tranche):Déplacer la version (plus lente, mais la petite taille est plus rapide):
Array.concat
version (la plus lente):la source
Si vous utilisez jQuery, ce qui suit est beaucoup plus facile à retenir à mon avis:
la source
Dans ECMAScript 6, il n'est pas nécessaire d'utiliser de vilains hacks comme
Array.prototype.slice()
. Vous pouvez à la place utiliser la syntaxe étendue (...
) .Cela peut sembler étrange, mais c'est assez simple. Il extrait simplement
arguments
les éléments et les remet dans le tableau. Si vous ne comprenez toujours pas, consultez ces exemples:Notez que cela ne fonctionne pas dans certains navigateurs plus anciens comme IE 11, donc si vous voulez prendre en charge ces navigateurs, vous devez utiliser Babel .
la source
Voici une référence de plusieurs méthodes de conversion d'arguments en tableau.
Quant à moi, la meilleure solution pour une petite quantité d'arguments est:
Pour les autres cas:
la source
sortArgs
est 6 fois plus rapide dans Firefox, mais deux fois plus lent dans le dernier Chrome, par rapport àArray.apply
.Je recommande d'utiliser l' opérateur de propagation ECMAScript 6 , qui liera les paramètres de fin à un tableau. Avec cette solution, vous n'avez pas besoin de toucher l'
arguments
objet et votre code sera simplifié. L'inconvénient de cette solution est qu'elle ne fonctionne pas sur la plupart des navigateurs, vous devrez donc utiliser un compilateur JS tel que Babel. Sous le capot, Babel se transformearguments
en un tableau avec une boucle for.Si vous ne pouvez pas utiliser un ECMAScript 6, je vous recommande de regarder certaines des autres réponses telles que @Jonathan Fingland
la source
Lodash:
en action:
produit:
la source
_.toArray
?_.toArray
est plus approprié.Use
Array.from()
, qui prend un objet de type tableau (tel quearguments
) comme argument et le convertit en tableau:Notez que cela ne fonctionne pas dans certains navigateurs plus anciens comme IE 11, donc si vous voulez prendre en charge ces navigateurs, vous devez utiliser Babel .
la source
la source
Une autre réponse.
Utilisez des sorts de magie noire:
Firefox, Chrome, Node.js, IE11 sont OK.
la source
__proto__
est obsolète. Voir les documents MDN .Essayez d'utiliser
Object.setPrototypeOf()
Explication: Ensemble
prototype
dearguments
àArray.prototype
Explication: Prenez chaque index de
arguments
, placez l'élément dans un tableau à l'index correspondant du tableau.pourrait également utiliser
Array.prototype.map()
Explication: Prenez chaque index de
arguments
, placez l'élément dans un tableau à l'index correspondant du tableau.for..of
boucleou
Object.create()
Explication: créer un objet, définir les propriétés de l'objet sur des éléments à chaque index de
arguments
; ensembleprototype
d'objet créé àArray.prototype
la source
Object.setPrototypeOf
prévient qu'il s'agit d'une "opération très lente". Pourquoi diable utiliserais-je celaArray.prototype.slice.call
?Voici une solution propre et concise:
Object.values( )
renverra les valeurs d'un objet sous forme de tableau, et puisqu'ilarguments
s'agit d'un objet, il se convertira essentiellementarguments
en tableau, vous fournissant ainsi toutes les fonctions d'assistance d'un tableau telles quemap
,forEach
,filter
, etc.la source
Méthodes Benshmarck 3:
RÉSULTAT?
Prendre plaisir !
la source
arguments.length == 1?[arguments[0]]:Array.apply(null, arguments);
pour empêcher que la fonction ne soit appelée avec un seul argument entierdummyFn(3)
et provoque un résultat[,,]
dummyFn(3)
c'est quoi? cette fonction n'existe pas ...la source
Bien que les paramètres de repos fonctionnent bien, si vous souhaitez continuer à utiliser
arguments
pour une raison quelconque, envisagez[...arguments]
peut être considéré comme une sorte d'alternative àArray.from(arguments)
, qui fonctionne également parfaitement bien.Une alternative ES7 est une compréhension de tableau:
Cela peut être plus simple si vous souhaitez traiter ou filtrer les arguments avant le tri:
la source
J'ai essayé une technique de destruction simple
la source
L'objet Arguments n'est disponible qu'à l'intérieur d'un corps de fonction. Bien que vous puissiez indexer l'objet Arguments comme un tableau, il ne s'agit pas d'un tableau. Il n'a pas de propriétés de tableau autres que la longueur.
Bien qu'il puisse être indexé comme un tableau comme vous pouvez le voir dans cet exemple:
Cependant, l'objet Arguments n'est pas un tableau et n'a pas d'autres propriétés que la longueur.
Vous pouvez convertir l'objet arguments en un tableau auquel point vous pouvez accéder à l'objet arguments.
Il existe de nombreuses façons d'accéder à l'objet arguments à l'intérieur d'un corps de fonction, notamment:
Array.prototype.slice.call (arguments)
[] .slice.call (arguments).
la source
Vous pouvez créer une fonction réutilisable pour le faire avec n'importe quel argument, le plus simple est quelque chose comme ceci:
La syntaxe de propagation peut être utilisée dans ES6 et au-dessus ...
Mais si vous souhaitez utiliser quelque chose de compatible avec ES5 et les versions antérieures , vous pouvez l'utiliser
Array.prototype.slice.call
, donc votre code ressemble à ceci:Il existe également quelques autres façons de le faire, par exemple en utilisant
Array.from
ou en boucle les arguments et en les affectant à un nouveau tableau ...la source
C'est une très vieille question, mais je pense avoir une solution légèrement plus facile à taper que les solutions précédentes et qui ne s'appuie pas sur des bibliothèques externes:
la source
Array.apply
ne fonctionnera pas si vous n'avez qu'un seul argument entier positif. C'est parce quenew Array(3)
crée une longueur de tableau de3
. Pour être plus précis, le résultat sera[undefined, undefined, undefined]
et non[3]
.