2015-12-30 30 views
22

我試圖理解文檔Ecma-262的部分7.2.12後面的表達式{} == true如何理解表達式「{} == true」?

  • 如果Type(y)爲布爾型,返回的比較x == ToNumber(y)
  • ToNumber(true)結果是1,然後

    的結果{} == 1

    1. 如果Type(x)是Object且Type(y)是String,Number或Symbol,則 會返回比較結果ToPrimitive(x) == y

    我在現在的ToPrimitive({})困惑。

  • 如果提示是 「字符串」,然後

    一個。讓methodNames成爲«「toString」,「valueOf」»。

  • 否則,

    a。讓methodNames是«「valueOf」,「toString」»。

  • 應該ToPrimitive({})被解釋爲{}.toString(){}.valueOf()

    假設toString()被調用。

    如果Type(x)是字符串和類型(y)爲號, 返回比較ToNumber(x) == y

    的結果,所以{} == true可能是ToNumber(ToPrimitive({})) == ToNumber(true)

    +2

    'methodNames'列表是優先列表 – Hacketo

    +0

    「*有人可以提供更多詳細信息*」對於SO聽起來太寬泛了。你想知道什麼? – Bergi

    +0

    @Bergi我從'Dmitri Pavlutin'的答案得到一些細節。你是對的,我會更新我的問題。 – zangw

    回答

    15

    spec說:

    ToPrimitive在調用時沒有提示,那麼它一般表現爲,如果提示是數。

    因此,根據ToPrimitive算法,首先調用valueOf。但是由於它返回一個對象,而不是原始值,所以toString將被調用第二個,它返回一個字符串。

    因此{} == true可能是ToNumber(ToPrimitive({})) == ToNumber(true)

    是的,就是這樣。

    +0

    您能否提供更多關於'ToNumber(ToPrimitive({}))== ToNumber(true)'的細節? – zangw

    +1

    你想知道什麼?我以爲你知道這些功能在做什麼? –

    +1

    我從@Dmitri Pavlutin得到一些細節的答案。 – zangw

    7

    ToPrimitive({})首先評估爲{}.valueOf()。因爲valueOf()返回對象本身,所以使用toString()方法。
    {}.toString()返回"[object Object]",其與1進行比較。 "[object Object]"轉化爲數字NaN並與1比較。
    現在操作數是相同的數字類型,並使用===運算符。 NaN === 1評估爲false

    形式上:

    1. {} == true(變換trueNumber - >1
    2. {} == 1(使用valueOf()變換{},則toString() - >"[object Object]"
    3. "[object Object]" == 1(變換"[object Object]"Number - >NaN
    4. NaN == 1(運營商變更爲===因爲操作數是相同的類型)
    5. NaN === 1
    6. false

    更新:檢查我的崗位The legend of JavaScript equality operator有更多的細節和例子。

    +0

    我在問題中提到的是'==',而不是'===',所以'NaN === 1'? – zangw

    +1

    @zangw,NaN在任何比較中返回false – Grundy

    +1

    @zangw由於==首先將操作數轉換爲相同類型,最後===完成(NaN和1是相同的數字類型)。簡單地說,當使用==時,最終===在轉換爲相同類型之後仍然被使用。 –