JavaScript에서 tilde(~, 물결)는 0과 1을 모두 뒤집는 Bitwise NOT 연산자이다. "~0101"는 "1010"이 된다.
그런데 이걸 인덱스 비교 등 오묘한 방식으로 사용하기도 하는 것 같다.
express.js에서 사용하는 SenchaLabs Connect의 미들웨어 소스를 보니 이런 표현이 있다. (middleware/errorHandler.js#L51)
아~ 대체 뭘까?? !(NOT)도 아니고..
찾고 찾고 찾으니 tilde는 아래처럼 동작하는 것 같다.
~N는 -(N+1) 이라니~!! 모야?? 이거.. 외울 수는 있나?? TㅅT
MDN에 있는 Bitwise NOT의 예제를 보면 왜 그런지 쉽게 알 수 있다. 10진수 9를 2진수로 표현하면 "000..1001"이 된다. 그걸 tilde로 Bitwise NOT 연산을 하면 0과 1이 모두 뒤집힌 "111..0110"이 된다. 이 값을 다시 10진수로 표현하면 -10이다.
이런 트릭을 이용해서 ~N은 -(N+1)이 되는 것 같다. 이걸 이용해서 -1과 비교하는 수식을 tilde로 간단하게 쓸 수 있다. Connect의 코드처럼 accept에 'html'이라는 문자열을 포함하고 있는 경우 indexOf()가 -1이 아닌 값을 줄 것이기 때문에 -1이 아닌 경우를 체크할 수 있다.
JavaScript는 이런 트릭을 이용한 코드가 너무 많다. 일반적으로 사용되는 트릭들인 것 같은데, 이런걸 만날 때 마다 찾아보려니 참 막막하고마잉~ 솔직히 트릭은 모르는 사람이 보면 정말 어렵다. 필요하다면 힌트를 위해 주석이라도 달아주는게 좋겠다. 헌데 ~는 ||처럼 아주 자주 사용하는 일반적인 트릭인듯 -ㅅ-;;;
그런데 이걸 인덱스 비교 등 오묘한 방식으로 사용하기도 하는 것 같다.
express.js에서 사용하는 SenchaLabs Connect의 미들웨어 소스를 보니 이런 표현이 있다. (middleware/errorHandler.js#L51)
if (~accept.indexOf('html')) {
...
}
...
}
아~ 대체 뭘까?? !(NOT)도 아니고..
찾고 찾고 찾으니 tilde는 아래처럼 동작하는 것 같다.
~N == -(N+1)
console.log(~-2); //1
console.log(~-1); //0
console.log(~0); //-1
console.log(~1); //-2
console.log(~2); //-3
console.log(~true); //-2
console.log(~false); //-1
console.log(~-2); //1
console.log(~-1); //0
console.log(~0); //-1
console.log(~1); //-2
console.log(~2); //-3
console.log(~true); //-2
console.log(~false); //-1
~N는 -(N+1) 이라니~!! 모야?? 이거.. 외울 수는 있나?? TㅅT
MDN에 있는 Bitwise NOT의 예제를 보면 왜 그런지 쉽게 알 수 있다. 10진수 9를 2진수로 표현하면 "000..1001"이 된다. 그걸 tilde로 Bitwise NOT 연산을 하면 0과 1이 모두 뒤집힌 "111..0110"이 된다. 이 값을 다시 10진수로 표현하면 -10이다.
9 (base 10) = 00000000000000000000000000001001 (base 2)
--------------------------------
~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)
Bitwise NOTing any number x yields -(x + 1). For example, ~5 yields -6.
--------------------------------
~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)
Bitwise NOTing any number x yields -(x + 1). For example, ~5 yields -6.
이런 트릭을 이용해서 ~N은 -(N+1)이 되는 것 같다. 이걸 이용해서 -1과 비교하는 수식을 tilde로 간단하게 쓸 수 있다. Connect의 코드처럼 accept에 'html'이라는 문자열을 포함하고 있는 경우 indexOf()가 -1이 아닌 값을 줄 것이기 때문에 -1이 아닌 경우를 체크할 수 있다.
if (~accept.indexOf('html')) {
...
}
if (-1 != accept.indexOf('html')) {
...
}
...
}
if (-1 != accept.indexOf('html')) {
...
}
JavaScript는 이런 트릭을 이용한 코드가 너무 많다. 일반적으로 사용되는 트릭들인 것 같은데, 이런걸 만날 때 마다 찾아보려니 참 막막하고마잉~ 솔직히 트릭은 모르는 사람이 보면 정말 어렵다. 필요하다면 힌트를 위해 주석이라도 달아주는게 좋겠다. 헌데 ~는 ||처럼 아주 자주 사용하는 일반적인 트릭인듯 -ㅅ-;;;







덧글