繁体   English   中英

在FOR循环中放置0将返回不需要的结果

[英]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 = 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)
}

MDN上Math.max()文档中

如果未提供任何参数,则结果为-Infinity

如果至少一个参数不能转换为数字,则结果为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; } 

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循环中执行返回指令,则会中断它。

移动退货是必要的。 但是在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为空,这甚至会返回undefined的可能是意外的但可以说是正确的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM