为什么“ Array.prototype.slice(arguments)”给我一个空的“ []”?

时间:2019-09-01 07:12:31

标签: javascript arrays filter arguments

我写了一个函数getMax,它模拟Math.max可以从一组数字中获得最大数。该函数接受可变参数。

  1. 我使用Array.prototype.slice(arguments)将它们变成一个真实的数组。但是我失败了,我得到了一个空数组[]。如果使用Array.from(arguments),我将获得正确的数组。我不知道为什么Array.prototype.slice(arguments)的传统方式对我不起作用。

  2. 此函数的另一个问题是,在获得正确的参数数组之后,getMax的返回值为undefined,但在{{ 1}}函数让我非常困惑。

return value 7

3 个答案:

答案 0 :(得分:1)

 Array.prototype.slice(arguments)

基本相同
 [].slice(arguments)

(在第一种情况下,thisArray.prototype,但这或多或少等于在空数组上调用它)

...,这将返回一个空数组,因为从一个空数组进行切片将始终导致一个空数组。您可能想这样做:

 Array.prototype.slice.call(arguments)

调用.slicethis的{​​{1}},因此它会生成想要的数组,但是我更喜欢argumentsArray.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)

  1. 您需要使用call将参数转换为实数数组。
  2. 第二步,您从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)

您的argumentsObject,而不是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