是否可以操纵布尔值的字符串化方式?
更改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
感谢您的帮助。
似乎不可能...... :(
答案 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
以返回非原始值,这是不礼貌的行为。