代码之家  ›  专栏  ›  技术社区  ›  Jonatan Santa Cruz

为什么这个JavaScript includes()特性有意义?

  •  3
  • Jonatan Santa Cruz  · 技术社区  · 7 年前

    我正在学习includes()特性,我发现了以下代码

    [NaN].includes(NaN) //True

    但是

    NaN === NaN // False

    为什么这是可能的?

    3 回复  |  直到 7 年前
        1
  •  4
  •   Ori Drori    7 年前

    使用等式 NaN === NaN 使用包括 [NaN].includes(NaN) 基本上是在问两个不同的问题:

    NaN 是一个非晶态实体,它描述了不是数值的概念,实际上没有可以比较的值。平等使用 Strict Equality Comparison ,并定义了比较 x === y 具有 方程的任何一边总是 false :


    b、 如果y为NaN,则返回false。

    1. Includes-数组中是否有具有该“名称”的内容?

    但是,要搜索 在数组中,为了保持to数组#包含只传递一个参数的签名,而不是回调,我们需要一种方法来“命名”我们正在搜索的内容。为了实现这一点,根据数组#在 ECMAScript 2016 (ECMA-262) docs :

    includes方法有意不同于类似的索引 方法有两种。首先,它使用SameValueZero算法, 而不是严格的相等比较,允许它检测 数组元素。其次,它不会跳过缺失的数组元素, 相反,将其视为未定义。

    的定义 SameValueZero(x, y) 声明在比较时:

    如果x为NaN,y为NaN,则返回true。

        2
  •  0
  •   ceejayoz    7 年前

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

    与JavaScript中所有其他可能的值不同,不可能依赖等式运算符(==和==)来确定值是否为NaN,因为NaN==NaN和NaN===NaN都计算为false。因此,伊斯南函数的必要性。

        3
  •  0
  •   0.sh    7 年前

    [ NaN ].includes(NaN) 这是为了检查 NaN [ ] .

    NaN === NaN NaN == NaN 仍将返回相同的值 false . 你只需要知道 includes 方法检查某个值是否为调用该值的数组。在引擎盖后面,我认为 包括 数组方法使用 typeof()

    typeof(NaN) // number
    [ NaN ].includes(NaN) // true
    
    typeof("1") // string
    [ 1 ].includes("1") // false
    
    typeof(1) // number
    [ 1 ].includes(1) // true
    

    这是根据 SameValueZero 方法使用。它在内部检查值的类型