你能覆盖 JavaScript 对象的真实强制转换吗?

Can you override the truthy coercion of a JavaScript Object?

可以使用 toString 函数覆盖 string 强制转换。

可以使用 valueOf 函数覆盖 number 强制转换。

boolean 强制转换也可以使用 valueOf 函数覆盖。

var foo = {
  toString: function() {
    console.log("To String");
    return "bar";
  },
  valueOf: function() {
    console.log("Value Of");
    return 5;
  }
};

console.log(`${foo}`);
console.log(+foo);
console.log(foo == true);
console.log(!!foo);

我一直没能找到在对象需要转换为 truthy 时调用的函数。由于 x == true!!x 有不同的行为,所以我猜测没有改变它的函数。相反,我尝试扩展 truthyfalse 的类型,但 Object.create 接受的唯一值是 null,它几乎与对象文字相同(具有 none Object.prototype 个属性)。

foo == true 实际上将 foo 转换为数字,这就是 valueOf 有效的原因,但它具有误导性。
You can try {} == true here 查看执行了比较算法的哪些步骤(免责声明:我做到了)。

!foo however calls ToBoolean,它明确地总是 returns true 一个对象。无法覆盖该行为。