Різниця між ++ і + = 1 в javascript

Чи може хтось пояснити, чому наступні функції дають різні результати. Перший, здається, не працює, але другий робить. Я здивований, тому що я думав + = 1 і ++ зробив те ж саме.

(Я не збираюся фактично використовувати цей код, це просто демонстрація різниці).

/*function 1*/
function incrementIfZero1(base,element) {

    if (element == 0) {
        return base++;
    }
    else
    {
        return base;
    }
};


/*function 2*/
function incrementIfZero2(base,element) {

    if (element == 0) {
        return base+=1;
    }
    else
    {
        return base;
    }
};

incrementIfZero1(1,0) /* -> 1*/
incrementIfZero2(1,0) /* -> 2*/

Будь-яка допомога дуже цінується.

Дякую,

Робін

[Редагувати:]

Дякую за ваші відповіді, тепер має сенс. Я також пробував таке твердження, в результаті якого було те ж саме, що і функція 1:

return (base++)

Я зараз дивувавсь, що це не дає такого ж результату, як функція 2 - я б очікував, що дужки будуть "силою" його оцінювати до повернення. Будь-яка ідея, чому це не так?

10
Дякуємо за ваші швидкі відповіді - перегляньте редагування внизу для додаткового та пов'язаного з ним питання
додано Автор RobinL, джерело

8 Відповіді

коли ви return base ++ повертає значення бази безпосередньо перед його збільшенням. Ви хочете зробити ++ base , щоб переконатися, що приріст відбувається спочатку, після чого він повертається

otherwise ++ is the same as +=1

[edit] у відповідь на ваш редагування, я намагався скласти випадкові вирази в круглих дужках, а більшість математичних операторів реагують, як очікувалося, це приріст, здається, звільнений, ймовірно, тому що синтаксис попереднього збільшення проти пост-інкрементації є дуже навмисним, а сам вислів повертає певне значення, незалежно від того, чи ви його обгортали в дужках

12
додано
@RobinL вираз x ++ повертає x (до оператора return , який повертає його з функції на зовнішню ), потім збільшує його. Вираз x + = 1 збільшує значення x , потім повертає його.
додано Автор bfavaretto, джерело
Спасибі - я думаю, що розумію. Отже, повернення (x ++) таке ж, як і повернення x ++, тому що ні вони не включають призначення до x, так що обидва з них кажуть: "повернення х, а потім збільшення на один". У той час як повернення x + = 1 говорить "присвоїти x + 1 до x і повернути результуюче значення x '.
додано Автор RobinL, джерело

return (base ++)

     

Тепер я здивований тим, що це не дає такого ж результату, як функція 2 - я б очікував, що дужки «змуситимуть» його оцінювати до повернення. Будь-яка ідея, чому це не так?

Операція збільшення оцінюється незалежно від дужок. Схоже, що вирази в JavaScript завжди призводять до значення, яке потім повертається. Наприклад, коли ви виконуєте оцінку var x = 2 + 2 , 2 + 2 , потім "повертається" оператору = , який потім присвоює це значення x . Оператор postfix ++ (як у base ++ ) працює по-різному: він збільшує змінну, що передує їй, але вираз повертає значення перед збільшенням. Оператор збільшення префікса, з іншого боку, працює так, як ви хочете, + + base повертає значення після збільшення його.

5
додано
Я знаю, що це в основному зайве з іншими відповідями, але я сподіваюсь, це допоможе вам зрозуміти, чому він поводить себе так, як це робиться.
додано Автор bfavaretto, джерело
Спасибі за цю відповідь - вона додав корисну додаткову інформацію про те, чому немає різниці між поверненням x ++ і поверненням (x ++).
додано Автор RobinL, джерело

Ви повертаєте base ++ . Це послідовність збільшення, отже приріст обробляється після повернення. Для цього конкретного випадку return ++ base; буде правильним

3
додано
@JustinNiessner Насправді це не так. Це вірно для більшості (всіх?) Мов, які мають позначення постфікса.
додано Автор Luke, джерело
@JustinNiessner PHP також працює таким чином . Може бути, "найбільше" не було правильного слова. "Деякі" були б більш доцільними.
додано Автор Luke, джерело
Ви можете вказати, що це специфічно для JavaScript ...
додано Автор Justin Niessner, джерело
@Luke - stackoverflow.com/questions/654715/… (Java) і stackoverflow.com/questions/2380803/… (C ++) буде просити відрізнятися. Я насправді думав про те ж саме, доки я не намагався подвоїти перевірку на мови, які я часто не використовую.
додано Автор Justin Niessner, джерело
return base++;

Є пост-приріст Це збільшує значення, що зберігається на базі, а потім повертає початкове значення перед тим, як відбувається приріст.

return base += 1;

Додає базу до бази, а потім повертає базу. Це попереднє збільшення. Це також можна записати як:

return ++base;
3
додано
Ви впевнені, що "base + = 1;" це попереднє збільшення, а не посада?
додано Автор Dany Caissy, джерело
Так, я впевнений.
додано Автор Dan455, джерело

Увага! Різниця між двома різними типами, рядком та числом, з використанням ++ і + = :

Коли count - це рядок, count + = 1 , здається, здійснює перетворення типу і перетворює другий номер у рядок, тоді як count ++ count аргумент, перетворюється на число і збільшується на 1.

let count = process.argv[2]

while (count < 5) {
  console.log('Inside of the loop. Count is', count)
  count += 1//NOT likely what you want! Now, try it with count++
}

console.log('Outside of loop. Count is', count)

Інший приклад:

> let num = '2'
undefined
> num++
2
> num
3

// VS using +=

> let num2 = '2'
undefined
> num2 += 1
'21'
> num2
'21'
2
додано

Просто прояснити трохи.

"змінна + = 1" є еквівалентом "variable = variable + 1". Це НЕ еквівалент змінної ++!

Щось на зразок змінної ++ можна використовувати на місці, перше - присвоєння.

1
додано

Будьте обережні:

x = 1; y = (x ++ * 10 + 1);

дорівнює:

у = 1 * 10 + 1 = 11

дійсно:

x = 1; y = (++ x * 10 + 1);

дорівнює:

у = 2 * 10 + 1 = 21;

закінчити:

++ x;

або

x ++;

немає різниці!

1
додано

У першій функції, що відбувається, це:

return base++; //at first base value is returned and then incremented.

У другій функції:

return base+=1; //here the incrementation is done first and then the variable is returned.

Стовпчичне призначення має більш високий пріоритет, тобто він закінчує свою роботу саме в цій лінії

1
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram