對JS隱式轉換的問題,當進行字串和數字比較時,關於隱式轉換valueOf是怎麼呼叫的?

時間 2021-06-21 02:20:54

1樓:Ahonn

字串轉換為數字的方式有:

- 前置 + 操作符

- Number()

- parseInt()

- parseFloat()

排除 parseInt() 和 parseFloat(),原因是這兩個函式會轉換 "123a" 這種字串為 123,而 "123a" == 123 肯定不會返回 true。

我找到 ECMA 中對前置 + 操作符和 Number() 的描述:

- ECMAScript Language Specification - ECMA-262 Edition 5.1

- ECMAScript Language Specification - ECMA-262 Edition 5.1

兩者都會呼叫乙個 toNumber() 的抽象方法進行轉換。

通過搜尋發現 What's the significant use of unary plus and minus operators? 中高票回答中說:

The Unary + is equivalent to the Number() constructor called as a function, as implied by the spec.

所以可以認為前置 + 操作符等價於 Number()。

在瀏覽器中檢視 Number:

function

Number

()而重寫 Number() 函式之後進行字串與數字比較的操作的時候並沒有得到預期的結果。

所以是否可以認為進行字串與數字比較時,字串轉換為數字執行的操作是前置 + 操作符(內部的 toNumber() 方法)?

而其內部的實現實際上與 Number() 相同,但我們無法重寫它。這樣使得字串與數字做比較的時候即使 Number() 被意外重寫也不會發生錯誤?

最後僅為查閱資料後實踐得出的猜測,希望有大牛來解答...

JS中 有關運算的問題?

冴羽 原本以為是道簡單的題目,越想越複雜,嚇得我捧上了規範 根據規範的意思,var a a 其實是先執行加1操作,再執行的賦值操作,只是a 返回的是舊值。這也就是說其實a已經增加到了6,只是a沒有想到又把舊值5賦給了a,所以最終的結果就是a等於5 smallcold 此題考查運算子優先順序和表示式返...

js很奇怪的問題,關於加法運算的問題?

規則是下面這樣的,另外加上 Number 這樣的強制轉換成number就能得到結果了。至於為什麼會這樣你應該深入了解組織。 小炒黃牛肉 1 2 轉成數字2,所以1 2 等於3 2 1 空格 字串 1轉字串所以等於 1 3 1 空字串轉成數字0 所以等於1 貘吃饃香 只是規範規定 乙個個說 1 2 注...

有關進製轉換的問題?

曲晉雲 首先,請問一下你自己,2的四次方是多少?也許你直接就回答16。那麼好,這個回答裡的16,你已經隱含地在使用10進製了。假如用八進位制來表示的話,2的四次方就不是16,而是20。計算機程式語言裡也是如此,表示數字的變數型別,用的是十進位制。以C語言為例,當你定義乙個變數 inta 這時變數a指...