비밀지도
https://school.programmers.co.kr/learn/courses/30/lessons/17681
문제 자체가 그렇게 어렵지 않았어서 코드는 금방 작성했다.
그런데, 출력 결과가 항상 #을 붙여져 있었다.
if(a1[j] || a2[j] 1) set += '#';
콘솔에 a1[j], a2[j]를 출력해보면, 확실히 둘 다 0일때에도 해당 조건문이 실행됐다.
어째서인지 한참 고민했는데 바보였었다ㅠㅠㅠ
불 자료형으로 변환될 때에는 0
, NaN
, ' ', " " (공백문자열)
, null
, undefined
의 5가지만 false가 되는데, 숫자 0
처럼 "0"
도 false가 나오길 기대했다.
console.log("0" == true); //false
위를 실행했을 때, 콘솔에 false가 찍혀서 더 헷갈렸었다.
false로 변환되는 5가지를 다시 확인해보고, 아래를 실행해보았다.
console.log("String" == true); //false
문자열은 전부 false인 모양이었다. 이걸 확인해봤더라면 더 빨리 해결했을텐데..
++ 추가로 확인해보니, 아래같은 결과가 나왔다.
console.log("1" == true); //true
이렇게 되면 문자열이라고 전부 false가 아닌 것 같은데? 하고 혼란스러웠다.
그래서 팀원한테 물어보니 하단 링크를 보내주었다.
https://developer.mozilla.org/ko/docs/Glossary/Falsy
해당 문서의 처음에, 조건절 (en-US), 반복문 (en-US) 등 불리언 값이 필요한 곳에서 형 변환 (en-US)을 이용해 특정 값을 불리언 값으로 변환한다
고 설명되어 있다.
아마 내가 콘솔에 찍어본 값들은 단순 비교일 뿐이라 Num(문자열) 형변환이 이루어졌고, "0", "1"은 각각 숫자 0, 1로, 나머지 문자열들은 NaN으로 변환되어 비교 결과가 true/false로 출력되지 않았을까 한다.
조건문 내에서는 false 취급되는 5가지 조건에 부합하지 못해 모두 true가 되었겠지?
아직 완벽하게 납득하지는 못했지만, 내일, 일주일 뒤, 한달 뒤에 다시 보면 그때는 더 잘 이해할 수 있지 않을까 한다.