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



我开始学习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
}

匹配 ECMAScript 规范Math.max()

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

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

来自 MDNMath.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  trn'])
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 值。

最新更新