如何评估以下Javascript表达式?

时间:2013-03-18 06:53:11

标签: javascript expression

[-1,1][+!!boolean]

我正在调试一个JS代码,在那里我发现了这一行。顾名思义,var boolean可以有true或false值。

4 个答案:

答案 0 :(得分:4)

呃,那真令人恶心。这是正在发生的事情:

!!boolean

这会将boolean转换为true / false布尔值。 !是否定,所以当你做两个时,你强制否定否定或原始的布尔值。基本上,它确实:

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

+将右侧变为数字。 +true - > 1+false - > 0

第一位是一个数组。它通过右侧的任何内容索引该数组文字。

简而言之,如果boolean为真,它将获取第二个元素,否则为第一个元素。

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

一个不太可怕的版本(使用三元组):

var x = boolean ? 1 : -1;

或滥用&&||

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

答案 1 :(得分:3)

第一位创建一个包含两个值的数组:

[-1,1]

第二位通过执行双反转确保“boolean”实际上是一个布尔值:

!!boolean == boolean

plus运算符用于将此布尔值转换为数字,其中true => 1false => 0

最后,这个数字用于选择该数组中的两个值中的一个,即该表达式将“true”变为1,将“false”变为-1。

但是,这可能更具可读性:

boolean ? 1 : -1;

答案 2 :(得分:1)

表达式[-1,1]是一个包含值-11的数组。

第二组括号从数组中获取一个值。例如,如果x是数组,则x[0]获取第一个元素。如果我们写y = [-1,1][0],则与以下内容相同:

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

那么,那么+!!boolean呢? 好吧,!如果它不是“falsy”,则将值转换为布尔值。应用!会再次转换true(如果它是真实的),false如果它是假的。 (我建议使用条款truthy和falsy this google search

最后,+(正)运算符将其转换为数字。将其视为-(否定)运算符的反面。因此+true转换为1+false转换为-1

如果您要采用它的扩展形式并将其作为函数编写,那就是它(在我看来):

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

答案 3 :(得分: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,已完成双重否定将所有虚假值(如false,空数组,未定义,空对象)转换为布尔值false,将truthy值转换为布尔值true。 在它们前面放置一个+将它们转换成一个整数,从而使它成为0或1的有效索引,对于targent数组[-1,1]