操纵布尔值的串化

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

改变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以返回一个非原始值,这是不礼貌的。

链接地址: http://www.djcxy.com/p/55413.html

上一篇: Manipulating stringification of booleans

下一篇: Rewriting dynamic URLs