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

问题描述 投票:4回答:1

使用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,它几乎与对象文字相同(没有Object.prototype属性)。

javascript object coercion
1个回答
3
投票

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

然而!foo调用ToBoolean,它明确地总是返回一个对象的true。无法覆盖该行为。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.