Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的双三元_Javascript - Fatal编程技术网

JavaScript中的双三元

JavaScript中的双三元,javascript,Javascript,我浏览了jQuery源代码中的一些内容,特别是inArray方法,发现了以下代码行: i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; i=i?i

我浏览了jQuery源代码中的一些内容,特别是
inArray
方法,发现了以下代码行:

i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
i=i?i<0?max(0,len+i):i:0;

我看到的是两个三元运算符,但我不知道如何使用它。我知道三元运算符是如何工作的,但我以前从未见过这样使用它。这段代码是如何工作的呢?

就像你将它分解成
1+2+3

if (i) {
    if (i < 0) {
        i = Math.max(0, len + i);
    } else {
       i = i; // no-op
    }
} else {
    i = 0; // also no-op, since if `i` were anything else it would be truthy.
}
if(i){
if(i<0){
i=数学最大值(0,len+i);
}否则{
i=i;//无操作
}
}否则{
i=0;//也没有op,因为如果'i'是其他任何东西,那就是真实的。
}
事实上,在我看来,整个生产线似乎效率低下。就我个人而言,我只会使用:

if (i < 0) { 
    i = Math.max(0, len + i);
}
if(i<0){
i=数学最大值(0,len+i);
}

i=i?i<0?max(0,len+i):i:0

细分为:

var i;

if(i){
  if(i<0){
   i = Math.max(0, len + i);
  }else{
    i = i;
  }
}else{
  i = 0;
}
vari;
如果(i){
如果(i有可能,“i”是数组的索引,“len”是数组的长度吗

如果是这样,则该行将执行以下操作:

  • 如果我可以等同于false,那么假设它是0

  • 否则,如果i为正或0,则按原样处理

  • <如果> i是负的,则将其视为从数组末尾计数的索引(即,如果i==1,则表示数组的最后一个元素)。

    i=i?i<0?数学最大值(0,len+i):i:0;
    
    读到

    i = i ? ( i < 0 ? Math.max( 0, len + i ) : i ) : 0;
    
    i=i?(i<0?数学最大值(0,len+i):i:0;
    
    完全符合您的期望;将其分解。i=i((i<0)数学。max(0,len+i):i如何:0;编写这样没有括号的代码的人..或者编写这样的代码的人..炫耀,但做得不正确。在现代JavaScript教程中,这也是一个很糟糕的例子:谢谢你澄清了这一点。我们为什么要做
    Math.max(0,len+1)
    ?我意识到要找到最大的值,但为什么会发生这种情况?没有op代表什么?没有操作。值没有任何变化。这是Math.max(I,len+I)。这是一个i而不是1。原始的三元语句处理
    i
    未定义或为false的情况,并将其设置为
    0
    。我认为您在缩短的版本中可能会遗漏这一点。
    i = i ? ( i < 0 ? Math.max( 0, len + i ) : i ) : 0;