_.every = function (arr, iteratee) {
return _.reduce(arr, (acc, cur) => iteratee(cur) && acc, true);
};
iteratee가 undefined 나 0이 되면 acc가 undefined, 0으로 되어버리는 경우가 발생해서.....디버깅 해봤다.
이게 외 false가 않되니?😡😡😡
true && undefined // undefined
true && 0 // 0
undefined && true // undefined
0 && true // undefined
NaN === NaN // false
//convert falshy value to boolean
!!undefined // false
!!0 //false
나는 분노하다가...
내가 자바스크립트를 대체할 언어를 만들 능력이 없다는걸 깨닫고 차분히 이유를 찾아봤다.
stackOverflow 관련글
&&연산자는 내부적으로 표현식의 값들을 불리언으로 변화시킨 뒤 비교를 수행한다. 하지만 &&연산자의 결과값은 실제 불리언으로 변화되기 전의 최초 값이 그대로 반환되는 것.
이 때문에 이런 버그가 발생한 것.
결국 !!
를 활용해서 예쁘게 구현~
_.every = function (arr, iteratee) {
return _.reduce(arr, (acc, cur) => !!iteratee(cur) && acc, true);
};