【问题标题】:Why does this code excert have to use Math.min.apply rather than just Math.min为什么这段代码必须使用 Math.min.apply 而不仅仅是 Math.min
【发布时间】:2020-08-10 21:54:19
【问题描述】:

我正在阅读来自this post 的以下缩写代码,它获取日期列表中的“最小”日期:

var dates=[];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
var minDate=new Date(Math.min.apply(null,dates));

有人能解释为什么我们需要在这里使用.apply吗?

我知道.apply 用于执行一个提供this 值的函数,但我不明白为什么代码需要使用this=null 调用min 函数以及为什么代码需要替换时不起作用: Math.min.apply(null, dates)Math.min(dates)

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

    这是因为Function.prototype.apply() 方法有两个参数。第一个是新分配的this 值,第二个是将传递给被调用函数的参数数组。

    您的示例对第一个参数没有做任何特殊的事情,但对第二个参数却有。

    Math.min() 接受无限数量的参数。您的示例将日期数组作为参数传递,并将数组中的项目作为参数传播。现在你可以用扩展语法做这样的事情。

    var minDate = new Date(Math.min(...dates));
    

    【讨论】:

      【解决方案2】:

      Math.min 需要一个或多个值作为参数传递。由于日期字符串已被推入数组,因此传递数组只会使用数组作为值,而不是日期。

      使用apply 将数组的元素作为参数传递,它实际上与使用扩展语法相同:

      Math.min(...dates);
      

      因为传递给 apply 的第一个参数是用于 this 的值,而 Math.apply 并不关心 this 是什么, null 被传递(你可以传递任何值)。

      在 ECMAScript 2016(第 7 版)中引入扩展语法之前,这种技术很常见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多