理解复杂的 inArray 三元运算符

Ale*_*nik 3 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 : 0;

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

    return -1;
},
Run Code Online (Sandbox Code Playgroud)

现在我明白了十进制运算符是如何工作的,但是有人可以告诉我,下面的代码行是如何工作的?它甚至是三元运算符吗?

i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
Run Code Online (Sandbox Code Playgroud)

或者它是 JS 中的某种新构造?

谢谢。

亚历克斯-Z。

Tus*_*har 6

原声明:

i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
Run Code Online (Sandbox Code Playgroud)

为了更好地理解它,

i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0;
//      ^                                ^
Run Code Online (Sandbox Code Playgroud)

是的,这是嵌套的ternary operator ? :

以下是if else上述语句的表示,按if..else步骤表示。

if (i) {
    i = i < 0 ? Math.max(0, len + i) : i;
} else {
    i = 0;
}
Run Code Online (Sandbox Code Playgroud)

其工作原理如下:

if (i) {
    if (i < 0) {
        i = Math.max(0, len + i);
    } else {
        i = i;
    }
} else {
    i = 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 迂腐地说,if 语句中没有对“i”进行赋值。给定的三元组没有副作用,而它们将左侧的赋值与右侧的评估相结合。在这个例子中,这 100% 没问题,但在教授三元概念时有点不诚实。 (2认同)