Math.max.apply() 如何工作?

IT技术 javascript function apply
2021-02-03 16:58:30

Math.max.apply()工作如何

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <script>
      var list = ["12","23","100","34","56",
                                    "9","233"];
      console.log(Math.max.apply(Math,list));    
  </script>
</body>
</html>

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

上面的代码在List中查找Max数。谁能告诉我下面的代码是如何工作的?如果我通过了,它似乎有效null or Math.

console.log(Math.max.apply(Math,list));

是否所有的user-defined/Native functions都有我们可以使用的调用和应用方法?

5个回答

apply接受一个数组并将该数组作为参数应用于实际函数。所以,

Math.max.apply(Math, list);

可以理解为,

Math.max("12", "23", "100", "34", "56", "9", "233");

因此,apply是一种将数据数组作为参数传递给函数的便捷方式。记住

console.log(Math.max(list));   # NaN

将不起作用,因为max不接受数组作为输入。

使用 的另一个优点是apply,您可以选择自己的上下文。您传递给apply任何函数的第一个参数将是该this函数内部。但是,max不依赖于当前的上下文。所以,任何东西都可以代替Math.

console.log(Math.max.apply(undefined, list));   # 233
console.log(Math.max.apply(null, list));        # 233
console.log(Math.max.apply(Math, list));        # 233

由于apply实际上是在 中定义的Function.prototype,因此任何有效的 JavaScript 函数对象,apply默认情况下都将具有函数。

@Shane 因为,即使我们将上下文设置为undefinedor ,它也能工作null:) 如果max尝试访问/更改上下文中的任何内容,当上下文设置为undefinedor时它会失败null
2021-03-25 16:58:30
@NiCkNewman 在评论部分讨论太广泛了。但是这篇文章this将是一个很好的起点。它也有一个部分call,并apply详述此。
2021-03-30 16:58:30
为什么 null 或 math ?
2021-04-01 16:58:30
有史以来对 .apply() 的最佳解释!
2021-04-04 16:58:30
@NiCkNewman 实际上,Math.max不会使用第一个参数,因为它不需要任何上下文。它只对它在参数中接收到的数据进行操作。
2021-04-05 16:58:30

在 JavaScript ES6 上只需使用Spread 运算符

var list = ["12","23","100","34","56","9","233"];
console.log(Math.max(...list));
//                   ^^^ Spread operator 
要检查“Spread operator”兼容性:kangax.github.io/compat-table/es6/#test-spread_(...)_operator
2021-03-30 16:58:30

谁能告诉我下面的代码是如何工作的?

Math.max.apply(Math,list)

调用Math.max带有Math对象函数,用作this函数实现(主体)中引用并list作为参数传递。

所以这最终等于

Math.max("12","23","100","34","56", "9","233")

如果我通过 null 或 Math,它似​​乎有效。

显然Math.max实现不使用实例变量 - 没有理由这样做。本机实现只会迭代arguments并找到最大值。

是否所有用户定义/本机函数都有我们可以使用的调用和应用方法?。

是的,每个函数都可以使用call调用apply

参考:

我首先要说的是Math.max(...numbers),它Function.prototype.apply()应该只用于元素相对较少的数组。(...) 和 apply 要么失败要么返回错误的结果如果数组太大

Math.max.apply(null | undefined | Math, numbers)Math.max(...numbers)Math.max(...numbers)出于审美原因推荐的相同

const numbers = [5, 6, 2, 3, 7];

const max = Math.max(...numbers);

console.log('max:', max);
// expected output: 7

const min = Math.min(...numbers);

console.log('min:', min);
// expected output: 2

如果需要在非常大的数值数组中查找最大元素:使用Array.reduce()方法。

Array.reduce() 可用于通过比较每个值来查找数值数组中的最大元素:

const numbers = [5, 6, 2, 3, 7];
const getMax = (numbers) => numbers.reduce((a, b) => Math.max(a, b));

const getMin = (numbers) => numbers.reduce((a, b) => Math.min(a, b));
	
const max = getMax(numbers)
const min = getMin(numbers)

console.log('max:', max)
console.log('min:', min)

结论:

比较小的Math.max(...numbers) 数值数组:使用非常大的数值数组:使用Array.reduce()方法

JavaScriptCore 引擎的硬编码参数限制为 65536,因此在使用 apply() 时,您应该确保数组大小始终较小。
2021-04-02 16:58:30

Math.max(val1, val2,...)

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...是参数,必须是数字MDN Math.max

你不能array作为Math.max参数传递要传递数组,您必须使用apply.

申请

apply 的第一个参数是this,第二个是array数学方法在其他语言中等价于静态,这意味着它不需要与 不同的对象实例,array.prototype.slice因此this在这种情况下您不需要传递

例子

var arr = [1, 2, 3];

Math.max(1, 2, 3);  // -> 3
Math.max(arr);      // -> NaN (Not a Number)
Math.max.apply(null, arr);  // Math.max.apply(null, [1, 2, 3]) -> Math.max(1, 2, 3) -> 3

arr.slice(1);  // -> returns Array [2, 3]
Array.prototype.slice.call(arr, 1); // Array.prototype.slice.call([1, 2, 3], 1) == [1, 2, 3].slice(1)

当您想将数组作为参数传递时,您必须使用apply,否则使用call.

一个pply =一个rray
Ç所有= Ç OMMA分离
更多关于呼叫&申请