gpt4 book ai didi

boolean 值与数字比较中的 JavaScript 真实性

转载 作者:数据小太阳 更新时间:2023-10-29 05:50:49 25 4
gpt4 key购买 nike

我是 JavaScript 的新手,我正在尝试从 Internet 资源中学习它。虽然我知道会有很多 cr*p Material ,但大多数人似乎都同意的一件事是 JS 中事物的真实性(只是举个例子 here )

现在我在实验中发现了这个奇怪的事情:

(true == 2)false。为什么?

据我所知,2 是一个非零的,因此它应该被评估为true

最佳答案

这是因为当相等运算符的任一操作数是数字时,在几乎所有情况下,另一个操作数都会转换为数字,然后比较结果。所以你最终将 1(从 true 转换而来)与 2 进行比较,而不是将 true 进行比较真。该规则的唯一异常(exception)是 nullundefined默认值(参见下面的题外话)为null< 的对象未定义;将一个数字与这些返回值进行比较 false(即使 Number(null)0;不要问)。

详见 the specification ,第 11.9.3 节:“抽象相等比较算法”。这是 ES 5.1 中该部分的文本,但该链接指向当前编辑的草稿(这是每年的快照规范所基于的)并且有几个:

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

  1. If Type(x) is the same as Type(y), then
    1. Return the result of performing Strict Equality Comparison x === y.
  2. If x is null and y is undefined, return true.
  3. If x is undefined and y is null, return true.
  4. NOTE: This step is replaced in section B.3.7.2.
  5. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ! ToNumber(y).
  6. If Type(x) is String and Type(y) is Number, return the result of the comparison ! ToNumber(x) == y.
  7. If Type(x) is BigInt and Type(y) is String, then
    1. Let n be ! StringToBigInt(y).
    2. If n is NaN, return false.
    3. Return the result of the comparison x == n.
  8. If Type(x) is String and Type(y) is BigInt, return the result of the comparison y == x.
  9. If Type(x) is Boolean, return the result of the comparison ! ToNumber(x) == y.
  10. If Type(y) is Boolean, return the result of the comparison x == ! ToNumber(y).
  11. If Type(x) is either String, Number, BigInt, or Symbol and Type(y) is Object, return the result of the comparison x == ? ToPrimitive(y).
  12. If Type(x) is Object and Type(y) is either String, Number, BigInt, or Symbol, return the result of the comparison ? ToPrimitive(x) == y.
  13. If Type(x) is BigInt and Type(y) is Number, or if Type(x) is Number and Type(y) is BigInt, then
    1. If x or y are any of NaN, +∞𝔽, or -∞𝔽, return false.
    2. If (x) = (y), return true; otherwise return false.
  14. Return false.

注意:上面的!不是的否定,它们表示下面的抽象操作永远不会产生突然完成。详见this article about reading the spec .

如果你想检查它们都是真还是假,你可以使用 bang (!) 或 double-bang (!!) 习惯用法来强制转换它们都是 boolean 值:

var a = true,
b = 2;
alert(a == b); // "false", 1 !== 2
alert(!!a == !!b); // "true", true === true
alert(!a == !b); // "true", false === false
a = false;
b = 0;
alert(a == b); // "true", 0 === 0
alert(!!a == !!b); // "true", false === false
alert(!a == !b); // "true", true === true

...但通常将 ==!= 与 boolean 值一起使用并不理想。但它确实出现了。

我倾向于使用双爆炸,但在 JavaScript 中没有理由超过爆炸。 (在其他一些语言中,有一种说法是 double 而不是单打,尽管它与 if (!!x) 的一致性有关。在 JavaScript 中,你永远不需要 if (x) 大小写,所以...)


(题外话:大多数 JavaScript 对象的默认值是一个字符串,尽管通常像“[object Object]”这样的字符串,如果将其转换为数字,最终会变成 NaN;但是构造函数可以通过 valueOftoString 覆盖该行为。宿主对象的默认值取决于宿主环境。)

关于 boolean 值与数字比较中的 JavaScript 真实性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com