我可以 intercept/trap 反对平等比较的行为吗

Can I intercept/trap object behavior on comparison for equality

摆弄 Javascript 个物体既有趣又烦人:

const MyObject = function(value)  {
  let _myObject = {
    [Symbol.valueOf]() {
      return value
    },
    [Symbol.toPrimitive]() {
      return value
    },
  }
  return _myObject
}

let o = new MyObject("a")
let p = new MyObject("b")

o == "a"
# true

p == "a"
# false

o < p
# true

p < o
# false

p + "-foo"
# 'p-foo'

让自定义对象表现得像原始类型看起来可能有用且直观!直到你尝试这样的事情:

let o = new MyObject("a")
let p = new MyObject("a")

o == "a"
# true

p == "a"
# true

o == p
# false

Javascript 将(非常明智地)return false 当比较两个对象是否相等时。

有什么办法可以绕过这种情况下出现的明显“不一致”吗? (也许 proxies/Proxy handlers 的一些巧妙用法?)

Can I intercept/trap object behavior on comparison for equality

不,你不能。 == 的行为由 IsLooselyEqual abstract operation in the specification, which just hands off to IsStrictlyEqual 控制,当操作数都具有相同的类型时(并且所有对象在 JavaScript 中被认为是相同的类型)。使用 IsStrictlyEqual 操作 (===),当两个操作数都是对象时,结果完全取决于它们是否是 相同的 对象。那里没有你可以挂钩的陷阱,即使使用代理也不行。