我写了一个函数getMax
,它模拟Math.max可以从一组数字中获得最大数。该函数接受可变参数。
我使用Array.prototype.slice(arguments)
将它们变成一个真实的数组。但是我失败了,我得到了一个空数组[]。如果使用Array.from(arguments)
,我将获得正确的数组。我不知道为什么Array.prototype.slice(arguments)
的传统方式对我不起作用。
此函数的另一个问题是,在获得正确的参数数组之后,getMax
的返回值为undefined
,但在{{ 1}}函数让我非常困惑。
return value 7
答案 0 :(得分:1)
Array.prototype.slice(arguments)
与
基本相同 [].slice(arguments)
(在第一种情况下,this
是Array.prototype
,但这或多或少等于在空数组上调用它)
...,这将返回一个空数组,因为从一个空数组进行切片将始终导致一个空数组。您可能想这样做:
Array.prototype.slice.call(arguments)
调用.slice
为this
的{{1}},因此它会生成想要的数组,但是我更喜欢arguments
或Array.from(arguments)
,甚至更好的是一个rest参数:
[...arguments]
此函数的另一个问题是,当我获得正确的参数数组后,getMax的返回值是不确定的,但是我在filterMax函数中却得到了返回值7,这使我感到困惑
好吧,那是因为:
function findMax(...numbers) {
//...
}
过滤掉所有大于第一个的数组元素(在您的示例中,5和7大于3),因此代码进入else分支...
let maxValue = arr[0];
let resultArr = arr.filter(function(value) {
return value > maxValue;
});
...并返回 nothing (又名 resultArr = filterMax(resultArr);
)。您可能想要
undefined
总共:
return filterMax(resultArr);
答案 1 :(得分:0)
call
将参数转换为实数数组。 filterMax
返回getMax
,但是从filterMax
返回任何东西。您需要返回resultArr
function getMax() {
"use strict";
let filterMax = function(arr) {
let maxValue = arr[0];
let resultArr = arr.filter(function(value) {
return value > maxValue;
});
if (resultArr.length == 0) {
return maxValue; //output: 7
} else {
resultArr = filterMax(resultArr);
}
return resultArr;
};
//let args = Array.from(arguments); //output: [ 3, 7, 2, 5, 1, 4 ]
let args = Array.prototype.slice.call(arguments); //output: []
console.log(args); //output: []
return filterMax(args); //output: undefined
}
console.log(getMax(3, 7, 2, 5, 1, 4)); //output: undefined
答案 2 :(得分:0)
您的arguments
是Object
,而不是Array
。它可以与Array.prototype.slice.call(arguments)
一起使用。
您还忘记了在filterMax()
函数中返回值。
function getMax() {
"use strict";
let filterMax = function(arr) {
let maxValue = arr[0];
let resultArr = arr.filter(function(value) {
return value > maxValue;
});
if (resultArr.length == 0) {
return maxValue; //output: 7
} else {
resultArr = filterMax(resultArr);
// you forgot to return a value here
return resultArr
}
};
// Your arguments is an Object, not an array
console.log('arguments:', arguments)
// let args = Array.from(arguments); //output: [ 3, 7, 2, 5, 1, 4 ]
// If you do it like this, it works:
let args = Array.prototype.slice.call(arguments); //output: []
console.log(args); //output: []
return filterMax(args); //output: undefined
}
console.log(getMax(3, 7, 2, 5, 1, 4)); //output: undefined