Math.max.apply () hoạt động như thế nào?


82

Làm thế nào để Math.max.apply()làm việc ?.

<!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

Đoạn mã trên tìm số Max trong Danh sách. Bất cứ ai có thể cho tôi biết mã dưới đây hoạt động như thế nào? Có vẻ như nó hoạt động nếu tôi vượt quanull or Math.

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

Có tất cả user-defined/Native functionsphương thức gọi và áp dụng mà chúng ta có thể sử dụng không ?.

Câu trả lời:


136

applychấp nhận một mảng và nó áp dụng mảng làm tham số cho hàm thực. Vì thế,

Math.max.apply(Math, list);

có thể hiểu là,

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

Vì vậy, applylà một cách thuận tiện để truyền một mảng dữ liệu dưới dạng tham số cho một hàm. Nhớ lại

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

sẽ không hoạt động, vì maxkhông chấp nhận một mảng làm đầu vào.

Có một lợi thế khác, khi sử dụng apply, bạn có thể chọn bối cảnh của riêng mình. Tham số đầu tiên, bạn truyền cho applybất kỳ hàm nào, sẽ thisnằm bên trong hàm đó. Nhưng, maxkhông phụ thuộc vào bối cảnh hiện tại. Vì vậy, bất cứ điều gì sẽ hoạt động tại chỗ 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

applythực sự được định nghĩa trongFunction.prototype , bất kỳ đối tượng hàm JavaScript hợp lệ nào, sẽ có applychức năng, theo mặc định.


3
@Shane bởi vì, nó hoạt động ngay cả khi chúng ta đặt ngữ cảnh thành undefinedhoặc null:) Nếu maxcố gắng truy cập / thay đổi bất kỳ thứ gì trong ngữ cảnh, nó sẽ không thành công khi ngữ cảnh được đặt thành undefinedhoặc null.
thefourtheye

2
@NiCkNewman Trên thực tế, Math.maxsẽ không sử dụng tham số đầu tiên, vì nó không cần bất kỳ ngữ cảnh nào. Nó chỉ hoạt động trên dữ liệu mà nó nhận được trong các đối số.
thefourtheye

1
@NiCkNewman Nó quá rộng để thảo luận trong phần nhận xét. Nhưng bài viết này thissẽ là một điểm khởi đầu tốt. Nó cũng có một phần callapply chi tiết điều này.
thefourtheye

2
Giải thích tốt nhất về .apply () từ trước đến nay!
Microcipcip

1
Tại sao null hoặc toán học?


17

Bất cứ ai có thể cho tôi biết mã dưới đây hoạt động như thế nào?

Math.max.apply(Math,list)

Gọi một Math.maxhàm với Mathđối tượng được sử dụng làm thistham chiếu trong việc triển khai hàm (nội dung) và listđược truyền dưới dạng đối số.

Vì vậy, điều này cuối cùng tương đương với

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

Có vẻ như nó hoạt động nếu tôi vượt qua null hoặc Math.

Rõ ràng Math.maxviệc triển khai không sử dụng biến cá thể - không có lý do gì để làm như vậy. Triển khai gốc sẽ chỉ lặp lại argumentsvà tìm ra cái tối đa.

Tất cả các hàm do người dùng định nghĩa / Native đều có phương thức gọi và áp dụng mà chúng ta có thể sử dụng ?.

Có, mọi chức năng đơn lẻ đều có thể được gọi bằng cách sử dụng callhoặcapply

Người giới thiệu:


3

Tôi sẽ bắt đầu bằng cách nói Math.max(...numbers)Function.prototype.apply()chỉ nên sử dụng cho các mảng có tương đối ít phần tử. (...) và áp dụng sẽ không thành công hoặc trả về kết quả sai nếu mảng quá lớn

Math.max.apply(null | undefined | Math, numbers)giống như Math.max(...numbers)vì vậy tôi muốn giới thiệu Math.max(...numbers)vì lý do thẩm mỹ.

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

Nếu bạn cần tìm phần tử lớn nhất trong một mảng số rất lớn: hãy sử dụng Array.reduce()phương thức.

Array.reduce() có thể được sử dụng để tìm phần tử lớn nhất trong một mảng số, bằng cách so sánh từng giá trị:

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)

Phần kết luận:

Mảng số tương đối nhỏ: sử dụng Math.max(...numbers) Mảng số rất lớn: sử dụng Array.reduce()phương thức


1
Công cụ JavaScriptCore có giới hạn đối số được mã hóa cứng là 65536, vì vậy khi sử dụng apply (), bạn nên đảm bảo rằng kích thước mảng của bạn sẽ luôn nhỏ hơn.
Chaarmann

2

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

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...là các tham số và phải là Số MDN Math.max

Bạn không thể chuyển arraydưới dạng Math.maxtham số. Để vượt qua một mảng, bạn phải sử dụng apply.

Ứng dụng

Tham số đầu tiên áp dụng là this, tham số thứ hai là array. Các phương thức toán học tương đương với static trong các ngôn ngữ khác, có nghĩa là nó không cần một cá thể đối tượng không giống với array.prototype.slicenên bạn không cần phải chuyển thistrong trường hợp này.

Thí dụ

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)

Khi bạn muốn chuyển một mảng làm tham số, bạn phải sử dụng apply, nếu không thì hãy sử dụng call.

a pply = a rray
c all = c omma split
Thông tin thêm về call & apply

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.