Note/그밖에

자바스크립트 물결 연산자(~)

Delia :D 2013. 2. 26. 12:17


node.js 에서 express 3을 이용하여 프로젝트를 진행하던중

차장님이 설정하신 app.js 부분에서 의문발생..


app.use(function(err, req, res, next){

     if (~err.message.indexOf('not found')) return next();

res.status(500).send(error.ER_API_SERVER);

 });


검색해서 찾아 보니, 이건 비트 연산자라고 한다.

원문글을 긁어와서 적어보겠당.

원문 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=74574




 C 언어와 마찬가지로 비트로 부정하는 연산자입니다. 

예를 들면, 브라우저는 대부분 32비트니 32비트 정수죠. 

9  = 00000000000000000000000000001001 

              -------------------------------- 

~9 = 11111111111111111111111111110110 = -10 


대충 이런 식이 성립되는군요. -(n+1) 



물론 잘 안쓰죠. 자바스크립트에 비트 연산 거의 쓸일이 없거든요. 

가뜩이나 node.js 빼면 파일이나 이진법 연산도 안되는 이 연산자. 

하지만 쓸 곳이 하나 있다는 사실 아십니까? 

바로 indexOf 메서드입니다. String 에. 문자열에 내장된 함수죠. 

왜냐구요? 직접 연산해 보시길. 

~-1 = 0 

~0  = -1 

~2  = -3 

자. 이제 감 잡으셨죠? indexOf 는 지정된 문자열을 찾지 못하면 -1 이 반환됩니다. 

결국 이렇게 편리한 논리식이 성립됩니다. 


if (~'oh my god'.indexOf('m')) {  

    alert('m이 요기잉네?'); 

} else { 

    alert('m 따위 내가 먹었음.'); 

어때요. 참 쉽죠? 

그것도 모자라 물결표시 2개짜리도 있습니다. ~~ 입니다. 그럼 이건 뭘까요? 

쉽게 생각하세요. !!a 처럼 반전에 반전을 한겁니다. 그렇게 생각하면 쉬워요. 

하지만 문제가 뭐냐면.. 


~~3.4356456 == 3 


정수가 되버린다는 사실. 그것도 소수점 다 버립니다. Math.floor() 처럼요. 

그러고 보니까 Math.floor 의 대안이 될 수 있겠군요. 

근데 왜 소수점을 다버릴까요? 흐음.. 글쎄요. 그것까지는 모르겠습니다. 

하지만 정말 유용할 것 같군요. 소수점을 버리고 정수만 표현하고 싶은데 

여태까지 Math.floor 써왔는데 겨우 물결표시 2개로 해결되다니. 




대박. 몰랐는뎅.. ~~만으로 Math.floor() 실현..  굳굳

if (~'oh my god'.indexOf('m')) 

이라는 건 곧 m이라는 글자가 있으면. 이라는거구만. 




'Note > 그밖에' 카테고리의 다른 글

무료 이미지 편집 툴 GIMP  (0) 2013.03.06
OLPT 와 OLAP  (0) 2013.03.04
twitter, facebook API error code  (0) 2012.11.22
javascript :: isEmpty(), isNotEmpty() 함수 구현  (0) 2012.10.18
GET 방식 글자수 제한  (0) 2012.08.09