1

这是一个非常简单的例子,我希望你们中的一些人能回答。这是一个应该返回参数中给定的最大值的函数。但问题是我不明白它是如何做到的。

function max(a, b) {
  return [a, b][ +(a < b) ];
}

我已经习惯了像这样的 max 函数,所以我不知道上面是如何工作的:

function max(a, b) {
    return a > b ? a : b;
}

如果有人可以向我解释这段代码是如何找到最大数字的,那将非常有帮助。例如,他为什么使用数组?为什么+以这种方式使用一元?(我是 JS 新手)。

4

4 回答 4

6

(a < b)- 评估为布尔值true/false

+(a < b) 将布尔值类型转换为 int,因此您将拥有01

[+(a < b)] - 成为数组索引,[0][1]

[a,b][+(a<b)]- 使用[0]or [1],将从新的临时数组中提取aor值。b[a,b]

于 2012-11-30T21:51:32.733 回答
2

如果a小于b,则结果为,由于一元运算符true,它转换为数字。1+

否则结果是false,它转换为0.

因此0and1用作索引以从数组中获取值。


可以这样想:

function max(a, b) {
    var arrayOfValues = [a, b],
        a_is_less_than_b = a < b,
        index;

    if (a_is_less_than_b)
       index = 1;
    else
       index = 0;

    return arrayOfValues[index];
}
于 2012-11-30T21:51:17.690 回答
1

设想:

  1. [a, b]创建一个包含索引为 0 和 1 的两个元素的数组;
  2. (a < b)返回一个布尔值truefalse
  3. +(false|true)正在将布尔值转换为数字类型,因此它变为 0 或 1;
  4. [a, b][0|1]从相应索引下的数组中返回元素。

例子:

 var a = 1, b = 2;
  1. [1, 2];
  2. (1 < 2) === true;
  3. +(true) === 1;
  4. [1, 2][1] === 2.
于 2012-11-30T21:52:45.723 回答
0

a您创建一个由和组成的数组b,然后决定您想要的索引。我会扩展它:

function max(a, b) {
  var arr = [a,b];
  var aLTb = (a < b); // a boolean - whether or not a is less than b
  var index = +aLTb; // convert boolean to 0 or 1, which gives us an index
  return arr[index];
}
于 2012-11-30T21:50:49.090 回答