function checkElement() {};
const processedArray = [];
const result = processedArray.every(checkElement);
어떤 연산을 거쳐 선언된 배열 processedArray
를 every()
를 이용해 처리하던 도중 processedArray
에 길이가 0
인 빈 배열 이 들어가는 경우가 발생했다.
의도했던 바는 아니었지만, "배열의 모든(every) element가 true
일때만 true
를 리턴"하는 every
의 의미로 미루어보아, 단 하나의 true
값도 리턴하지 않는 이 statement는 false
를 리턴하리라 기대했다.
그러나 내 예상과는 다르게, processedArray.every(checkElement)
는 true
를 리턴했다.
빈 배열의 every()는 왜 true를 리턴할까?
every()
는 배열의 각 요소에 대해 인자로 받은 콜백함수를 실행한다. 배열의 첫번째 인덱스로부터 loop을 시작해서 콜백함수를 실행하던 중, 리턴 받은 값이 하나라도 falsy
하다면 바로 loop을 종료하고 every()
는 false
를 리턴한다. 콜백으로부터 리턴받은 모든 값이 true
일 때에만 true
를 리턴한다.
ECMA Script의 Function.prototype.every
스펙을 확인해보면 더 명확히 알 수 있다.
복잡한 다른 것들은 다 건너뛰고 7.
을 보면,
7. Repeat, while k < len
이라 쓰여있다. 여기서 k
는 loop count이고, len
은 배열의 길이이다. 주어진 배열의 길이만큼 어떤 동작을 반복(Repeat
)한다는 의미이다.
여기서 7.c.iii
에 주목해보자.
iii. If ToBoolean(testResult) is false, return false.
그렇다. 배열의 loop을 돌던 중 하나라도 false
인 값이 나타난다면 바로 loop을 종료하고 false
를 리턴한다.
여기에서 빈 배열이 true를 리턴하는 이유를 알 수 있다.
만약 len
이 0인 배열이라면? while
의 조건문을 만족하지 못하므로 loop은 아예 실행되지 못하고 바로 다음 명령인 8.
로 넘어갈것이다.
8. Return true.
그리고는 그냥 true
를 리턴한다.
공허참 혹은 공진리 (vacuous truth)
MDN 문서에서는 이를 공허참과 관련지어 소개한다. 공허참은
전제가 잘못되었기 때문에 주장의 진위여부와 상관없이 모두 참
이 되는 명제이다.
전제를 주어진 배열, 주장을 콜백함수라고 생각했을 때, 값이 없는 빈 배열은 잘못된 전제를 의미한다. 콜백함수를 실행하려면 대상이 되는 값이 존재해야 하는데, 아무런 element가 존재 하지 않는 배열은 애초에 콜백함수를 실행해서 진위를 판단해볼 수조차 없다. 그러니 이 명제의 주장이 되는 콜백함수가 리턴하는 값(진위여부)과는 상관 없이 항상 참(true
)이라는 결론을 얻는 것이다.
참조
MDN - Array.prototype.every
wikipdeia - vacuous truth
ECMA Script - Array.prototype.every
'Product Development > Javascript' 카테고리의 다른 글
new Date()의 argument로 dateString을 사용할 때는 "yyyy-mm-dd"형식을 사용하자 (0) | 2023.07.22 |
---|---|
timeoutID는 그냥 숫자였다. (0) | 2023.07.19 |
Array(n)에는 map()을 쓸 수 없다. (1) | 2023.07.14 |