논리 연산자는 보통
Boolean
(논리적) 값과 함께 쓰이며, 불리언 값을 반환합니다. 그런데,&&
과||
연산자는 사실 피연산자 중 하나의 값을 반환합니다. 그러므로 불리언 외의 다른 값과 함께 사용하면 불리언 값이 아닌 것을 반환할 수 있습니다.
A&&B
가 true
가 되기 위해서 A와 B가 모두 참이여한다" 그리고 "A||B
가 true
가 되기 위해서 A 또는 B가 참이 되어야한다"라고 생각하고 이 개념 이상으로 논리연산자를 사용하거나 생각해보지 않았다.expr1 && expr2
일 때 반환값은 expr1
이 truthy
한 값일 경우 expr2
를 반환하고, 그렇지 않으면 expr
1을 반환한다.expr1
이 truthy
한 값이라면, expr2
는 검사할 필요도 없이 그대로 반환해버린다. expr2
가 truthy
한 값이 라면 전체 값이 truthy
한 값으로 나올 것이고, 그렇지 않다면 falsy
한 값이 나올테니. expr1 && expr2
일 때 반환값은 expr1
이 truthy
한 값일 경우 expr1
를 반환하고, 그렇지 않으면 expr2
을 반환한다.expr1
이 truthy
한 값이라면, expr1
을 반환한다. 둘 중 하나만 truthy
한 값이어도 truthy
를 반환해야 하기 때문이다. expr1
이 falsy
한 값이라면 expr2
는 검사할 필요도 없이 그대로 반환해버린다. expr2
가 truthy
한 값이 라면 전체 값이 truthy
한 값으로 나올 것이고, 그렇지 않다면 falsy
한 값이 나올테니. true
로 변환할 수 있으면 false
를 반환한다. 그렇지 않으면 true
를 반환한다.이중 NOT(!!)
연산자를 통해 어떤 값이든 불리언 값으로 변환할 수 있다.n1 = !!true // !!truthy returns true
n2 = !!{} // !!truthy returns true: any object is truthy...
n3 = !!(new Boolean(false)) // ...even Boolean objects with a false .valueOf()!
n4 = !!false // !!falsy returns false
n5 = !!"" // !!falsy returns false
n6 = !!Boolean(false) // !!falsy returns false