操纵布尔值的串化
是否有可能操纵布尔值串化的方式?
改变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
感谢你目前的帮助。
似乎不可能...... :(
我认为.toString()
是在本机布尔类型的Boolean
版本上调用的(布尔类型是一个Object,但本机类型不是,与Numbers相同),并且+
被浏览器重载,以将布尔值本地转换为字符串。
这个问题之前已经被问到了(我确信我说的是答案),但我似乎无法找到它。
看起来你找到了答案,但仅供参考:
第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,对于本机对象,它将在DefaultValue中以类型提示结束undefined
让valueOf是用参数“valueOf”调用对象O的[[Get]]内部方法的结果。
如果IsCallable(valueOf)为true,那么,
让val是调用valueOf的[[Call]]内部方法的结果,其中O为此值和一个空参数列表。
如果val是原始值,则返回val。
如果你想让"" + new Boolean(a)
委托给Boolean.prototype.toString
你首先必须重写Boolean.prototype.valueOf
以返回一个非原始值,这是不礼貌的。