是否有可能操纵布尔值的字符串化方式?
改变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
以返回一个非原始值,这是不礼貌的