我可以 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 操作 (===
),当两个操作数都是对象时,结果完全取决于它们是否是 相同的 对象。那里没有你可以挂钩的陷阱,即使使用代理也不行。
摆弄 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 操作 (===
),当两个操作数都是对象时,结果完全取决于它们是否是 相同的 对象。那里没有你可以挂钩的陷阱,即使使用代理也不行。