본문 바로가기
Product Development/Javascript

빈 배열에 every() 를 실행하면 언제나 true를 리턴한다.

by Kyle Ausk 2023. 7. 15.
function checkElement() {};
const processedArray = [];

const result = processedArray.every(checkElement);

어떤 연산을 거쳐 선언된 배열 processedArrayevery()를 이용해 처리하던 도중 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