操作布尔值的字符串化



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

改变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/# 9

谢谢你的帮助。

似乎不可能……(

我认为.toString()是在Boolean版本的本机布尔类型(布尔是一个对象,但本机类型不是,与数字相同)和+被浏览器重载以将布尔转换为本机字符串。

这个问题以前有人问过(我很确定我说的是答案),但我似乎找不到它。

看起来你找到了答案,但作为参考:

第11.6.1节解释了在字符串和另一个值上调用+时会发生什么。

如果Type(lprim)为String或Type(rprim)为String,则返回ToString(lprim)后接ToString(rprim)

的字符串。

和你注意到的ToString不仅仅是对toString的调用。

第9.8节解释了ToString的作用。

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

布尔如果参数为真,则结果为"真"。如果参数为false,则结果为"false"。

请注意,对于对象,valueOf被调用,而不是toString,因为ToString委托给 topprimitive ,对于本机对象,它最终在DefaultValue中以类型提示undefined

结束

设valueOf为调用对象0的[[Get]]内部方法的结果,参数为"valueOf"。

如果IsCallable(valueOf)为true,则

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

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

如果你想让"" + new Boolean(a)委托给Boolean.prototype.toString,你首先必须重写Boolean.prototype.valueOf以返回一个非原始值,这是不礼貌的

最新更新