Javascript Boolean.prototype.toString()意外结果

时间:2014-03-20 23:01:11

标签: javascript boolean

使用我的浏览器控制台完成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上的三个浏览器上重现了这种行为,这是一个平台问题吗?我们将非常感谢您对此行为的任何帮助。

2 个答案:

答案 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实际上是每个布尔值的原型 - 它是一个布尔对象) :

  
      
  1. 否则如果Type(B)是Object并且B的[[Class]]内部属性的值是" Boolean",那么令b为[[PrimitiveValue]]内部属性的值B。
  2.   

[[PrimitiveValue]]基本上是valueOf来电:

Boolean.prototype.valueOf(); //false

Boolean.prototype在规范(15.6.4)中定义为布尔对象false

总而言之,这里发生的事情是,不是试图在你想要的变量上调用toString,而是在Boolean.prototype上调用它,每次产生相同的结果。

解决方案:不要这样做。在变量上调用toStringt.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'