Math.max.apply ()는 어떻게 작동합니까?


82

어떻게 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

위의 코드는 목록에서 최대 수를 찾습니다. 누구든지 아래 코드가 어떻게 작동하는지 말해 줄 수 있습니까?. 통과하면 작동하는 것 같습니다null or Math.

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

모두 user-defined/Native functions사용할 수있는 호출 및 적용 방법이 있습니까?.

답변:


136

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 유효한 자바 스크립트 함수 객체,해야합니다 apply기본적으로 기능.


3
@Shane 우리가 상황에 맞는 설정 때조차 작동하기 때문에 undefined또는 null:) 경우 max맥락에서 접근 / 변경 아무것도 시도가 실패했을 컨텍스트로 설정 undefined또는 null.
thefourtheye 2014 년

2
@NiCkNewman 실제로 Math.max는 컨텍스트가 필요하지 않기 때문에 첫 번째 매개 변수를 사용하지 않습니다. 인수에서 수신 한 데이터에서만 작동합니다.
thefourtheye 2015 년

1
@NiCkNewman 댓글 섹션에서 논의하기에는 너무 광범위합니다. 그러나이 기사 this는 좋은 출발점이 될 것입니다. 또한 섹션이 call있으며 이에apply 대해 자세히 설명합니다.
thefourtheye

2
.apply ()에 대한 최고의 설명!
Microcipcip

1
왜 널이나 수학인가?


17

누구든지 아래 코드가 어떻게 작동하는지 말해 줄 수 있습니까?

Math.max.apply(Math,list)

함수 구현 (본문)에서 참조 로 사용하고 인수로 전달할 객체 Math.max와 함께 함수를 호출합니다 .Maththislist

그래서 이것은 결국

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

null 또는 Math를 전달하면 작동하는 것 같습니다.

분명히 Math.max구현은 인스턴스 변수를 사용하지 않습니다. 그렇게 할 이유가 없습니다. 기본 구현은 반복 arguments하여 최대 값을 찾습니다.

모든 사용자 정의 / 네이티브 함수에는 우리가 사용할 수있는 호출 및 적용 메소드가 있습니까?.

예, 모든 단일 기능은 call또는 사용하여 호출 할 수 있습니다.apply

참조 :


3

나는 말함으로써 시작 Math.max(...numbers)Function.prototype.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()방법 사용


1
JavaScriptCore 엔진에는 65536의 하드 코딩 된 인수 제한이 있으므로 apply ()를 사용할 때 배열 크기가 항상 더 작아야합니다.
Chaarmann

2

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

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...매개 변수이며 숫자 MDN Math.max 여야합니다.

당신은 전달할 수 없습니다 arrayMath.max매개 변수를 설정합니다. 배열을 전달하려면 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.

a pply = a rray
c all = c omma Sepa
전화 및 지원에 대한 추가 정보

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.