2011-10-08 15 views
7

È possibile manipolare il modo in cui vengono Booleans stringata?Manipolare in stringa di booleani

Modifica Boolean.prototype.toString non sembra aiutare.

Ecco il mio test all'interno mozrepl e 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" 

La mia comprensione della specifica ECMA è che + dovrebbe chiamare toString().


UPDATE:

OK ho trovato la risposta!

Quando ECMA parla di ToString() non significa il metodo JS toString().

Questi operatori non fanno parte della lingua; sono qui definiti per aiutare la specifica della semantica della lingua.

vedere http://bclary.com/2004/11/07/#a-9

Grazie per l'aiuto finora.

non sembra essere possibile ... :(

+1

Huh: funziona con 'Array', tuttavia: http://jsfiddle.net/nrabinowitz/ySEx6/1/ – nrabinowitz

+0

Anche se' a + "" 'è stato delegato a' Boolean.prototype' per coerenza con 'new Boolean (a) + "" ', risulterebbe in una chiamata a' Boolean.prototype.valueOf', non 'Boolean.prototype.toString'. –

+0

@nrabinowitz, 'Array's sono oggetti, non primitivi, quindi non c'è modo che un array primitivo possa comportarsi diversamente da un oggetto wrapper. –

risposta

2

suppongo .toString() è chiamato sulla versione Boolean di tipo booleano nativo (booleano è un oggetto, ma il tipo nativo non è, lo stesso con i numeri) e + è sovraccaricato dal browser per convertire un valore booleano in una stringa in modo nativo.

Questa domanda è stato chiesto prima (e sono abbastanza sicuro quello che ho detto è stata la risposta), ma io non riesco a trovarlo.

+1

Anche se si esegue 'a = new Boolean (true);' per creare un booleano non primitivo e quindi fare 'alert (a +" ");' si ottiene ancora '" true "', questo è un po 'strano. – nobody

+0

Le primitive e le istanze dell'oggetto wrapper non vengono mai trattate in modo diverso. Questa è l'idea di base degli oggetti wrapper. – LanX

+1

@noboby, Questo perché 'a +" "' causa il richiamo di 'a.valueOf', non' a.toString'. –

2

Sembra che hai trovato la risposta, ma per riferimento:

Sezione 11.6.1 spiega cosa succede quando + è invocato su una stringa e un altro valore.

Se Type (lprim) è String o tipo (rprim) è String, quindi restituisce la stringa che è il risultato della concatenazione ToString (lprim) seguito da ToString (rprim)

e come si è preso nota, ToString non è solo una chiamata a toString.

Sezione 9.8 spiega cosa fa ToString.

L'operazione ToString abstract converte il suo argomento un valore di tipo String secondo Tabella 13:

booleano Se l'argomento è vero, allora il risultato è "vero". Se l'argomento è falso, il risultato è "falso".

noti che per gli oggetti, valueOf viene invocato, non toString perché ToString delegati ToPrimitive che per oggetti nativi finisce in DefaultValue con tipo suggerimento indefinito

Sia valueOf essere il risultato di chiamare il metodo interno [[Get]] dell'oggetto O con l'argomento "valueOf".

Se isCallable (valueOf) è vero allora,

Sia val essere il risultato della chiamata al [[Bando]] metodo interno di valueOf, con O come questo valore e una lista di argomenti vuota.

Se val è un valore di base, tornare val.

Se si desidera "" + new Boolean(a) di conferire al Boolean.prototype.toString si dovrebbe prima di ignorare Boolean.prototype.valueOf per restituire un valore non-primitivo che è maleducazione.