Javascript Boolean.prototype.toString()意外结果
使用我的浏览器控制台进行工作。查看布尔对象。我在以下方法中遇到了意外行为: Boolean.prototype.toString() 根据对象的值返回“true”或“false”字符串。重写Object.prototype.toString()方法 如果我实例化布尔值true或false,它们都会从此方法返回相同的“false”:Javascript Boolean.prototype.toString()意外结果,javascript,boolean,Javascript,Boolean,使用我的浏览器控制台进行工作。查看布尔对象。我在以下方法中遇到了意外行为: Boolean.prototype.toString() 根据对象的值返回“true”或“false”字符串。重写Object.prototype.toString()方法 如果我实例化布尔值true或false,它们都会从此方法返回相同的“false”: var t = Boolean(true); var f = Boolean(false); Boolean.prototype.toString(t); >
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吗
是继承问题,还是bug?我没有得到什么吗?我已经用布尔对象包装器、布尔文本和表达式对此进行了测试。我在Mac上的三个浏览器上复制了这种行为,这是平台问题吗?理解此行为的任何帮助都将不胜感激。Boolean.prototype.toString()基于其调用的对象的值返回“true”或“false”,而不是使用 因此,您可以获得以下预期结果:
> 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'
无论在
Boolean.prototype上的是什么,都会传递给所有Boolean。这意味着true.toString===Boolean.prototype.toString
,执行true.toString()
就像执行Boolean.prototype.toString.call(true)
当您直接调用Boolean.prototype.toString
时,this===Boolean.prototype
。看看,我们可以看到,如果你得到一个布尔对象,它会尝试进行转换(记住,Boolean.prototype
实际上是每个布尔对象的原型,它是一个布尔对象):
否则,如果类型(B)是Object,并且B的[[Class]]内部属性的值是“Boolean”,则将B设为B的[[PrimitiveValue]]内部属性的值
[[PrimitiveValue]]本质上是一个valueOf
调用:
Boolean.prototype.valueOf(); //false
和Boolean.prototype
在spec()中定义为布尔对象false
总之,这里发生的情况是,您没有尝试对您想要的变量调用toString
,而是在Boolean.prototype
上调用它,它每次都产生相同的结果
解决方案:不要这样做。调用变量t.toString()
,f.toString()
注意:您不需要布尔值(true)
或类似值;只要true
就可以了。我不确定是否理解,Boolean.prototype.toString()
返回false,当您将布尔值作为参数传递时,为什么它会返回其他值?如果您需要字符串dot.toString()
或Boolean.prototype.toString.call(t)
我现在就知道了,谢谢,文档中有漏洞吗?如果有,我要编辑Mozilla页面?不文档中没有漏洞,当你想在一个对象上使用一个方法时,原型通常不是你所使用的,所以你从来没有真正做过Boolean.prototype.constructor(t)代码>,因为这在任何地方都不起作用nothing@TonyCronin文档很好Boolean.prototype.toString
指的是布尔型的toString
属性<代码>布尔值。原型恰好是其中之一。