console.log(1 + 1);
console.log(1 + "1");
+
연산자는 문자열 연결 연산과 덧셈 연산의 두 가지 역할을 수행합니다.
피연산자 중 하나가 문자열이면, 다른 피연산자를 문자열로 변환하여 문자열 연결을 수행합니다. 따라서 첫 번째 값은 2
를 반환하고, 두 번째 값은 11
을 반환합니다.
console.log(1 - 2);
console.log(1 - "2");
-
연산자는 숫자의 뺄셈 연산만 지원합니다.
피연산자 중 하나가 문자열일지라도, 문자열을 숫자로 변환하여 연산합니다. 따라서 첫 번째 값과 두 번째 값 모두 -1
로 반환됩니다.
*
연산자와 /
, %
연산자도 숫자 우선으로 처리한다!
const solution = (num1, num2) => num1 / num2 << 0
이런 풀이를 발견, 너무너무 깔끔하고 좋은 것인데 <<0
이건 무슨 뜻일까?
x << n
: x
를 왼쪽으로 n
비트 이동x >> n
: x
를 오른쪽으로 n
비트 이동하지만 << 0
은 실제로 비트 이동을 하지 않고, 숫자를 강제로 정수로 변환하는 효과를 가진다! 그래서 7 / 2
와 같은 문제 풀이를 할 때에, 답이 3.5로 나오지 않고 정수값으로 반환하기 위해 << 0
을 붙여준 것.
<< 0
과 Math.floor()
과 parseInt()
표현식 | 결과 | 설명 |
---|---|---|
5 / 2 | 2.5 | 나누기 결과 |
5 / 2 <<0 | 2 | 비트 시프트로 소수점 제거(내림) |
Math.floor(5 / 2) | 2 | 내림(소수점을 버리지만, 음수일 때 더 작은 값으로 내림) |
paeseInt(5 / 2) | 2 | 소수점 이하 버림(소수점을 잘라낸다) |
~~(5 / 2) | 2 | ~~ (이중NOT)으로 정수 변환 |
주의할 점!!
(1) 음수의 경우 Math.floor()
와 다를 수 있음
예를 들어 7 / 3 << 0
과 Math.floor(-7 / 3)
을 비교해 보면, 전자는 -2
가 출력되는 반면 후자는 -3
이 출력된다. Math.floor()
는 더 작은 숫자로 내리고, << 0
는 소수점 자체를 버려버리는 메서드이기 때문!
(2) << 0
은 32비트 정수로 변환하므로 매우 큰 숫자에서는 오작동할 수 있다!
32비트 정수
: 0 부터 4,294,967,295 또는 -2,147,483,648 부터 2,147,483,647까지!!
2의 31승 빼기 1
인데 메르센 소수에 해당한대요 그게뭔데 아무튼 32비트 컴퓨터에서 정수로 저장할 수 있는 최대값이라고 합니다.
오늘의 TMI : 유튜브는 처음 설계될 때 조회수를 32비트 정수로 다뤘었는데, 싸이의 강남스타일 뮤비 조회수가 메르센 소수를 넘어가는 바람에 64비트 정수로 업그레이드해야 했다고 함,,