您可以覆盖JavaScript对象的真实强制吗?

时间:2019-03-08 19:33:47

标签: 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);

我无法找到当对象需要转换为truthy时需要调用的函数。由于x == true!!x的行为不同,所以我猜想没有函数可以改变这种情况。相反,我尝试扩展truthyfalse的类型,但Object.create唯一接受的值是null,它几​​乎与对象文字相同(没有{ {1}}个属性)。

1 个答案:

答案 0 :(得分:3)

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

!foo却调用ToBoolean,它明确地始终为对象返回true。无法覆盖该行为。

enter image description here