为什么变量的值在 if 语句中改变

why does value of a variable change inside if statement

看看下面这段 js 小片段:

var a = 1;

if(! (--a)) { // when i say --a i did't mean to say "change the value of a" i just meant to say "without manupulating the actual value of a , just check if --a is falsy"
  console.log('ok');
}

console.log(a); // 0 ... WHY ? i never intended to change the value of a 

有人能告诉我为什么当我没有明确地将 a 的值设置为 --a 时,a 的值是被操纵的吗?在代码中的 if 条件下,我真的不是说实际上会减少 a 的值,它只是我教过的 if 检查并会更改 a 的值。

好吧,我想我显然错了。我只是想知道,这只是 javascript 的事情还是所有编程语言都通用? (即能够在 if 条件下操纵变量的值,而实际上您只想临时操纵变量的值而不更改实际值。)

P.S.: 对不起,如果这个问题听起来很微不足道,但对我来说理解它很重要。

编辑:不是要求解释 a-- 和 --a 是如何工作的,我想知道为什么:

计划一:

var a = 1;

--a;

console.log(a) // my expected output is 0

计划二:

var a = 1;

if(--a){};

console.log(a) // my expected output is still 1 , because i did't expect --a inside the if to actually manipulate a. 

所以基本上我的问题是 为什么 --a 在 if 中工作而不是 --a 是如何工作的!

--是自减运算符。它会将变量的值减少一就地,正如您所经历的那样。

这是自减(--)运算符。

The decrement operator decrements (subtracts one from) its operand and returns a value.

--a 如何工作

--a等价于a = a - 1。因此,当您使用 --a 时,a 的值首先递减,然后在表达式中使用。这不仅是 Javascript 特有的,它对大多数编程语言都是通用的。

要检查减一的值是否为零,您可以使用

if (!(a - 1)) {

someNumber-- 将先读取变量值,然后从中减去 1。

--someNumber会先减1再读变量值

无论如何,它都会修改值。

--++ 运算符是 'execution' 类型的运算符,它们正在调用中进行评估。

你应该使用这个语法:

if(!(a - 1)) { 
  console.log('ok');
}

是自减运算符。即使在条件表达式中,减后的变量值也会存储在内存中。

您应该尝试以下方法:

var a = 1;
var b = a - 1;
if (!(b)) {
  console.log('ok');
}

console.log(a);

--a 是一个 表达式 ,它首先递减 a,具有 new 的值a.

的值

这适用于 C、C++、Java 和 Javascript。

如果你想检查 a - 1 是否会 为假,那么写 if (!(a - 1)) 或者更清楚地写 if (a == 1)。这些表达式中的任何一个都不会更改 a.

的值

if 不仅是一个 条件语句 而且 执行写在其中的代码 即评估条件

例如 1:

if(a == 5) {} //checking value of a

但是

if(a = 5) //assigning 5 to a but also checking value of a as Undefined, null

例如 2:

类似地在 for...loop

for(var i=0; i<10; i++)

启动、条件检查和值更新一起执行

你的情况 --a 也将充当代码语句,之后它将充当条件语句,它将被执行并 return 值为 0 意味着您的变量将被更改,并且 ! 将否定它并使其变为真(尽管您的要求无关紧要)。

if(! (--a)) { // when i say --a i did't mean to say "change the value of a" i just meant to say "without manupulating the actual value of a , just check if --a is falsy"
  console.log('ok');
}

console.log(a);