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

我在调试 JS 代码时发现了这一行。顾名思义,var boolean 可以具有真值或假值。

4

4 回答 4

4

嗯,真恶心。这是发生了什么:

!!boolean

这变成boolean了一个真/假布尔值。是!否定,所以当你做两个时,你强制否定的否定,或者原始的布尔值。基本上,它确实:

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;

或滥用&&and ||

var x = (boolean && 1) || -1;
于 2013-03-18T07:00:30.797 回答
3

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

[-1,1]

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

!!boolean == boolean

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

最终,该数字用于选择该数组中的两个值之一,即该表达式将“真”变为 1,将“假”变为 -1。

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

boolean ? 1 : -1;
于 2013-03-18T07:01:57.813 回答
1

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

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

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

那么,现在呢+!!boolean?好吧,!如果它不是“假的”,则将值转换为布尔值。如果它是真的,如果它是假的,那么再次应用!就会转换它。(我推荐这个谷歌搜索的术语真假)truefalse

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

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

function( value ){
    var  output_values  =  [ -1, 1 ]
      ,  boolean        =   !!value
      ,  index          =    +boolean
      ;        
    return output_values[ index ];
}
于 2013-03-18T07:08:53.813 回答
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]将根据 boolean 的值返回 0 或 1,已完成双重否定以将所有虚假值(如 false、空数组、未定义、空对象)转换为布尔值 false,并将真值转换为布尔值 true。将 a+放在它们前面会将它们类型转换为整数,从而使其成为目标数组 [-1,1] 的有效索引 0 或 1

于 2013-03-18T07:01:55.977 回答