Javascript 操纵布尔函数的字符串化

Javascript 操纵布尔函数的字符串化,javascript,Javascript,有没有可能操纵布尔的字符串化方式 更改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+"

有没有可能操纵布尔的字符串化方式

更改
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谈到它时,并不意味着JS方法
toString()

这些运算符不是语言的一部分;这里定义它们是为了帮助 语言语义的说明

谢谢你迄今为止的帮助

似乎不可能…:(

我想
.toString()
在本机布尔类型的
版本上被调用(布尔是一个对象,但本机类型不是,与数字相同),并且浏览器会重载
+
以本机将布尔转换为字符串


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

看起来你找到了答案,但仅供参考:

第节解释了对字符串和另一个值调用
+
时发生的情况

如果类型(lprim)为字符串或类型(rprim)为字符串,则 返回由ToString(lprim)后跟ToString(rprim)连接而成的字符串

正如您所指出的,ToString不仅仅是对
ToString
的调用

第节解释了ToString的功能

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

布尔值 如果参数为true,则结果为“true”。 如果参数为false,则结果为“false”

请注意,对于对象,调用的是
valueOf
,而不是
toString
,因为toString将委托给ToPrimitive,而对于本机对象,ToPrimitive将以未定义类型提示结束

让valueOf作为调用对象O的[[Get]]内部方法(参数为“valueOf”)的结果

如果IsCallable(valueOf)为真

让val作为调用valueOf的[[Call]]内部方法的结果,其中O作为this值和一个空参数列表

如果val是基本值,则返回val


如果您希望
“”+new Boolean(a)
委托给
Boolean.prototype.toString
,则首先必须重写
Boolean.prototype.valueOf
,以返回一个非原始值,这是不礼貌的。

Huh-这适用于
数组
,但:即使
a+“
委托给
布尔型。原型
新布尔型(a)+保持一致
,它将导致调用
布尔型.prototype.valueOf
,而不是
布尔型.prototype.toString
@nrabinowitz,
数组
是对象,而不是原语,因此原语数组的行为与包装器对象没有区别。出于好奇,你为什么要这样做?@minitech:I'm invest这是一种不兼容的边缘情况。即使您使用
a=new Boolean(true);
生成一个非基本布尔值,然后使用
alert(a+“”);
仍会得到
true
,这有点奇怪。包装器对象的原语和实例从未被区别对待。这是包装器对象的基本思想。@noboby,这是因为
a+“”
导致调用
a.valueOf
,而不是
a.toString
@Mike Samuel:当对象被计算为二进制操作时。valueOf()当然会被调用。问题是(was)将调用哪个方法来执行
+
,其中一个操作数是字符串。ECMA专门针对
ToString()
“操作数”,它是硬编码的,我把它与
混淆了。ToString()
@LanX”原语和包装器对象的实例从未被区别对待这并不完全正确,
var a=new Boolean(false);var b=false;if(a)警报(“a”);if(b)警报(“b”);
警报a而不是b。