操纵布尔的字符串化

时间:2011-10-08 22:26:19

标签: javascript

是否可以操纵布尔值的字符串化方式?

更改Boolean.prototype.toString似乎没有帮助。

这里是我在mozrepl和FF3中的测试。

repl> Boolean.prototype.toString=function (){return this==true ? "1" : ""}
function() {…}
repl> a.toString()
""
repl> a=true
true
repl> a.toString()
"1"
repl> a+""
"true"
repl> a=false
false
repl> a+""
"false"

我对ECMA规范的理解是+应该调用toString()


更新:

好的,我找到了答案!

当ECMA谈到ToString()时,它并不代表JS方法toString()

  

这些运算符不是语言的一部分;他们在这里被定义为帮助   规范语言的语义。

请参阅http://bclary.com/2004/11/07/#a-9

感谢您的帮助。

似乎不可能...... :(

2 个答案:

答案 0 :(得分:2)

我想在本地布尔类型的.toString()版本上调用Boolean(布尔值是一个Object但是本机类型不是,与Numbers相同)并且+被重载通过浏览器将布尔值本地转换为字符串。

之前已经问过 这个问题(而且我很确定我所说的是答案),但我似乎无法找到它。

答案 1 :(得分:2)

看起来你找到了答案,但仅供参考:

11.6.1节解释了在字符串和其他值上调用+时会发生什么。

  

如果Type(lprim)是String或Type(rprim)是String,那么   返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串

正如您所指出的, ToString 不仅仅是对toString的调用。

9.8节解释 ToString 的作用。

  

抽象操作ToString根据表13将其参数转换为String类型的值:

     

布尔   如果参数为true,则结果为“true”。   如果参数为false,则结果为“false”。

请注意,对于对象,valueOf被调用,而不是toString,因为 ToString 委托给 ToPrimitive ,对于本机对象,这些对象最终会在{{ 3}}类型提示未定义

  

设valueOf是使用参数“valueOf”调用对象O的[[Get]]内部方法的结果。

     

如果IsCallable(valueOf)为真,则

     

设val是调用valueOf的[[Call]]内部方法的结果,其中O为此值和空参数列表。

     

如果val是原始值,则返回val。

如果您希望"" + new Boolean(a)委托给Boolean.prototype.toString,您首先必须覆盖Boolean.prototype.valueOf以返回非原始值,这是不礼貌的行为。