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

Ton*_*nin 4 javascript boolean

使用我的浏览器控制台完成Mozilla的Javascript参考.看着布尔对象.我通过以下方法遇到了意外行为:

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"
Run Code Online (Sandbox Code Playgroud)

我知道我可以更可靠地查询对象:

Boolean.prototype.constructor(t);
> true
Boolean.prototype.constructor(f);
> false
Run Code Online (Sandbox Code Playgroud)

所以我要问的是:任何人都可以解释,最好是用例子,为什么 Boolean.prototype.toString(true)返回false?

是继承问题还是错误?我没有得到什么吗?我用布尔对象包装器,布尔文字和表达式测试了这个.我在Mac上的三个浏览器上重现了这种行为,这是一个平台问题吗?我们将非常感谢您对此行为的任何帮助.

Zir*_*rak 5

无论什么Boolean.prototype都传递给所有布尔人.这意味着true.toString === Boolean.prototype.toString,做true.toString()就像做Boolean.prototype.toString.call(true).

当你Boolean.prototype.toString直接打电话时this === Boolean.prototype.看一下这个规范,我们可以看到它试图在你得到一个布尔对象的情况下进行转换(记住,Boolean.prototype实际上是每个布尔值的原型 - 它是一个布尔对象):

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

[[PrimitiveValue]]本质上是一个valueOf电话:

Boolean.prototype.valueOf(); //false
Run Code Online (Sandbox Code Playgroud)

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

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

解决方案:不要那样做.调用toString变量:t.toString(),f.toString()

NB你不需要Boolean(true)或喜欢; 只true会这样做.