2011-10-08 16 views
7

ブール値が文字列化される方法を操作することは可能ですか?ブール値の文字列の操作

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()を呼ぶべきであるということです。


UPDATE:私は答えを見つけた

OK!

ECMAがToString()について話すとき、それはJSメソッドtoString()を意味しません。

これらの演算子は言語の一部ではありません。それらは、言語の意味を で指定するのを助けるためにここで定義されています。

は、これまでの助けをhttp://bclary.com/2004/11/07/#a-9

感謝を参照してください。

することは可能ではないようです... :(

+1

Huh - これは 'Array'でも使えます:http://jsfiddle.net/nrabinowitz/ySEx6/1/ – nrabinowitz

+0

' new Booleanとの一貫性のために 'Boolean.prototype'に' a + ""を委譲しても(a)+ "" 'を呼び出すと、' Boolean.prototype.toString'ではなく、 'Boolean.prototype.valueOf'が呼び出されます。 –

+0

@nrabinowitz、 'Array'はプリミティブではないオブジェクトなので、プリミティブ配列がラッパーオブジェクトとは異なる振る舞いをすることはできません。 –

答えて

2

私は.toString()が数字と同じネイティブboolean型(Booleanオブジェクトですが、ネイティブ型ではない、のBooleanバージョンで呼び出されると仮定します)と+は)この質問はを前に頼まれている(と私は答えた言ったかなり確信している

。ネイティブ文字列にブール値に変換するために、ブラウザによってオーバーロードされているが、私はように見えることはできません見つけてください。

+1

'a = new Boolean(true);'を非プリミティブなブール値にしてから 'alert(a +" ");を実行しても' 'true ''が得られるとしても、これはちょっと変です。 – nobody

+0

ラッパーオブジェクトのプリミティブとインスタンスは、決して異なった扱いを受けません。それはラッパーオブジェクトの基本的な考え方です。 – LanX

+1

@noboby、それは 'a +" "'は 'a.valueOf'を' a.toString'ではなく呼び出すためです。 –

2

答え:

セクション11.6.1は、+が文字列と別の値で呼び出されたときの動作を説明しています。

タイプ(lprim)を のToString(rprim)

とAS続いのToString(lprim)を連結した結果である文字列を返し、文字列またはタイプ(rprim)が文字列である場合ToStringは、toStringへの呼び出しではありません。

セクション9.8については、ToStringの説明があります。

抽象操作のToStringは、表13に従ってString型の値を引数に変換:

ブール引数が真である場合、結果が「真」です。 引数がfalseの場合、結果は "false"になります。

注オブジェクトに対して、valueOfをタイプヒントとネイティブオブジェクトに対してDefaultValueで終わるたToPrimitiveに、ないtoStringためのToStringデリゲートを起動していることを未定義

のvalueOfの結果とします引数 "valueOf"を持つオブジェクトOの内部メソッド[[Get]]を呼び出します。

IsCallable(のvalueOf)が、その後真の場合

valは、この値と空の引数リストとしてOと、のvalueOfの[[コール]内部メソッドを呼び出した結果とします。

valがプリミティブな値の場合、valを返します。あなたは"" + new Boolean(a)Boolean.prototype.toStringに委任する場合

最初に悪いマナーである非プリミティブな値を返すようにBoolean.prototype.valueOfをオーバーライドする必要があります。