2011-10-08 57 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

呵呵 - 這與'Array'一起工作,但是:http://jsfiddle.net/nrabinowitz/ySEx6/1/ – nrabinowitz

+0

即使'a +「」委託給'Boolean.prototype'以與'new Boolean (a)+「」,它會導致調用Boolean.prototype.valueOf而不是Boolean.prototype.toString。 –

+0

@nrabinowitz,'數組'是對象,而不是基元,所以不可能有一個基本數組的行爲與包裝器對象不同。 –

回答

2

我想.toString()是呼籲Boolean版本的原生布爾類型的(布爾是一個對象,但原生類型不,同樣與數字)和+由瀏覽器過載到布爾值轉換爲字符串本身。

這個問題被要求之前(和我相當肯定我是說的答案),但我似乎無法到找到它

+1

即使你做'a = new Boolean(true);'做一個非原始布爾值,然後做'alert(a +「」);'你仍然得到''true'',這有點奇怪。 – nobody

+0

包裝對象的基元和實例決不會有不同的處理方式。這是包裝對象的基本思想。 – LanX

+1

@noboby,這是因爲'a +「」'導致'a.valueOf'被調用,而不是'a.toString'。 –

2

看起來像你找到回答,但僅供參考:

部分11.6.1解釋當在字符串和另一個值上調用+時會發生什麼情況。

如果Type(lprim)是字符串或類型(rprim)的字符串,然後 返回字符串即串聯接着的ToString(rprim)的ToString(lprim)

和作爲結果您注意到,ToString不只是致電toString

部分9.8解釋什麼ToString呢。

的抽象操作的ToString根據表13其參數轉換爲字符串類型的值:

布爾 如果參數爲真,則結果是「真」。 如果參數爲false,則結果爲「false」。

注意的對象,valueOf被調用,而不是toString因爲的ToString委託給ToPrimitive這對於本地對象在DefaultValue與類型提示未定義結束

我們的valueOf是結果使用參數「valueOf」調用對象O的[[Get]]內部方法。

如果IsCallable(的valueOf)爲真,那麼,

讓VAL是調用的valueOf的[[調用]]內部方法,其中O爲這個值和空參數列表的結果。

如果val是原始值,則返回val。

如果你想"" + new Boolean(a)委派Boolean.prototype.toString你首先必須覆蓋Boolean.prototype.valueOf返回非原始值這是不禮貌的。