Javascript 理解复三元算子

Javascript 理解复三元算子,javascript,ternary-operator,Javascript,Ternary Operator,我刚刚浏览了inArray方法代码,发现了以下内容: inArray: function (elem, arr, i) { var len; if (arr) { if (indexOf) { return indexOf.call(arr, elem, i); } len = arr.length; i = i ? i < 0 ? Math.max(0, len + i) : i

我刚刚浏览了inArray方法代码,发现了以下内容:

inArray: function (elem, arr, i) {
    var len;

    if (arr) {
        if (indexOf) {
            return indexOf.call(arr, elem, i);
        }

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

        for (; i < len; i++) {
            // Skip accessing in sparse arrays
            if (i in arr && arr[i] === elem) {
                return i;
            }
        }
    }

    return -1;
},
inArray:函数(元素、arr、i){
瓦伦;
如果(arr){
if(indexOf){
返回调用索引(arr,elem,i);
}
len=arr.长度;
i=i?i<0?数学最大值(0,len+i):i:0;
对于(;i
现在我明白了十进制运算符是如何工作的,但是有人能告诉我下面这行代码是如何工作的吗?它甚至是一个三元运算符吗

i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
i=i?i<0?max(0,len+i):i:0;
还是JS中的某种新构造

多谢各位

Alex-z.

原始声明:

i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
其工作原理如下:

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

它是两个嵌套的三元运算符。你可以这样读:

i = i ? (i < 0 ? Math.max( 0, len + i ) : i) : 0;
您可以稍微缩短
if/else
结构:

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

if(i&&i<0)
i=数学最大值(0,len+i);
如果(!i)
i=0;
这将删除冗余的
否则i=i
。在三元语句中,需要
else
,但此处可以省略



请记住,您在这些
if/else
语句中看到的所有
i=
赋值都基于三元运算符前面的单个
i=
赋值。三元运算符本身(
a?b:c
)不为变量赋值。

在简单的逻辑中,当你编码它时,你会想到什么。请注意,此函数不捕获未定义、nan的空值、字符串、浮点、布尔值、字节或正常流捕获的任何可以输入的内容

我相信这就是简化逻辑背后的意图。当我编写这样的代码时,这就是我脑海中的想法

function calculatewhat(i) {
    if(i != 0) {/*i = i;*/ // i gets assigned and then evaluated. 
                           //If its anything but zero it's true, if its zero its false.
        if(i < 0) { // Test if its smaller than zero
          return Math.max( 0, len + i ) ; 
        }
        else { // its bigger than 0
           return i 
        }
    else { // if its 0... but you could just as wel return i 
           // instead of creating a new variable for the return since i is zero.
       return 0;
    }
}
函数计算内容(i){
如果(i!=0){/*i=i;*///i被赋值,然后求值。
//如果不是零,那就是真的,如果是零,那就是假的。
如果(i<0){//如果它小于零,则测试
返回Math.max(0,len+i);
}
否则{//它大于0
返回i
}
否则{//如果是0…但你也可以返回i
//而不是为返回值创建新变量,因为i为零。
返回0;
}
}
我会对它进行编码,而不是像下面这样嵌套

i = i < 0 ? Math.max( 0, len + i ) : i
i=i<0?数学最大值(0,len+i):i
为了让Cerburs满意,这就是它真正的工作原理

function calculatewhat(i) {
    if(i) { //check if its a true value. This will evaluate true also on "1", "blah",true, etc... 
             //To be typesafe you should make it an integer test. if(typeof i === 'number' && i !== 0);
        if(i < 0) { // Test if its smaller than zero This will also return true on "-20" and -20.555
          return Math.max( 0, len + i ) ; 
        }
        else { // its bigger than 0 return i. but its type can be anything but an integer, so beware.
           return i 
        }
    else { //it's not a number or its 0. 
           //We can't be sure about type so lets return 0 to i making it a valid integer.
       return 0;
    }
}
函数计算内容(i){
如果(i){//检查它是否为真值。这将在“1”、“布拉”、“真”等上计算真值。。。
//为了确保类型安全,您应该将其设置为整数测试;
如果(i<0){//测试其是否小于零,则在“-20”和-20.555上也将返回真值
返回Math.max(0,len+i);
}
else{//它大于0返回i。但是它的类型不能是整数,所以要小心。
返回i
}
否则{//它不是一个数字或它的0。
//我们无法确定类型,因此让我们将0返回给i,使其成为有效整数。
返回0;
}
}

它是两个嵌套的三元组

展开外层将为我们提供:

var x;
if (i) {
  x = i < 0 ? Math.max( 0, len + i ) : i;
} else {
  x = 0;
}
i = x;
varx;
如果(i){
x=i<0?数学最大值(0,len+i):i;
}否则{
x=0;
}
i=x;
展开内部分支,然后给出:

var x;
if (i) {
  if (i < 0) {
    x = Math.max( 0, len + i );
  } else {
    x = i;
  }
} else {
  x = 0;
}

i = x;
varx;
如果(i){
if(i<0){
x=数学最大值(0,len+i);
}否则{
x=i;
}
}否则{
x=0;
}
i=x;
x表示重新分配给i的临时值

帕伦夫妇可能会有所帮助(父母或新郎应该在任何时候打破这些障碍,只要它们比简单得多):

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

现在你可以看到隐藏在真分支中间的子表达式,

其实这就足够了:

if (i < 0) {
  return Math.max(0, len + I);
}
if(i<0){
返回Math.max(0,len+I);
}

i=i?
一开始,这是一个检查吗?还是只是用一个值初始化i?我发现很难相信
i=i
的计算结果是
if(i){}
!,但如果是这样的话,那么我猜js就是这样工作的。
i=i
来自三元语句中最后一个
:i
。当使用
if/else
结构时,
else
不是必需的。
if(i)…else i=0;
(第三个灰框)被分配给
if(i<0)
而不是外部if。为了学究式,if语句中没有对
i
赋值。给定的三元组没有副作用,而这些三元组将左赋值与右赋值相结合。在本例中,这是100%正确的,但在将三元组作为一个概念进行教学时有点虚伪。不,它是d否则,OP的三元代码中没有
return
语句。三元运算符返回它的值smartass。
var x=true?“hello”:“world”;
使x为真。这是一个返回。他想知道它做了什么。这基本上就是它做的。它将真值返回给赋值人。如果OP盲目地用代码替换三元语句,他会让他的函数过早返回。变量赋值和返回值之间有很大的区别。是的,但他想要ed想知道它是如何工作的。如果你在函数调用中发布它,这就是它的工作原理。这有助于理解三元操作将值返回给你,就像你在调用一样
function calculatewhat(i) {
    if(i) { //check if its a true value. This will evaluate true also on "1", "blah",true, etc... 
             //To be typesafe you should make it an integer test. if(typeof i === 'number' && i !== 0);
        if(i < 0) { // Test if its smaller than zero This will also return true on "-20" and -20.555
          return Math.max( 0, len + i ) ; 
        }
        else { // its bigger than 0 return i. but its type can be anything but an integer, so beware.
           return i 
        }
    else { //it's not a number or its 0. 
           //We can't be sure about type so lets return 0 to i making it a valid integer.
       return 0;
    }
}
var x;
if (i) {
  x = i < 0 ? Math.max( 0, len + i ) : i;
} else {
  x = 0;
}
i = x;
var x;
if (i) {
  if (i < 0) {
    x = Math.max( 0, len + i );
  } else {
    x = i;
  }
} else {
  x = 0;
}

i = x;
i = i ? ( i < 0 ? Math.max( 0, len + i ) : i ) : 0;
if (i < 0) {
  return Math.max(0, len + I);
}