将 0 放入 FOR 循环 returns 不需要的结果

Placing 0 in a FOR loop returns unwanted result

我开始学习 JavaScript,目前为止很享受。 我有这个循环(目的是罚款数组内的最高数字):

function max(arr) {
  var max = arr[0]; 
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] > max) {
      max = arr[i];
    }
    return max;
  }
}

但它不起作用,除非我将 i 更改为 i = 1。有人可以解释为什么吗?谢谢!

function max(arr) {
  var max = 0; 
  for (var i = 0; i < arr.length; i++) {
   if (Math.max(arr[i], max) == arr[i]) {
      max = arr[i];
   }
  }
  return max;

}

如果您在 for 循环中创建 return 指令,它会中断它。

移动 return 是必要的。但是 i=1 你永远看不到数组的第一个元素。

function max(arr) {
   var max; 
   for (var i = 0; i < arr.length; i++) {
      if ((max !== undefined) && (arr[i] > max)) {
         max = arr[i];
      }
   }
   return max;
}

如果 arr 为空,这甚至 return undefined 的可能出乎意料但可以说是正确的值。

问题

在您的实施尝试中,您有一个逻辑错误:

function max(arr) {
  var max = arr[0]; 
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] > max) {
      max = arr[i];
    }
    // return max; <-- this always returns arr[0]
  }
  return max; // <-- it should be here to work as expected
}

另一个改进是从 var i = 1 开始,因为在开始 for 循环之前您已经将 arr[0] 的初始值分配给 max

但下面是一个更好、更健壮的实现。

解决方案

从技术上讲,您应该这样做以解决空数组、具有负值的数组、格式错误的值或可强制转换为有效数字的值:

function myMax(array) {
  var max = -Infinity

  for (var index = 0, value; index < array.length; index++) {
    // coerce element to number
    value = Number(array[index])
    // short-circuit for malformed value
    if (isNaN(value)) return value
    if (value > max) max = value
  }

  return max
}

匹配 Math.max()

的 ECMAScript 规范

对于所有可能的数组输入(空或非空),这在功能上等同于以下实现:

function max(array) {
  return Math.max.apply(Math, array)
}

来自documentation for Math.max() on MDN

If no arguments are given, the result is -Infinity.

If at least one of arguments cannot be converted to a number, the result is NaN.

演示

function myMax(array) {
  var max = -Infinity

  for (var index = 0, value; index < array.length; index++) {
    // coerce element to number
    value = Number(array[index])
    // short-circuit for malformed value
    if (isNaN(value)) return value
    if (value > max) max = value
  }

  return max
}

function specMax(array) {
  return Math.max.apply(Math, array)
}

function test(input) {
  var set = new Set()
  console.log('input:', JSON.stringify(input))
  set.add(myMax(input))
  console.log('output:', myMax(input), '[myMax(input)', set.has(specMax(input)) ? 'matches' : 'does not match', 'specMax(input)]')
}

test([-50, 25, 0, 50, -25])
test([-100, -80, -90, -85, -95])
test([])
test([0, 'malformed', 100, 20])
test([1, 2, 3, 4, ' 5.e0  \t\r\n'])
test([{
  toString () { return '200' },
  valueOf () { return 100 },
  toJSON () {
    return {
      "toString()": this.toString(),
      "valueOf()": this.valueOf()
    }
  }
}])
.as-console-wrapper {
  max-height: 100% !important;
}