2013-03-18 95 views

回答

4

呃,那太噁心了。這裏是發生了什麼:

!!boolean 

這原來boolean成真/假布爾值。 !是否定,所以當你做兩個時,你強制否定的否定,或原始的布爾值。基本上,它的作用:

var x = boolean; 
if (x) { 
    x = true; 
} else { 
    x = false; 
} 

+接通右側成多個。 +true1+false0。第一位是數組。它是通過右側的任何數據索引數組字面值。

總之,如果boolean是真的,它將抓住第二個元素,否則第一個。這

[-1,1][+!!true] === 1 
[-1,1][+!!false] === -1 

一個更可怕的版本(使用三元):

var x = boolean ? 1 : -1; 

&&||濫用:

var x = (boolean && 1) || -1; 
+0

謝謝!其實我正在瀏覽一個插件代碼,無論這條線看起來多麼噁心,對我來說都是有意義的。 – 2013-03-18 07:22:40

0

它正試圖從首先選擇一個元素陣列,基於一個變量:

[-1,1][INDEX BASED ON BOOLEAN VALUE] 

的代碼等同於:

var myArr = [-1,1]; 
var selected = null; 
if(boolean === false){ 
    selected = myArr[0]; 
} 
else { 
    selected = myArr[1]; 

}

釋:

[+!!boolean]將返回0或1基於布爾值,否定之否定已經做了所有falsy值轉換像false,空數組,未定義,空對象爲布爾值false,並且truthy值爲布爾值true。 在他們面前把一個+類型轉換它們成一個整數,從而使得有效的索引0或1,爲對targent陣列[-1,1]

3

第一比特創建具有兩個值的數組:

[-1,1] 

第二位確保「布爾」,實際上是通過執行雙反轉的布爾值:

!!boolean == boolean 

的加運算符用於這個布爾轉變成一個數,其中true => 1false => 0

最終,這個數字用於選擇該數組中的兩個值之一,即該表達式將「true」變爲1,將「false」變爲-1。

然而,這可能會有點更可讀:

boolean ? 1 : -1; 
+0

太少了! – slebetman 2013-03-18 07:05:03

1

表達[-1,1]是包含值-11陣列。第二組括號從數組中取出一個值。例如,如果x是一個數組,則x[0]獲取第一個元素。如果我們寫y = [-1,1][0],這是一樣的如下:

var x = [-1,1]; 
y = x[0]; 

所以,現在怎麼樣+!!boolean? 那麼,!將值轉換爲布爾值,如果它不是「falsy」。如果是真的,則應用!再將其轉換爲true,如果它是虛假的,則應用false。 (我推薦this google search關於truthy和falsy的條款)

最後,+(正數)運算符將其轉換爲數字。將其想象爲與-(負數)運算符相反。所以+true轉換爲1+false轉換爲-1

如果你把它的擴展形式,並把它寫成一個函數,這將是它(在我看來):

function(value){ 
    var output_values = [ -1, 1 ] 
     , boolean  = !!value 
     , index   = +boolean 
     ;   
    return output_values[ index ]; 
}