2012-05-14 4 views
6

Я знаю, что в JavaScriptх + = у + = г в Javascript

x = y = z означает x = z и y = z

x+=z означает x=x+z;

Так что, если я хочу x=x+z и y=y+z, я пытался x+=y+=z не работает

Кто-нибудь есть идея получше, чтобы написать короткий код вместо x+=z;y+=z

EDIT

Первые спасибо для всех участвующих в моем вопрос. Здесь я хочу объяснить, почему у меня есть этот вопрос на первом месте.

Я попытался написать код x+='some html code', и мне нужно y+='the same html code'. Поэтому, естественно, я не хочу создавать еще один var z='the html code, а затем x+=z и y+=z

Надеюсь, что мой пояснят смысл. В любом случае, я собираюсь закрыть этот вопрос сейчас. Еще раз спасибо.

+29

Иногда лучше не пытаться сжать все в одной строке кода, но написать несколько символов больше и сохранить читаемость ... – Christoph

+13

Holy запутывания, Бэтмен! Просто используйте 'x + = z' и' y + = z'. – JJJ

+7

Вы выполняете два задания. Почему бы не быть откровенным об этом? Какая потребность в _short code_? –

ответ

20

Предполагаядобавление и не конкатенации, это работает:

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

но серьезно, не используйте это!


Для тех, кто хочет, чтобы выяснить, как последовательность оценки (где я использую n, чтобы показать текущий промежуточный результат) приблизительно:

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

Людям нравится понижать, принимать мои +1. – gdoron

+2

@gdoron aww, спасибо! ;-) – Alnitak

+2

это замечательно @Alnitak +1 для этого :) – Bongs

10

Просто используйте:

x+=z;y+=z 

Честно говоря, все остальное просто будет вызывать кого-то поддерживать свой код, чтобы остановить и чесать голову в течение нескольких минут. Этот код не шокирующе долго либо ...

+3

согласился, Моя мантра была «лучше быть ясной, чем пытаться быть умной». – stephenbayer

+1

Это несколько строк кода в одной строке ... обман ...! :) – gdoron

-2

Это работает на jsfiddle, поэтому оно должно быть что-то еще вы делаете ...

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

Но это не то, что ему нужно, так как 'x' должен равняться 4, а не 6. – aioobe

2

Это не работает, потому что делается в назначение

x += y += z; 

является:

y += z 

оценивается в первую очередь. Помимо добавления z в x, это задание также возвращает новое значение y в качестве возвращаемого значения. Затем это новое значение y становится операндом к другому +=.

x += y 

Ну, там, вероятно, не короткий путь, чтобы написать то, что вы хотите, чем просто

x += z; y += z; 
3

На самом деле x = y = z не означает, x = z и y = z. Это означает вычисление значения выражения y = z, а затем присвойте x значение этого выражения. Здесь вы ошибаетесь.

+2

Это важный момент. Это, безусловно, причина неуместного ожидания для множества '+ ='. –

6

Ну, х + = у + = г означает:

  1. х = х + у + г
  2. у = у + г

Таким образом, это невозможно сделать х = х + г и у = у + г с х + у + = = г, потому что это означает:

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

Рассмотрим следующий пример:

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 
} 

Таким образом, вы должны сделать это следующим образом:

x += z; 
y += z; 
3

вы также можете сделать .. х = 1, у = 2, г = 3

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

Вы можете использовать comma оператор:

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

Ох, это противно! :) – Alnitak

+0

Возможно, вам стоит прочитать обновленный вопрос. * * * * Причина заключалась в том, чтобы избежать переменной 'z'. –

+1

@ Алнитак Вы видели обновленный вопрос? Это означает, что ваш ответ неверен. И каждый ответ, который использует оператор «-», неверен. :) – Engineer

1

FWIW, в Firefox можно использовать деструктурирующие assignmen t сделать что-то вроде того, что вы хотите.

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/(демо для реализаций Spidermonkey)


Не то, что он имеет много общего с решением, но и для тех, кто не любит родные .prototype расширения, вы могли бы сделать это вместо.

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

Строгие запреты на модификацию встроенных функций, таких как 'Object.prototype' и' Array.prototype'. http://goo.gl/CwkNL – Engineer

+0

@Engineer: 'Object.prototype', да, я согласен (когда они перечислены). 'Array.prototype', конечно нет. Это чересчур широкое обобщение. Такое ограничение имеет значение, главным образом, при создании широко распространенного кода. Для локального кода проекта в этом нет ничего плохого. –

+0

... конечно, это можно было бы легко выполнить без расширения '.prototype'. –

Смежные вопросы