every()
메소드는 배열의 모든 요소가 제공한 함수로 구현된 테스트를 통과하는지를 테스트합니다.
구문
arr.every(callback[, thisArg])
매개변수
callback
- 각 요소를 테스트하는 함수, 인수 셋을 취하는:
currentValue
- 배열에서 현재 처리 중인 요소.
index
Optional- 배열에서 현재 처리 중인 요소의 인덱스.
array
Optionalevery
가 호출한 배열.
thisArg
- 선택 사항.
callback
을 실행할 때this
로서 사용하는 값.
반환값
콜백 함수가 모든 배열 요소에 대해 참인(truthy) 값을 반환하는 경우 true
; 그렇지 않으면, false
.
설명
every
메소드는 callback
이 거짓인(falsy) 값(Boolean으로 변환할 때 false가 되는 값)을 반환하는 요소를 찾을 때까지 배열에 있는 각 요소에 대한 한 번씩 제공한 callback
함수를 실행합니다. 그런 요소가 발견된 경우, every
메소드는 즉시 false
를 반환합니다. 그렇지 않고, callback
이 모든 요소에 대해 true 값을 반환하는 경우, every
는 true
를 반환합니다. callback
은 할당한 값이 있는 배열의 인덱스에 대해서만 호출됩니다; 삭제됐거나 값이 할당된 적이 없는 인덱스에 대해서는 호출되지 않습니다.
callback
은 세 인수(요소값, 요소 인덱스 및 순회되는 Array 객체)와 함께 호출됩니다.
thisArg
매개변수가 every
에 제공되는 경우, callback
이 호출될 때 전달됩니다, this
값으로 사용하기 위해. 그렇지 않으면, undefined
값이 그 this
값으로 사용하기 위해 전달됩니다. 결국 callback
에 의해 관찰할 수 있는 this
값은 함수에 의해 보이는 this
를 결정하는 평소 규칙에 따라 결정됩니다.
every
는 호출되는 배열을 변화시키지(mutate) 않습니다.
every
에 의해 처리되는 요소의 범위는 첫 callback
호출 전에 설정됩니다. every
호출이 시작한 뒤 배열에 추가된 요소는 callback
에 의해 방문되지 않습니다. 배열의 기존 요소가 변경되는 경우, callback
에 전달한 그 값은 every
가 요소를 방문한 시점의 값이 됩니다; 삭제된 요소는 방문되지 않습니다.
every
는 (이산)수학에서 전칭("for all", ∀) 정량자(quantifier, 한정자)처럼 행동합니다. 특히, 빈 배열에 대해서는 true를 반환합니다. (이는 공집합의 모든 요소가 어떤 주어진 조건을 만족하는 무의미한 참입니다.)
예
모든 배열 요소의 크기 테스트
다음 예는 배열의 모든 요소가 10보다 더 큰지 테스트합니다.
function isBigEnough(element, index, array) { return element >= 10; } [12, 5, 8, 130, 44].every(isBigEnough); // false [12, 54, 18, 130, 44].every(isBigEnough); // true
화살표 함수 사용
화살표 함수는 같은 테스트에 대해 더 짧은 구문을 제공합니다.
[12, 5, 8, 130, 44].every(elem => elem >= 10); // false [12, 54, 18, 130, 44].every(elem => elem >= 10); // true
폴리필
every
는 ECMA-262 표준 제5판에 추가되었습니다; 그러하기에 다른 표준 구현에 없을 수 있습니다. 스크립트 시작 부분에 다음 코드를 삽입하여 이를 우회할 수 있습니다, 원래 이를 지원하지 않는 구현에서 every
를 사용케 하는. 이 알고리즘은 바로 ECMA-262 제5판에서 서술한 겁니다, Object
및 TypeError
가 원래값을 갖고 callbackfn.call
은 Function.prototype.call
의 원래값으로 평가하는 것으로 여기는
if (!Array.prototype.every) { Array.prototype.every = function(callbackfn, thisArg) { 'use strict'; var T, k; if (this == null) { throw new TypeError('this is null or not defined'); } // 1. O을 인수로서 this 값을 전달한 // ToObject 호출의 결과이게 함. var O = Object(this); // 2. lenValue를 "length" 인수가 있는 0의 Get // 내부 메소드 호출의 결과이게 함. // 3. len을 ToUint32(lenValue)이게 함. var len = O.length >>> 0; // 4. IsCallable(callbackfn)이 false인 경우, TypeError 예외 발생. if (typeof callbackfn !== 'function') { throw new TypeError(); } // 5. thisArg가 공급됐다면, T를 thisArg이게 함; 아니면 T를 undefined이게 함. if (arguments.length > 1) { T = thisArg; } // 6. k를 0이게 함. k = 0; // 7. 반복, k < len일 동안 while (k < len) { var kValue; // a. Pk ToString(k)이게 함. // 이는 in 연산자의 좌변(LHS) 피연산자에 대한 암시(implicit)임 // b. Let kPresent를 Pk 인수가 있는 0의 HasProperty // 내부 메소드 호출의 결과이게 함. // 이 과정은 c와 결합될 수 있음 // c. kPresent가 true인 경우, 그러면 if (k in O) { // i. kValue를 인수 Pk가 있는 0의 Get 내부 // 메소드 호출의 결과이게 함. kValue = O[k]; // ii. testResult를 this 값으로 T 그리고 kValue, k 및 0을 // 포함하는 인수 목록과 함께 callbackfn의 call // 내부 메소드 호출의 결과이게 함. var testResult = callbackfn.call(T, kValue, k, O); // iii. ToBoolean(testResult)가 false인 경우, false 반환. if (!testResult) { return false; } } k++; } return true; }; }
스펙
브라우저 호환성
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | 1.5 (1.8) | 9 | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | 1.0 (1.8) | (Yes) | (Yes) | (Yes) |