怎么快捷传入数组里的每一项,而不是一个一个传入数组里的每一项?

郁甜
  • 3
新手上路,请多包涵
  var myMath = {
    PI: 3.141592653,
    max: function () {
      var max = arguments[0];
      for (var i = 0; i < arguments.length; i++) {
        if (arguments[i] > max) {
          max = arguments[i];
        }
      }
      return max;
    },
  };
  var arr = myMath.PI.toString().split("");
  var n = arr.indexOf(".");
  arr.splice(n, 1);
  console.log(
    myMath.max(
      arr[0],
      arr[1],
      arr[2],
      arr[3],
      arr[4],
      arr[5],
      arr[6],
      arr[7],
      arr[8],
      arr[9]
    )
  );

要求 :输出对象里PI属性的值里的最大的数字 (应该输出9)
现在可以输出9,但是在写console.log(myMath.max())时,只能写arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9],但PI的值要是非常长,写起来就不方便了,怎么写可以实现无论PI多长都能输出里面最大的那个数字

回复
阅读 1.2k
4 个回答

Math.max(...arr)

ES6 自 2015 年发布,已经 6+ 年了,该用就用

// 尽量不使用 var,优选使用 const,确实需要修改用 let
const myMath = {
    PI: 3.141592653,
    // 推荐使用 Rest Argument,不直接使用 arguments
    // 不过 arguments 是个可枚举的 Array Like,同样可以使用展开运算符 ...
    max: function (...args) {
        // Math.max 可以直接找出最大数,兼容字符串表示的数,比如 "1234"
        return Math.max(...args);
        // 如果想自己写找最大值,可以用 reduce 来遍历,初始值负无穷,没有比它更小的了
        // return args.reduce((max, n) => n > max ? n : max, -Infinity);
    },
};

// 可以按 . 号拆分,限制拆分成 2 段,用后一段,可以不用找索引
// 直接对字符串用展开运算符,可拆分成字符数组
const arr = [...myMath.PI.toString().split(".", 2)[1]];
console.log(myMath.max(...arr));

去掉注释,会发现这段代码其实很短……

使用apply方法调用函数:

console.dir(myMath.max.apply(null, arr));

或者重新修改下max函数使其支持传入数组参数:

var myMath = {
    PI: 3.141592653,
    max: function() {
        var args = arguments, max;
        if (args[0] instanceof Array) args = args[0];
        for (var i = 0; i < args.length; ++i) {
            if (args[i] > (max || 0)) max = args[i];
        }
        return max;
    },
};
console.dir(myMath.max(arr));     // 9
console.dir(myMath.max(...arr));  // 9
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏