Переоценка логического выражения в цикле Javascript - PullRequest
0 голосов
/ 29 августа 2018

Может кто-нибудь помочь мне понять следующую проблему с этим кодом JavaScript:

let x = 2;
let condition = (x > 0);
do {
     console.log("inside do while loop: x is " + x);
     x = -1;
    console.log(condition);
} while (condition);

Я бы ожидал следующий вывод:

внутри цикла do while: x равен 2

ложь

вместо этого я получаю бесконечный цикл:

внутри цикла do while: x равен 2

правда

внутри цикла do while: x равен -1

правда

внутри цикла do while: x равен -1

правда

похоже, что логическое выражение не переоценивается, а продолжает удерживать x = 2. Кто-нибудь получил представление об общем принципе работы здесь?

Спасибо за ваш ответ.

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

После того, как вы присвоите свою переменную, она будет оставаться неизменной при каждом вызове, есть много способов изменить такое поведение:

Запросить x > 0 каждый раз после цикла:

do {
     console.log("inside do while loop: x is " + x);
     x = -1;
     console.log(condition);
} while (x > 0);

или напишите функцию для вычисления переменной:

var greaterZero = function(v) {return v>0}

do {
    console.log("inside do while loop: x is " + x);
     x = -1;
 console.log(condition);
} while (greaterZero(x));
0 голосов
/ 29 августа 2018

Условие просто оценивается перед началом цикла do while, поэтому, чтобы избежать возникшего бесконечного цикла, необходимо оценить условие:

let x = 2;
let condition = (x > 0);
do {
     console.log("inside do while loop: x is " + x);
     x = -1;
    console.log(condition);
    condition = (x > 0);
} while (condition);
0 голосов
/ 29 августа 2018

JS - это последовательный язык программирования, который означает, что он строит строки одну за другой, за исключением случаев, когда есть цикл, или если statemenet или что-то в этом роде, поэтому, конечно, выражение не будет переоценивать само себя, вы должны, но выражение внутри "делай пока"

 let x = 2;
do {
  console.log("inside do while loop: x is " + x);
 x = -1;
 console.log(condition);
 let condition = (x > 0);
} while (condition);

или просто сделайте это условием для цикла

 let x = 2;
do {
  console.log("inside do while loop: x is " + x);
 x = -1;
 console.log(x > 0);
} while (x > 0);
0 голосов
/ 29 августа 2018

Заявление

let condition = (x > 0);

оценивается один раз . Так работают операторы в JavaScript и во многих очень распространенных языках, подобных этому. Это присваивание значения (x > 0) изменяет значение переменной condition, и все. Между condition и x или любой другой переменной не установлено постоянных отношений. Другими словами, это утверждение означает

Сравните x с 0, и если оно больше, установите значение condition в true, в противном случае - false.

Это не означает

Заставьте переменную condition всегда показывать, больше ли x, чем ноль.

В JavaScript способ сделать код повторно используемым - это создать функций .

...