• 比较运算规则 == 、 ===、Object.is 和 ToPrimitive 方法 [[DefaultValue]] (hint)


    1、== 相等运算符

    如果 x 与 y 类型一致时规则如下:
    1. 如果 x 类型为 Undefined,返回 true2. 如果 x 类型为 Null,返回 true3. 如果 x 类型为 Number,则,
        a. 如果 x 为 NaN,返回 false。
        b. 如果 y 为 NaN,返回 false。
        c. 如果 x 与 y 为同一个数字,返回 true。
        d. 如果 x 为 +0,且 y 为 -0,返回 true。
        e. 如果 x 为 -0,且 y 为 +0, 返回 true。
       f. 返回 false4. 如果 x 为 String,则当 x 和 y 为完全相同的字符序列
        (长度相等且相同字符在相同位置)时返回 true,否则,返回 false5. 如果 x 为 Boolean, 当 x 和 y 为同为 truefalse 时返回 true,
        否则,返回 false6. 如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false。
    如果 x 为 Null 且 y 为 Undefined, 返回 true。
    如果 x 为 Undefined 且 y 为 Null, 返回 true。
    如果 x 为 Number 且 y 为 String, 返回比较 x == ToNumber(y)的结果。
    如果 x 为 String 且 y 为 Number, 返回比较 ToNumber(x) == y的结果。
    如果 x 为 Boolean 返回比较 ToNumber(x) == y的结果。
    如果 y 为 Boolean 返回比较 x == ToNumber(y)的结果。
    如果 x 为 String 或者 Number, 且 y 为 Object,
        返回比较 x == ToPrimitive(y)的结果。
    如果 x 为 Object, 且 y 为 String 或者 Number,
        返回比较 ToPrimitive(x) == y的结果。
    否则返回false。

    2、=== 严格相等运算符

    如果 x 与 y 类型不一致,返回 false。
    如果 x 为 Undefined, 返回 true。
    如果 x 为 Null, 返回 true。
    如果 x 为 Number, 则,
        a. 如果 x 为 NaN,返回 false。
        b. 如果 x 为 NaN,返回 false。
        c. 如果 x 与 y 为同一个数字, 返回 true。
        d. 如果 x 为 +0,且 y 为 -0,返回 true。
        e. 如果 x 为 -0,且 y 为 +0, 返回 true。
       f. 返回 false。
    如果 x 类型为 String, 如果 x 与 y 为完全相同的字符序列
        (相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false。  
    如果 x 为 Boolean, 当 x 和 y 为同为 truefalse 时,返回 true,
        否则,返回 false。
    如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false
    3、Object.is 使用ES6 “Same-value equality”(同值相等)算法,内部严格比较SameValue(x,y)
    如果 x 与 y 类型不一致,返回 false,否则, 类型一致时规则如下:
    1. 如果 x 类型为 Undefined,返回 true2. 如果 x 类型为 Null,返回 true3. 如果 x 类型为 Number,则,
        a. 如果 x 为 NaN,且 y 也为 NaN,返回 true。
        b. 如果 x 为 +0,且 y 为 -0,返回 false。
        c. 如果 x 为 -0,且 y 为 +0, 返回 false。
        d. 如果 x 与 y 为同一个数字,返回 true。
        e. 返回 false4. 如果 x 类型为 String, 如果 x 与 y 为完全相同的字符序列
        (相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false5. 如果 x 为 Boolean, 当 x 和 y 为同为 truefalse 时,返回 true,
        否则,返回 false6. 如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false。
    
    Object.is(+0, -0) // false
    Object.is(NaN, NaN) // true
    注: === 和 Object.js 比较差异主要体现在 NaN 及 正负0 的比较。
    +0 === -0 // true
    NaN === NaN // false
    Object.is(+0, -0) // false
    Object.is(NaN, NaN) // true

    4、ToPrimitive 方法 [[DefaultValue]] (hint)

      ToPrimitive 运算符把其值参数转换为非对象类型,主要理解为对象转换时处理步骤
    当不用 hint 调用 O 的 [[DefaultValue]] 内部方法时,除非O 是 Date 对象的情况下把 hint 当作字符串一样解释它的行为,除此之外把 hint 当作数字一样解释它的行为
    当期望转换hint类型为 Number 类型时:
    1. 调用 valueOf 结果是原始类型,则返回;
    2. 调用 toString 结果是原始类型,则返回;
    3. 抛出 TypeError 异常。
    当期望转换hint类型为 String 类型时:
    1. 调用 toString 结果是原始类型,则返回;
    2. 调用 valueOf 结果是原始类型,则返回;
    3. 抛出 TypeError 异常。
    当期望类型hint类型default时,除对象为Date时以String解释,其他情况以Number解释
    // 确定 hint 类型
    var a = {
        [Symbol.toPrimitive](hint){
            console.log('hint: ' + hint);
        }
    }
    alert(a); // hint: string
    `${a}`; // hint: string
    +a; // hint: number
    a + 1; // hint: default
    
    var b = new Date();
    +b; // 1614261017044 当前hint: number
    b + 1; // Thu Feb 25(...省略)1 当前hint: default 默认时以String 解析

  • 相关阅读:
    google的几道面试题
    轮盘赌算法
    基于packstack的openstack单节点安装
    攻克python3-字典(第四篇)
    攻克python3-列表与元组(第三篇)
    攻克python3-字符串(第二篇)
    攻克python3(第一篇)
    二维数组
    小白对c语言指针的基础总结
    小白对c语言数组的基础总结
  • 原文地址:https://www.cnblogs.com/tianzhongshan/p/14667766.html
Copyright © 2020-2023  润新知