你能覆盖 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
有不同的行为,所以我猜测没有改变它的函数。相反,我尝试扩展 truthy
为 false
的类型,但 Object.create
接受的唯一值是 null
,它几乎与对象文字相同(具有 none Object.prototype
个属性)。
foo == true
实际上将 foo
转换为数字,这就是 valueOf
有效的原因,但它具有误导性。
You can try {} == true
here 查看执行了比较算法的哪些步骤(免责声明:我做到了)。
!foo
however calls ToBoolean
,它明确地总是 returns true
一个对象。无法覆盖该行为。
可以使用 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
有不同的行为,所以我猜测没有改变它的函数。相反,我尝试扩展 truthy
为 false
的类型,但 Object.create
接受的唯一值是 null
,它几乎与对象文字相同(具有 none Object.prototype
个属性)。
foo == true
实际上将 foo
转换为数字,这就是 valueOf
有效的原因,但它具有误导性。
You can try {} == true
here 查看执行了比较算法的哪些步骤(免责声明:我做到了)。
!foo
however calls ToBoolean
,它明确地总是 returns true
一个对象。无法覆盖该行为。