【问题标题】:apply and call method to find maximum from an array of numbers in javascript?应用并调用方法以从 javascript 中的数字数组中查找最大值?
【发布时间】:2015-09-07 04:51:51
【问题描述】:

好的。所以我知道 Math.max 不接受数组作为参数,所以我们使用 apply 方法从数组中找到最大值或最小值:

var numbers = [2,3,56,7,1];
var max = Math.max.apply(null,numbers); 
console.log(num); //output- 56

是否可以对同一个问题使用 Call 方法。我知道 Call 方法接受参数列表,而 Apply 方法接受单个数组作为参数。

我们如何使用Call方法找到数组的最大值和最小值?

我尝试将数组转换为字符串:-

var s = numbers.join(", ");

但是由于 s 的数据类型是字符串,我们如何将调用方法作为参数列表给出呢?

我做到了:-

console.log(Math.max(null, s)); // output- NaN

我知道这是错误的。

【问题讨论】:

  • 当你使用join时,变量是string类型,包含逗号分隔的数字,所以max返回NaN
  • “是否可以对同一个问题使用 Call 方法”
  • 我还在努力理解这个问题:-)
  • FYI ~ 使用 ES6 你可以使用spread operator
  • 使用apply 的全部意义在于它接受作为数组的参数。所以使用apply的原因是能够传递一个数组,而不是apply的实际预期用途,即能够定义this的值。 Math.max.apply(null, [1, 2, 3]);Math.max(1, 2, 3); 是一样的,这就是使用它的重点。所以不,你不能使用call,因为call 单独接受参数而不是数组。

标签: javascript call apply


【解决方案1】:

不,.call() 无法真正解决这个问题。它只是没有做你想做的事。

.call() 要求您将每个参数单独传递给主机函数。因此,如果您提前知道数组中有多少项,或者您针对所有可能的长度进行了编码,则只能使用Math.max() 来查找数组中的最大值。基本上,参数在任意长度数组中的情况是 .apply() 的构建目的,而不是 .call() 的构建目的。

此外,如果您可以按照.call() 的要求手动传递参数并且您没有尝试设置自定义this 值,那么根本没有理由使用.call(),您也可以直接调用函数而不使用.call()。所以,我找不到任何理由使用 .call() 来解决这个特定问题。

这是几天前关于.call().apply()some more info written,包括有关在此特定问题上使用.apply()Math.max() 的信息。


看你的具体例子:

var numbers = [2,3,56,7,1];
var max = Math.max.apply(null,numbers); 
console.log(max); //output 56

如果您不想使用.apply(),那么您可以执行以下任一操作:

var numbers = [2,3,56,7,1];
var max = Math.max(2,3,56,7,1);

var numbers = [2,3,56,7,1];
var max = Math.max.call(Math, 2,3,56,7,1);

但是,正如您所看到的,.call() 示例完全没有增加任何价值,只是直接调用该函数,因为您没有尝试设置自定义 this 值,并且两个示例都需要显式命名每个参数,因此它们不会在编写代码时,不要使用长度未知的数组。这个例子是专门为.apply() 构建的,而不是为.call() 构建的。这就是为什么我们有这两种选择的原因,因为它们是为不同的情况而设计的。


请注意,使用 ES6,您可以使用 spread operator,它是传递参数的简写,就像 .apply() 在没有自定义 this 值的情况下所做的那样:

var numbers = [2,3,56,7,1];
var max = Math.max(...numbers);

它会为你解决问题。

【讨论】:

    【解决方案2】:

    从技术上讲,以下方法可以解决上述问题,但这样做没有什么意义。也许这是一些家庭作业问题或类似问题?

    function findMax(arr) {
        var max = Number.MIN_VALUE;
        for (var i = 0, len = (arr || []).length; i < len; i++) {
            max = Math.max.call(Math, max, arr[i]);
        }
        return max;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多