文章

关系运算符的探索

ECMAScript
JavaScript

探索 JavaScript 中关系运算符的一些特性

关系运算符的探索

前瞻

此篇内容并不是关系运算符的全部探索,仅仅是我学习过程中遇到的比较新奇的 point,以此来记录一下。

关系运算符

起因

Object 类型与其他数据类型进行比较时,都会得到 false。

有什么办法将结果变为 true 呢?

奇特的 point

let foo1 = ""
let foo2 = 0
 
// ==运算符,在类型不相同的情况下,会先将运算元转成Number类型的值,再进行比较(隐式转换)
console.log(foo1 == foo2) -> true
 
// ===运算符,在类型不相同的情况下,直接返回false,因为该运算符在类型不相同的情况下不会做任何的类型转换
console.log(foo1 === foo2) -> false

Object 类型与其他数据类型比较

查阅ECMA 文档,第 11.9.3 点的第 8 条原文如下:

If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).

let foo1 = ""
let foo2 = null
console.log(foo1 == foo2) -> false
 
/**
*	根据上面的原文,可以发现:如果比较的类型有Object类型或null,那么此类型会被ToPrimitive函数转换为初始值
* 而初始值是哪些呢? 就在上方的图中
* 依据上图,ToPrimitive(null)没有返回值,因为null没有对应的初始值
* 故比较结果为false
*/

解决疑惑

如何将有变量为 Object 类型的比较的结果变为 true 呢?

let foo = {
  name: "licodeao",
  age: 20,
  // 在对象中写入[Symbol.toPrimitive],并重写toPrimitive函数,修改其返回值即可
  [Symbol.toPrimitive]: function() {
    return 123
  }
}
// 实现将有变量为Object类型的比较的结果变为true
console.log(foo == 123) -> true

总结

  • 严格相等运算符不会进行任何的类型转换
  • 使用关系运算符进行比较时,当运算元中出现了 Object 类型时,可以重写其 toPrimitive 函数修改其返回值为期望值即可