如何评估以下Javascript表达式?
呃,那太恶心了。这里是发生了什么:
!!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;
或&&
和||
滥用:
var x = (boolean && 1) || -1;
谢谢!其实我正在浏览一个插件代码,无论这条线看起来多么恶心,对我来说都是有意义的。 – 2013-03-18 07:22:40
它正试图从首先选择一个元素阵列,基于一个变量:
[-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]
第一比特创建具有两个值的数组:
[-1,1]
第二位确保“布尔”,实际上是通过执行双反转的布尔值:
!!boolean == boolean
的加运算符用于这个布尔转变成一个数,其中true => 1
和false => 0
。
最终,这个数字用于选择该数组中的两个值之一,即该表达式将“true”变为1,将“false”变为-1。
然而,这可能会有点更可读:
boolean ? 1 : -1;
太少了! – slebetman 2013-03-18 07:05:03
表达[-1,1]
是包含值-1
和1
阵列。第二组括号从数组中取出一个值。例如,如果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 ];
}
你在哪里找到这样的代码??? – tjameson 2013-03-18 07:05:22