为什么'x==x++;`true和'x++;==Javascript中的x`false?

为什么'x==x++;`true和'x++;==Javascript中的x`false?,javascript,Javascript,您能解释一下这两种逻辑操作之间的区别吗: 设x=1; console.log('x='+x); log('x==x++:'+(x==x++); x=1; console.log('x='+x); log('x++==x:'++(x++==x))x===x++:首先比较x和x,然后比较x++ x++==x:首先是x++然后将x++的结果与x比较x++是一个后增量运算符,它基本上已经将x的值放入,然后将其增量为1。 在第一种情况下,x===x++。它表明,1===1,而在第二种情况下,x++==x

您能解释一下这两种逻辑操作之间的区别吗:

设x=1;
console.log('x='+x);
log('x==x++:'+(x==x++);
x=1;
console.log('x='+x);

log('x++==x:'++(x++==x))x===x++:首先比较x和x,然后比较x++
x++==x:首先是x++然后将x++的结果与x比较

x++是一个后增量运算符,它基本上已经将x的值放入,然后将其增量为1。 在第一种情况下,
x===x++
。它表明,
1===1
,而在第二种情况下,
x++==x
,x的值在比较之前增加,因此它变为
1===2
,这当然是错误的。

有趣


在第二种情况下,
x++
被计算为
1
,然后它增加
x
(变为2)。因此比较结果是
1==2

这是基本的计算机科学,
x++
意味着使用然后更新

x = 1; 

x === x++
这里的x值在比较结束后改变

x++ ===  x
开始时,x++值保持为1,但一旦执行===后,x的值将变为2。

后缀增量(
y=x++
)确实增加了值,但计算结果为其先前的值。它几乎等于:

  x² = x; // evaluate previous value of x
  x += 1; // increase x
  y = x²; // use previous value
因此,
x===x++
等于:

  // evaluate left side of ===
  x¹ = x;
  // evaluate right side
  x² = x;
  // ++
  x += 1;
  // comparison
  x¹ === x² // true
wereas
x++==x
是:

  // evaluate left side
  x¹ = x;
  // ++
  x += 1;
  // evaluate right side
  x² = x; // x was already incremented!
  // comparison
  x¹ === x²

x===x++
这里,在比较之前,
x=1
,因此返回true

x++==x
这里,由于运算符优先级,

这等于
x==++x
,其中x递增,因此返回false。

发生这种情况是因为递增运算符的顺序(在变量之前或之后)很重要

使用
x++
将首先返回变量,然后对其进行递增,而使用
++x
将首先对其进行递增,然后返回结果

例如:

x = 0;
console.log(x++, x); // 0, 1 (first return the variable then increment)
console.log(++x, x); // 2, 2 (first increment then return the variable)
在第一次比较中,在所有变量的使用之后,您将递增它:

x = 0;
//    0 === 0
      x === x++
在第二次比较中,首先使用x值,然后增加它并与新的x值进行比较:

x = 0;
//    0   === 1
      x++ === x

这是因为值x在再次读取之前增加,因此x++==x为假,x==x++为真。 还有一个看起来几乎相同的操作符++x,它立即递增变量

设x=0;
console.log(x++)//0
控制台日志(x)//1.
设y=0;
console.log(++y)//1.

控制台日志(y)//1
在javascript中求值
=
运算符时,它首先求值左操作数,然后求值右操作数,最后进行比较。看

并且,当计算
x++
时,
x
的值改变,
x++
的结果是
x
的原始(未改变)值

因此,在
x===x++
中,
x
x++
都求值为
x
的原始值,
x
的值在此之后发生变化。因此结果是
true


x++==x
中,当计算左
x++
时,会更改
x
的值,左操作数计算为原始值。但右操作数在这之后发展,因此它的计算结果为
x
的更改值。因此结果是
false

首先,我假设表达式是从左到右计算的,请参见下面的演示:

console.log('(1==2)==2-左前-',(1==2)==2)
log('1==(2==2)-右首-',1==(2==2))

console.log('1==2==2-与左前相同-',1==2==2)
运算符++可以放在变量后面。

当运算符在变量后面时,它是“后缀形式”:x++

“前缀形式”是指运算符在变量++x之前

设x=1;
console.log('x='+x);
//打印x=1
log('x==x++:'+(x==x++);
//(x==x++)这意味着
//(1 === 1)
//真的
x=1;
console.log('x='+x);
//打印x=1
log('x++==x:'++(x++==x));
//(x++==x)这意味着
//(1==2)的工作原理与x=x+1相同,但更短

//false
此选项无法回答问题。编译器为什么要这样做?编译器从左到右执行代码,然后按照我说的做