2017-02-15 80 views
0

問題是解決了這個神奇的條件:Javascript idiosyncrasy:valueOf澄清if語句?

var magic = ???; 

if(magic < 1 && magic > 1){ 
    console.log('Inside') 
} 

//magic solution 1 - WORKS 

var magic = (function(){ 
    var val = -2; 

    return { 
     valueOf(){ 
      return val = val + 2; 
     } 
    } 
})(); 

// magic solution 2 - DOESN'T WORK 

var magic = { 
    val: -2, 
    valueOf: function(){ 
     return this.val + 2; 
    } 
}; 

有人能澄清這個片段是如何工作的?我以爲兩者都是一樣的。

+0

這兩個例子都可以正常工作,但它們甚至都不是相同的,所以如果第二個不起作用,那麼您可能會錯誤地使用它,但是因爲您沒有真正向我們展示您打算如何使用它,甚至要求一個適當的問題,這很難回答? – adeneo

+0

@adeneo對於第二個魔法對象它不符合條件..所以問題是爲什麼它不? –

回答

0

這兩個片段都使用JavaScript的'kinda-magic'一面:當對象用於僅適用於基元的表達式時(例如與數字進行比較),通過ToPrimitive()操作將其轉換爲基元 - 要麼與valueOf()toString()對象本身的方法,具體取決於表達式的特性(更多詳細信息here)。

(magic < 1 && magic > 1)(magic < 1 && magic > 1)表達式這樣的投射發生(至少)兩次,這就是兩個片段之間的區別。在第一個中,val的值每次增加2 valueOf()被調用。這很容易檢查,順便說一句,用的console.log():

return { 
    valueOf(){ 
    val = val + 2; 
    console.log(`And now it's ${val}`); 
    return val; 
    } 
} 

...給出了下面的輸出:

現在它的0
現在它的2

然而,第二個片段只給出了this.val + 2的結果,但從未修改this.val,結果始終爲0.如果以這種方式寫入:

valueOf: function(){ 
    return this.val += 2; 
} 

......它的工作原理與第一個完全相同。