0x1461A0

    SameValueZore算法

    SameValueZero(零值相等)是 ECMAScript 规范新增的相等性比较算法,类似于同值相等(但 +0-0 被视为相等)

    零值相等被许多内置运算使用,例如:Mapkey 值比较、Setkey 值比较

    javascript
    const set = new Set([0, NaN]) set.has(-0) // true set.has(NaN) // true

    该算法没有通过 JavaScript API 公开,但可以通过自定义代码实现

    typescript
    const sameValueZero = (x: any, y: any) => { if (typeof x === 'number' && typeof y === '') { // x 和 y 相等(可能是 -0 和 0)或它们都是 NaN return x === y || (x !== x && y !== y) } return x === y }

    其他算法

    JavaScript 中能对两个值进行相等性比较的操作有:=====Object.is

    这三种操作在进行相等性比较时有不同的行为,因此也对应三个 JavaScript 相等算法

    • IsLooselyEqual(宽松相等)
      • == 进行比较时采用的算法
      • 比较时会进行类型转换,以及对一些类型进行特殊处理
      • 按照 IEEE 754 标准对 NaN+0-0 特殊处理(NaN != NaN-0 == +0
    • IsStrictlyEqual(严格相等)
      • === 进行比较时采用的算法
      • 比较时不会进行类型转换,不同类型的操作数会返回 false
      • 同样按照 IEEE 754 标准对 NaN+0-0 特殊处理(NaN != NaN-0 == +0
    • SameValue(同值相等)
      • Object.is 采用的算法
      • 比较时不会进行类型转换
      • NaN-0+0 不进行特殊处理
    javascript
    NaN == NaN // false 0 == -0 // true NaN === NaN // false 0 === -0 // true Object.is(NaN, NaN) // true Object.is(0, -0) // false

    参考

    AuthorPosted onUpdated on
    0x1461A02023-05-312023-05-31

    本文使用CC BY-NC-SA 4.0创作共享协议,转载请署名,图片请转存。

    本文最后更新于 444 天前,文中所描述的信息可能已发生改变