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

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

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

tianzhongshan   2021-04-16 我要评论
1、== 相等运算符

如果 x 与 y 类型一致时规则如下:
1. 如果 x 类型为 Undefined,返回 true。
2. 如果 x 类型为 Null,返回 true。
3. 如果 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. 返回 false。
4. 如果 x 为 String,则当 x 和 y 为完全相同的字符序列
    (长度相等且相同字符在相同位置)时返回 true,否则,返回 false。
5. 如果 x 为 Boolean, 当 x 和 y 为同为 true 或 false 时返回 true,
    否则,返回 false。
6. 如果 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 为同为 true 或 false 时,返回 true,
    否则,返回 false。
如果 x 和 y 引用到同一个 Object 对象,返回 true,否则,返回 false。
3、Object.is 使用ES6 “Same-value equality”(同值相等)算法,内部严格比较SameValue(x,y)
如果 x 与 y 类型不一致,返回 false,否则, 类型一致时规则如下:
1. 如果 x 类型为 Undefined,返回 true。
2. 如果 x 类型为 Null,返回 true。
3. 如果 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. 返回 false。
4. 如果 x 类型为 String, 如果 x 与 y 为完全相同的字符序列
    (相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false。
5. 如果 x 为 Boolean, 当 x 和 y 为同为 true 或 false 时,返回 true,
    否则,返回 false。
6. 如果 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 解析

 

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们