2013-03-18 83 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 ]; 
}