使用我的浏览器控制台完成Mozilla's Javascript Reference。看着布尔对象。我通过以下方法遇到了意外行为:
Boolean.prototype.toString() 返回“true”或“false”的字符串,具体取决于对象的值。覆盖Object.prototype.toString()方法
如果我实例化布尔值true或false,则它们都从此方法返回相同的“false”:
var t = Boolean(true);
var f = Boolean(false);
Boolean.prototype.toString(t);
> "false"
Boolean.prototype.toString(f);
> "false"
我知道我可以更可靠地查询对象:
Boolean.prototype.constructor(t);
> true
Boolean.prototype.constructor(f);
> false
所以我要问的是:任何人都可以解释,最好用例子,为什么 Boolean.prototype.toString(true)返回false?
是否存在继承问题,还是存在错误?我没有得到什么吗?我用布尔对象包装器,布尔文字和表达式测试了这个。我在Mac上的三个浏览器上重现了这种行为,这是一个平台问题吗?我们将非常感谢您对此行为的任何帮助。
答案 0 :(得分:5)
Boolean.prototype
上的任何内容都传递给所有布尔人。这意味着true.toString === Boolean.prototype.toString
,而true.toString()
就像在做Boolean.prototype.toString.call(true)
。
直接致电Boolean.prototype.toString
this === Boolean.prototype
。看看the spec,我们可以看到它试图在你得到一个布尔对象的情况下进行转换(记住,Boolean.prototype
实际上是每个布尔值的原型 - 它是一个布尔对象) :
- 否则如果Type(B)是Object并且B的[[Class]]内部属性的值是" Boolean",那么令b为[[PrimitiveValue]]内部属性的值B。
醇>
[[PrimitiveValue]]基本上是valueOf
来电:
Boolean.prototype.valueOf(); //false
Boolean.prototype
在规范(15.6.4)中定义为布尔对象false
。
总而言之,这里发生的事情是,不是试图在你想要的变量上调用toString
,而是在Boolean.prototype
上调用它,每次产生相同的结果。
解决方案:不要这样做。在变量上调用toString
:t.toString()
,f.toString()
N.B。你不需要Boolean(true)
或者喜欢;只需true
即可。
答案 1 :(得分:2)
Boolean.prototype.toString()
返回" true"或"假"基于 on 的对象的值,而不是 with 。
所以你得到了这些预期结果:
> var t = Boolean(true);
undefined
> var f = Boolean(false);
undefined
> t.toString();
'true'
> f.toString();
'false'
> Boolean.prototype.toString.apply(t);
'true'
> Boolean.prototype.toString.apply(f);
'false'