2015-05-29 74 views
1

我碰到這行代碼來最近,並希望瞭解這意味着什麼,的確,作爲我的JavaScript的foo是不是很燙:+的意思是什麼!在JavaScript?

if ((+!!config.template) + (+!!config.templateUrl) !== 1) {} 

從我所知,這是檢查是否任一選項設置(因此無論是模板,或templateUrl必須設置,而不是兩個或無)

所以,如果config.template設置,

  • + config.template是行不通的(模板不一個號碼)
  • !config.template將返回false(-1)
  • !config.template將返回true(0)
  • + !! config.template因此將返回1

如果config.template是沒有設置,

  • !config.template將返回true(0)
  • !config.template將返回false(-1)
  • + !! config.template因此將回歸0

如果當時你是一樣的,適用config.templateUrl如果設置,則爲0

所以最終的測試是要看到,你最終會得到1如果config.template的總和和config.templateUrl是1(即一個或另一個被設置)

這是否有效的推理?

+3

哇...這有我痛苦地哭泣。 – helpermethod

+4

幾乎正確,除了'+(true)=== 1'和'+(false)=== 0' –

+0

其實上面的表達式等價於'if(!config.template ===!config.templateUrl ){}'。這看起來更簡單。 – kreig

回答

3

布爾值正在通過預先加上+來投射到Number

!!在上面的代碼中檢查上存在的屬性template。如果沒有找到模板!!通常會返回false,但通過預先+,它返回0。無論+!!語句返回數字,當他們加在一起,要麼是0或1。

如果兩個或沒有設定/真正的最後的檢查將返回true(!== 1

+0

當然,我編輯過。 – RoryGilchrist

+1

@RoryGilchrist:如果兩者都設置了,爲什麼代碼會失敗?是的,表達式是2,但是測試檢查!== 1,因此它會執行{}中的代碼(這是作者的意圖 - 消息說「你必須指定一個或另一個) 或者我是厚? – jmls

+1

你是對的,我誤讀了。所以基本上在上面的代碼中,它是要麼沒有設置,要麼兩者都設置,但不僅僅是一個 – RoryGilchrist