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 解析