2015-10-18 2 views
2

Могу ли я уменьшить несколькопеременные в JavaScript? Например, если у меня есть 3 переменные:Уменьшение нескольких переменных в JavaScript

 var foo = 10; 
    var boo = 15; 
    var lol = 15; 

    //Normal syntax: 
    foo -=1; // -> foo will be 9 
    boo -=1; // -> boo will be 14 
    lol -=1; // -> lol will be 14 

Есть ли возможность сделать это с одной линии? или лучше синтаксис? Например: foo ,boo ,lol -=1;

+0

Не совсем, нет. –

+0

Они не равны. –

+0

нет, вы не можете. Только каждая переменная, как в верхнем примере –

ответ

0

Нет, вы не можете. Стандартный JavaScript не дает этой возможности. Хуже того, что вы почти не можете делать это функционально. lol -=1; или lol--; - это просто ярлык для lol = lol - 1;. Так что, если вы будете пытаться написать функцию, которая делает это для вас, например:

function reduce() { 
    for (var i = 0; i < arguments.length; i++) { 
    arguments[i] = arguments[i] - 1; 
    } 
} 

, а затем вызвать его, как

reduce(foo, bar, lol); 

он просто не будет работать, потому что вы передаете примитивные номера (не ссылки). Каждый раз, когда вы меняете номер внутри функции, он не будет изменять сам номер, но вместо этого он вернет новый номер.

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

var vars = { 
    foo: 12, 
    bar: 13, 
    lol: 14 
}; 

function reduce(variables) { 
    for (variable in variables) { 
    if (variables.hasOwnProperty(variable)) { 
     variables[variable] -= 1; 
    } 
    } 

    return variables; 
} 

reduce(vars); 

Но это не список из 3-х переменных, это своего рода контекст прикреплении их.

Если вы делаете вещи в глобальном масштабе (например, в окне без упаковки материала в функции), вы можете комбинировать оба способ выше в один (Window хранит весь вар объявленных переменными внутри):

function reduce(vars) { 
    var varslist = vars.split(','); 

    for (var i = 0; i < varslist.length; i++) { 
    window[varslist[i]] -= 1; 
    } 
} 

reduce('foo,boo,lol'); 

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

0

Вы можете сделать это с одной линии, но вам все равно придется повторить операцию:

foo--, bar--, lol--; 

Читайте о comma operator. Это может быть полезно, но, как правило, оно не очень читаемо.

Я бы даже объединить var заявления в 1:

var foo = 1, bar = 2, lol = 3; 

, потому что если изменения вар, все изменения строки.

Я использовал, чтобы сделать это:

var foo = 1, 
    bar = 2, 
    lol = 3; 

но это плохая практика тоже, потому что удаление foo или lol изменится больше, чем просто одна линия (потому что var префикс или суффикс ;).

Иногда подробность хорошо:

var foo = 10; 
var boo = 15; 
var lol = 15; 

foo -= 1; 
boo -= 1; 
lol -= 1; 
Смежные вопросы