apply 메소드
apply는 모든 함수가 갖고 있는 메소드입니다.
func.apply(thisValue, [arg1, arg2, ...])
thisValue의 영향을 고려하지 않는 경우 위 호출은
func(arg1, arg2, ...)
즉, Apply를 사용하면 배열을 개별 매개변수로 "풀고" 함수를 호출하려면
팁 1: 배열을 매개변수로 허용하지 않는 함수에 배열을 전달하세요. JavaScript에는 배열의 최대값을 반환하는 함수가 없습니다. 그러나 숫자 유형 매개변수 중 최대값을 반환할 수 있는 Math.max 함수가 있습니다. 목표:
> max.apply(null, [10, -1, 5])
10
역자 주: Math.max 메소드의 매개변수 중 하나의 값이 NaN, 메소드는 NaN
> ;Math.max(1,null) //Math.max(1,0)
1
>Math.max(1,undefinded) //Math.max(1,NaN)과 같습니다.
NaN
>Math.max (0,-0) //양수 0은 음수 0보다 크며 이는 ==
0
>Math.max(와 다릅니다. -0,-1) //음수 0은 -1보다 큽니다
- 0
팁 2: 희소 배열 채우기 배열의 간격
다음은 독자에게 알림입니다. JavaScript에서 배열은 숫자를 값으로 매핑하는 것입니다. 따라서 인덱스에서 요소가 누락되고(간격) 요소의 값이 정의되지 않은 경우, 배열은 다음과 같습니다. 두 가지 다른 상황. 전자는 탐색 시 Array.prototype(forEach, map 등)의 관련 메서드에 의해 감지되지만 후자는 건너뛰지 않습니다.
> ["a",,"b"].forEach(function (x) { console.log(x) })
a
> ["a",undefine,"b"].forEach(function (x) { console.log(x) } )
a
정의되지 않음
번역 작성자 주: 여기에서 작성자는 "배열은 숫자를 값으로 매핑하는 것입니다"라고 말했는데 이는 엄격한 의미에서 잘못된 것입니다. . 올바른 설명은 "배열은 문자열을 값으로 매핑하는 것입니다"입니다. 증거는 다음과 같습니다.
>for (i in ["a", "b"]) {
console.log(typeof i) //배열의 인덱스는 다음과 같습니다. 실제로는 문자열
}
"string"
"string"
>["a", "b "].forEach(function (x, i) {
console .log(typeof i) //여기의 i는 실제로 인덱스가 아니며 숫자 유형의 누산기일 뿐입니다
})
"number"
"number"
in 연산자를 사용하면 배열에 공백이 있는지 확인할 수 있습니다.
> 1(["a",,"b"])
false
> 1(["a", 정의되지 않음, " b"]
true
역자 주: 여기서 1을 사용할 수 있는 이유는 in 연산자가 1을 "1"로 변환하기 때문입니다.
이 간격의 값을 읽으려고 하면 반환됩니다. 실제 정의되지 않은 요소와 동일합니다.
> ["a",,"b"][1]
정의되지 않음
> ["a", 정의되지 않음, "b"][1]
정의되지 않음
번역자 주: [1]도 ["1"]로 변환됩니다.
간격 채우기
배열로 적용( 새로 추가할 필요 없음) 여기) 정의되지 않은 요소로 배열의 공백을 채울 수 있습니다.
> Array.apply(null, ["a",,"b"])
[ 'a', 정의되지 않음, 'b' ]
이것은 Apply가 배열의 공백을 무시하지 않고 정의되지 않은 매개변수로 함수에 공백을 전달하기 때문입니다.
코드 복사코드는 다음과 같습니다.
> 함수 returnArgs() { return [].slice.call(arguments) }
> returnArgs.apply(null, ["a",,"b"])
[ 'a', undefine, 'b' ]
단, Array 메소드로 전달받은 매개변수가 단일 숫자인 경우 이 매개변수는 배열의 길이로 간주되어 주의해야 합니다. 새 배열:
> (null, [ 3 ])
[ , , ]
따라서 가장 신뢰할 수 있는 방법은 이러한 종류의 작업을 수행하기 위해 다음과 같은 함수를 작성하는 것입니다.
function fillHoles(arr) {
var result = []
for(var i=0; i < arr.length; i ) {
result[i] = arr[i]
}
return result; 🎜>
실행:
[ 'a', 정의되지 않음, 'b' ]
_.compact
함수는 Underscore에서 간격을 포함하여 배열의 모든 잘못된 값을 제거합니다.
[ ' a', 'b' ]
> _.compact(["a", 정의되지 않음, "b"])
[ 'a', 'b' ]
> "a", false , "b"])
[ 'a', 'b' ]
팁 3: 배열 평면화
작업: 여러 배열 요소가 포함된 배열을 1차 배열로 변환하려면 적용 기능을 사용하여 concat으로 배열을 압축 해제합니다. 복사 코드
코드는 다음과 같습니다: > Array.prototype.concat.apply([], [["a"], ["b"] ])
[ 'a', 'b' ]
배열이 아닌 유형의 요소를 혼합하는 것도 가능합니다.
복사 code
코드는 다음과 같습니다: > Array.prototype.concat.apply([], [["a"], "b"])
[ 'a', 'b ' ]
concat은 독립 함수가 아닌 배열 방식이므로 적용 방식의 이 값을 []로 지정해야 합니다. 방법은 최대 2차 배열만 평면화할 수 있다는 것입니다.
코드 복사
코드는 다음과 같습니다. > Array.prototype.concat.apply([] , [[["a"]], ["b"]])
[ [ 'a' ], 'b' ]
그래서
대안 을 고려해야 합니다. 밑줄은 중첩 배열의 여러 수준을 처리할 수 있습니다. 코드 복사
JavaScript: 희소 배열과 밀집 배열
ECMAScript.next: Array.from() 및 Array.of()