为什么使用条件(三元)运算符在 javascript 中使用“=”与“===”会得到不同的结果?

Why do I get different results with "=" vs. "===" in javascript with Conditional (Ternary) Operators?

我想在 javascript 中编写一个程序,在两个整数相等时生成 "true",在不相等时生成 "false"。

我试过使用“=”符号和“===”符号,但我不知道为什么程序的结果会根据我使用的符号而改变,即使不改变程序中的数字职能。

这段代码的结果是 "false",这就是我想要的:

function checkEqual(a, b) {
  return (a === b ? true : false );
}

checkEqual(1, 2);

此代码生成 "true",这不是我想要的:

function checkEqual(a, b) {
  return (a = b ? true : false );
}

checkEqual(1, 2);

两次尝试checkEqual()中的数字相同,但我想知道为什么第二次是"true"。

您正在将 a 值分配给 b 值。因此,a 变为真。

您要做的是使用相等运算符 ==.

检查
  • = 是赋值运算符。
  • == 是相等运算符。
  • === 是严格相等运算符。

看看 documentation 深入了解。

=不检查相等性,只用于赋值。在 JavaScript 中检查相等性的运算符是 ==(对于 "abstract" 相等性)和 ===(对于 "strict" 相等性)。如果 ab 都是数字,那么 ===== 的效果相同。

第一种情况(===):

function checkEqual(a, b) {
  return (a === b ? true : false );
}

checkEqual(1, 2);

此处您使用的是身份运算符(a.k.a。严格相等运算符)。它检查值是否相等(并且类型相同)。

因为a1b2,那么a === b就变成了false(因为它们不同)。当然 false ? true : falsefalse。所以,整个事情 returns false。是的,您可以这样做:

function checkEqual(a, b) {
  return a === b;
}

checkEqual(1, 2);

第二种情况(=):

function checkEqual(a, b) {
  return (a = b ? true : false );
}

checkEqual(1, 2);

这里您使用的是赋值运算符。这不是相等性或身份检查。

在这种情况下,a = bb 的值赋给 a 并 return 赋给它。因此 ab 都将是 2,并且 a = b 计算为 2。最后,因为 2 是一个 truthy 值,所以 2 ? true : falsetrue.

注意:这也意味着如果您为 b 传递 falsy 值,您将得到 false。例如调用:checkEqual(1, null); 传递给 a 的值是无关紧要的。


你没做过的案例(==):

function checkEqual(a, b) {
  return (a == b ? true : false );
}

checkEqual(1, 2);

在这里您将使用相等运算符。它检查值是否相等(但是,可以自由转换值以进行检查)。

与第一个类似,这将 return false。有什么不同?好吧,类型。在 Javascript 中,"1" == 1true,但 "1" === 1false。也就是说,通过使用 == 允许运行时转换值以便比较它们,但使用 === 则不允许。

JavaScript comparison operators: Identity vs. Equality and Which equals operator (== vs ===) should be used in JavaScript comparisons?

在您的第二个代码片段中,您使用的是 赋值运算符 = 而不是 比较运算符之一(=====),这是这里的主要错误。

现在,为了简要回答您的具体问题,documentation报告:"The assignment operation evaluates to the assigned value."

因此,例如:

a = b ? true : false  --> if b != 0, this returns true,
                      --> if b = 0, this returns false