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

nic*_*oum 6 javascript object coercion

该string强制可以使用被覆盖toString的功能。

该number强制可以使用被覆盖valueOf的功能。

该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);
Run Code Online (Sandbox Code Playgroud)

当对象需要转换为truthy. 既然x == true和!!x有不同的行为,那么我猜测没有任何功能可以改变它。我代替试图延伸类型,其truthy是false但得到由唯一接受的值Object.create就是null这几乎是相同的对象文本(现在没有的的Object.prototype属性)。

Fel*_*ing 5

foo == true实际上转换foo为数字,这就是为什么valueOf有效,但它具有误导性。
您可以{} == true在这里尝试查看执行了比较算法的哪些步骤(免责声明:我做到了)。

!foo但是调用ToBoolean,它总是显式返回true一个对象。没有办法覆盖这种行为。

在此输入图像描述