2016-06-30 3 views
2

Code A, c'est OK et les journaux [ 1, 2, 3 ]Pourquoi les arguments var a = ... échouent-ils, si console.log (... arguments) est OK?

function fn() { 
    console.log(...arguments); 
} 

fn([1, 2, 3]); 

Code B, cela ne fonctionne pas avec SyntaxError: Unexpected token ... En outre, l'emballage ...arguments dans () ne va pas aider non plus.

function fn() { 
    var a = ...arguments; 
} 

fn([1, 2, 3]); 

Dans les deux cas, je suppose, nous avons une RHS recherche. Pourquoi est-il correct de transmettre ...arguments à console.log (ou une autre fonction), mais de ne pas l'attribuer à une variable?

PS. Je sais que cela ne résiderait jamais dans le vrai code de la vie ou qu'il y a d'autres meilleures solutions à cela. Ma question est purement théorique/conceptuelle et se limite à comprendre pourquoi le comportement différent se produit.

+0

tu ne peux pas affecter à 'a' sans' ... '? 'var a = arguments [0]; // Votre tableau'. – Arg0n

+0

@ Arg0n Bien sûr, comme je l'ai noté, ce n'est pas un problème réel dans les logiciels réels. J'ai été étonné de voir pourquoi '' '... arguments''' est passé à' '' console.log''' en tant que tableau (sans avoir besoin d'envelopper dans '' '[]' '' '), quand le l'affectation nécessite explicitement '' '' [] '' 'pour que cela fonctionne. –

Répondre

3

Les deux les applications de l'opérateur de propagation sont:

  1. articles à son tour d'une valeur itérables en arguments d'une fonction d'appel
  2. articles tour d'un itérable en éléments d'un tableau

Alors cela fonctionne:

function fn() { 
    var a = [...arguments]; 
} 
+0

@DrunkenMaster Essayez de l'appeler ainsi: 'fn (1, 2, 3);' c'est ainsi que fonctionnent les paramètres reposants. Vous ne fournissez qu'un seul paramètre (un tableau). Vous pouvez aussi faire ceci: 'fn ([1, 2, 3], [4, 5, 6]); // a = [[1, 2, 3], [4, 5, 6]] '. – Arg0n

+0

vraiment cela devrait utiliser un paramètre d'étalement tho. 'function fn (... a) {...}' réalise exactement la même chose que votre fonction, mais sans la méchante magie 'arguments' – naomik

1

Il ne fonctionne pas comme dans CODE B ... Syntaxe incorrecte

Vous pouvez propager dans fn params comme

function fn(...params) 
{ 
    ... 
} 

ou Array et Object

var a = [1,2,3,4,5], 
b = [6,...a]; 

var x = {a:1,b:1}, 
y = {c:1,...x}