2012-05-14 11 views
6

sé en javascriptx + = y + = z en Javascript

x = y = z significa x = z y y = z

x+=z significa x=x+z;

Así que si quiero x=x+z y y=y+z, he intentado x+=y+=z no trabajar

Alguien tiene una mejor idea de escribir código corto en lugar x+=z;y+=z

EDIT

primer lugar gracias por todos los involucrados en mi pregunta. Aquí quiero explicar algo por qué tengo esta pregunta en primer lugar.

Intenté escribir un código como x+='some html code', y necesito y+='the same html code'. Así que, naturalmente, no quiero crear otro var z='the html code primero y luego x+=z y y+=z

Espero que mi explicación tenga sentido. De todos modos, voy a cerrar esta pregunta ahora. Gracias de nuevo.

+29

A veces es mejor no tratar de comprimir todo en una sola línea de código, pero escribir algunos símbolos más y mantener la legibilidad ... – Christoph

+13

ofuscación Santo, Batman! Simplemente use 'x + = z' y' y + = z'. – JJJ

+7

Estás haciendo dos asignaciones. ¿Por qué no ser explícito al respecto? ¿Cuál es la necesidad de _short code_? –

Respuesta

20

SuponiendoAdemás, y no concatenación, esto funciona:

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

pero en serio, no Úselo!


Para aquellos que quieren averiguar cómo , la secuencia de evaluación (donde uso n para mostrar el resultado intermedio de corriente) es aproximadamente:

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

A la gente le gusta votar negativamente, tomar mi +1. – gdoron

+2

@gdoron aww, gracias! ;-) – Alnitak

+2

esto es impresionante @Alnitak +1 :) – Bongs

10

sólo tiene que utilizar esto:

x+=z;y+=z 

Honestamente, todo lo demás es sólo va a hacer que alguien más el mantenimiento de su código para parar y se rascan la cabeza durante un par de minutos. Este código no es sorprendentemente larga, ya sea ...

+3

estuvo de acuerdo, Mi mantra ha sido "es mejor ser claro que tratar de ser inteligente". – stephenbayer

+1

¡Son múltiples líneas de código en una línea ... trampa ...! :) – gdoron

-2

Esto funciona en jsFiddle, así que debe ser algo más que está haciendo ...

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

Pero eso no es lo que él busca, ya que 'x' debe ser igual a 4, no a 6. – aioobe

2

No está funcionando, porque lo que se hace en el asignación

x += y += z; 

es:

y += z 

se evalúa primero. Además de agregar z a x, esta asignación también devuelve el nuevo valor de y como su valor de retorno. Entonces, este nuevo valor de y se convierte en el operando en el otro +=.

x += y 

Bueno, probablemente no hay camino más corto para escribir lo que quieras que simplemente

x += z; y += z; 
3

En realidad no significa x = y = zx = z y y = z. Significa calcular un valor de expresión y = z y luego asignar x el valor de esa expresión. Aquí es donde te equivocas.

+2

Este es un punto importante. Ciertamente es la causa de la expectativa fuera de lugar para el '' + = 'múltiple. –

6

Bueno, x + = y + = z significa:

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

lo tanto, es imposible hacer x = x + z e y = y + Z con x + = y + = z porque sería de medio:

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

Tome el ejemplo siguiente:

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 
} 

Por lo tanto, hay que hacerlo de la siguiente manera:

x += z; 
y += z; 
3

también se puede hacer .. x = 1, y = 2, z = 3

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

Puede utilizar comma operador:

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

ooh, eso es desagradable! :) – Alnitak

+0

Probablemente deberías leer la pregunta actualizada. La razón * real * era evitar la variable 'z'. –

+1

@Alnitak ¿Has visto la pregunta actualizada? Esto significa que tu respuesta no es correcta en absoluto. Y cada respuesta que usa el operador '-', no es correcta. :) – Engineer

1

Fwiw, en Firefox puede utilizar assignmen desestructuración t hacer algo como lo que quieres.

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/(demostración para las implementaciones Spidermonkey)


No es que tiene mucho que ver con la solución, pero para aquellos que no les gusta .prototype extensiones nativas, se puede hacer esto en su lugar.

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

Está estrictamente prohibido modificar construcciones como 'Object.prototype' y' Array.prototype'. http://goo.gl/CwkNL – Engineer

+0

@Ingeniero: 'Object.prototype', sí, estoy de acuerdo (cuando son enumerables). 'Array.prototype', por supuesto que no. Esa es una generalización demasiado amplia. Dicha restricción es relevante principalmente cuando se crea código para ser ampliamente distribuido. Para el código de proyecto local, no hay absolutamente nada de malo en ello. –

+0

... por supuesto, esto podría lograrse fácilmente sin la extensión '.prototype'. –

Cuestiones relacionadas