2012-05-14 7 views
6

je sais en javascriptx = y + z + = en Javascript

x = y = z signifie x = z et y = z

x+=z signifie x=x+z;

Donc, si je veux x=x+z et y=y+z, j'ai essayé x+=y+=z ne fonctionne pas

quelqu'un a une meilleure idée d'écrire du code court au lieu x+=z;y+=z

EDIT

d'abord merci pour tout le monde dans mon question. Ici, je veux expliquer quelque chose pourquoi j'ai cette question à la première place. J'ai essayé d'écrire du code comme x+='some html code' et j'ai besoin de y+='the same html code'. Donc, naturellement, je ne veux pas créer un autre var z='the html code d'abord puis faire x+=z et y+=z

Espérons que mon explication a un sens. Quoi qu'il en soit, je vais clore cette question maintenant. Merci encore.

+29

Parfois, il est préférable de ne pas essayer de compresser tout en une seule ligne de code, mais écrire quelques symboles plus et de garder la lisibilité ... – Christoph

+13

obscurcissement Saint, Batman! Utilisez juste 'x + = z' et' y + = z'. – JJJ

+7

Vous effectuez deux missions. Pourquoi ne pas être explicite à ce sujet? Quel est le besoin de _short code_? –

Répondre

20

En supposantplus et pas concaténation, cela fonctionne:

x -= y - (y += z); 

mais sérieusement, ne pas utilisez-le!


Pour ceux qui veulent comprendre comment , la séquence d'évaluation (où j'utilise n pour afficher le résultat intermédiaire actuel) est d'environ:

n = y1 = y0 + z // n = y = (y + z) 
n = y0 - y1  // -> n == -z [uses the original value of y] 
x -= n   // -> x += z 
+2

Les gens aiment baisser le ton, prendre mon +1. – gdoron

+2

@ gdoron aww, merci! ;-) – Alnitak

+2

c'est génial @Alnitak +1 pour ça :) – Bongs

10

Il suffit d'utiliser ceci:

x+=z;y+=z 

Honnêtement, tout le reste va tout simplement faire quelqu'un d'autre le maintien de votre code pour arrêter et se gratter la tête pendant quelques minutes. Ce code n'est pas scandaleusement longue, soit ...

+3

convenu, Mon mantra a été "il vaut mieux être clair que d'essayer d'être intelligent." – stephenbayer

+1

Il s'agit de plusieurs lignes de code dans une ligne ... tricher ...! :) – gdoron

-2

Cela fonctionne sur jsFiddle, donc il doit être quelque chose d'autre que vous faites ...

x = 1, y = 2, z = 3; 
x += y += z; 
alert(x); 
+4

Mais ce n'est pas ce qu'il veut, puisque 'x' devrait être égal à 4, pas à 6. – aioobe

2

Il ne fonctionne pas, parce que ce qui est fait dans le affectation

x += y += z; 

est:

y += z 

est évalué en premier. Outre l'ajout de z à , cette affectation renvoie également la nouvelle valeur y comme valeur de retour. Ensuite, cette nouvelle valeur de y devient l'opérande de l'autre +=.

x += y 

Eh bien, il n'y a probablement pas de chemin plus court d'écrire ce que vous voulez que simplement

x += z; y += z; 
3

En fait x = y = z ne signifie pas x = z et y = z. Cela signifie calculer une valeur d'expression y = z, puis affecter x à la valeur de cette expression. C'est là que vous avez tort.

+2

Ceci est un point important. C'est certainement la cause de l'attente mal placée pour le multiple '+ ='. –

6

Eh bien, x + = y + = z signifie:

  1. x = x + y + z
  2. y = y + z

Ainsi, il est impossible de le faire x = x + z et y = y + z avec x + = y + z = parce que cela signifie:

x += (y = y + z) -> x = x + (y = y + z) 

Prenons l'exemple suivant:

function sum() { 
    var x = 5, y = 7, z = 3; 
    x += y += z; 
    console.log (x); // it shows 15 --> x = 5 + 7 + 3 
    console.log (y); // it shows 10 --> y = 7 + 3 
    console.log (z); // it shows 3 
} 

, vous avez donc de le faire comme suit:

x += z; 
y += z; 
3

vous pouvez également faire .. x = 1, y = 2, z = 3

x+=(y+=z)-(y-z) 
3

Vous pouvez utiliser comma opérateur:

x += (y+=z,z); 
+0

ooh, c'est méchant! :) – Alnitak

+0

Vous devriez probablement lire la question mise à jour. La raison * real * était d'éviter la variable 'z'. –

+1

@Alnitak Avez-vous vu la question mise à jour? Cela signifie que votre réponse n'est pas correcte du tout. Et chaque réponse qui utilise l'opérateur '-' n'est pas correcte. :) – Engineer

1

FWIW, dans Firefox, vous pouvez utiliser assignmen destructuration t faire quelque chose comme ce que vous voulez.

Array.prototype.addToEach = function(x) { 
    for (var i = 0; i < this.length; i++) 
     this[i] += x; 
    return this; 
}; 

var x = "foo", y = "bar"; 

[x,y] = [x,y].addToEach("baz"); 

console.log(x,y); // "foobaz" "barbaz" 

http://jsfiddle.net/uPzNx/(démo pour les implémentations de SpiderMonkey)


Non qu'il a beaucoup à voir avec la solution, mais pour ceux qui n'aiment pas .prototype indigènes extensions, vous pouvez le faire à la place.

function addToEach(s) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    for (var i = 0; i < args.length; i++) 
     args[i] += s; 
    return args; 
}; 

var x = "foo", y = "bar"; 

[x,y] = addToEach("baz", x, y); 

console.log(x,y); // "foobaz" "barbaz" 
+0

La modification des intégrations telles que 'Object.prototype' et' Array.prototype' est strictement interdite. http://goo.gl/CwkNL – Engineer

+0

@Engineer: 'Object.prototype', oui, je suis d'accord (quand ils sont énumérables). 'Array.prototype', bien sûr que non. C'est une généralisation trop large. Une telle restriction est pertinente surtout lors de la création de code à diffuser largement. Pour le code de projet local, il n'y a absolument rien de mal à cela. –

+0

... bien sûr, cela pourrait facilement être accompli sans l'extension '.prototype'. –

Questions connexes