这个条件语句是如何工作的?

How does this conditional statement work?

此函数查找数组的中间值。但是条件语句对我来说毫无意义,因为 arr.length === 0 永远不会为真,但该函数仍然适用于偶数和奇数。我认为条件应该是 arr.length % 2 !== 0 并且它也有效,但即使那样我也看不到正确的值是如何 returned 的,因为对于 1-13 的数组,函数将 return 13/2 = 6.5 的 Math.floor 是 6,但它 return 是 7。对于数组 1-12,它将 return 的 Math.ceil (12-1)/2 = 5.5 也是 6,但它又是 returns 7,这是它应该做的,但我不明白条件语句是如何产生这个结果的。

let x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
// if even, the number closer to end is returned

function findMiddle(arr) {
   return arr.length === 0 ? arr[Math.floor(arr.length / 2)]
   : arr[Math.ceil((arr.length - 1) / 2)];
}

console.log(findMiddle(x))

如果arr没有元素,这个函数returns arr[0]不存在,所以会报错。 (编辑:这会发生在任何其他语言中,但 javascript 实际上是 javascript returns 未定义)

对于偶数个元素,它 returns 两个 middle-elements 中的第二个 middle-elements。

对于奇数个元素,它returns中间那个。

在您的示例中,它 returns 索引 6 处的元素。该元素的值为 7。

由于条件始终为假,此函数将始终 return 第一个值,即 arr[Math.ceil((arr.length - 1) / 2)],我认为这始终是正确的。

  • 对于第一个示例(从 1 到 13 的数组):arr.length13,arr.length / 2 将是 6.5,然后 Math.ceil(arr.length / 2) 将是 7 最后 arr[Math.ceil(arr.length / 2)] 将导致 arr[7]8
  • 对于第二个示例(1 - 12 的数组):arr.length12,arr.length / 2 将是 6,然后 Math.ceil(arr.length / 2) 将是 6 最后 arr[Math.ceil(arr.length / 2)] 将导致 arr[6]7.

结论:条件是什么都不做。如果你总是给它提供 non-empty 数组,那是完全没用的。在这种情况下,您的功能将很简单:

function findMiddle(arr) {
   return arr[Math.ceil(arr.length / 2)]
}

它会给出相同的结果。