
(1) 피연산자(operand)(== 인수(argument): 연산자가 연산을 수행하는 대상
ex) 5*2에서 왼쪽 피연산자 5와 오른쪽 피연산자 2, 두개의 피연산자 존재
(2) 단항 연산자: 피연산자의 부호를 뒤집는 단항 마이너스 연산자 -는 단항 연산자의 대표적인 예이다.
let x = 1;
x = -x;
alert(x); // -1, 단항 마이너스 연산자는 부호를 뒤집는다.
(3) 이항 연산자: 두개의 피연산자를 받는 연산자는 단항 연산자라고 부른다. 마이너스 연산자는 아래와 같이 이항 연산자로 쓸 수 있다.
let x=1, y=3;
alert(y-x); // 이항 마이너스 연산자는 뺼셈을 해준다.
alert(5%2); //5를 2로 나눈 후의 나머지인 1을 출력
alert(8%3); // 8을 3으로 나눈 후 나머지인 2를 출력
alert(4**(1/2)); // 2 (1/2 거듭제곱은 제곱근)
alert(8**(1/3)); // 2 (1/3 거듭제곱은 세제곱근)
let s = "my" + "string";
alert(s); //mystring
-> 이항 연산자 +를 사용할 떄, 피연산자 중 하나가 문자열이면 다른 하나도 문자열로 반환된다는 점을 주의해야한다.
alert(2+2+'1');
//'221'이 아니라 '41'이 출력된다.
-> 연산은 왼쪽에서 오른쪽으로 순차적으로 진행되기 때문에 해당 결과가 나왔다.
alert(6-'2'); // 4, '2'를 숫자로 바꾼 후 연산이 진행된다.
alert('6'/'2'); //3, 두 피연산자를 숫자로 바꾼 후 연산이 진행된다.
: 덧셈 연산자 + 는 이항 연산자뿐만 아니라 단항 연산자로도 사용할 수 있다.
: 숫자에 단항 덧셈 연산자를 붙이면 아무런 동작도 하지 않지만 피연산자가 숫자가 아닌 경우엔 숫자형으로 변환이 일어난다.
//숫자에는 아무런 영향을 미치지 않는다.
let x = 1;
alert(+x); //1
let y = -2;
alert(+y); // -2
//숫자형이 아닌 피연산자는 숫자형으로 변화한다.
alert(+true); //1
alert(+""); // 0
let apples = "2";
let oranges = "3";
alert(apples + oranges);
//23, 이항 덧셈 연산자는 문자열을 연결한다.
-> 이항 덧셈 연산자를 사용하면 값이 문자열로 변해서 연결된다.
let apples = '2';
let oranges = '3';
//이항 덧셈 연산자가 적용되기 전에, 두 피연산자는 숫자형으로 변화한다.
alert(+apples + +oranges);// 5
//Number(...)를 사용해서 같은 동작을 하는 코드를 작성할 수 있지만, 길다..
//= alert(Number(apples) + Number(oragnes); // 5
-> 값을 더해주기 위해서는 단항 덧셈 연산자를 사용해 피연산자를 숫자형으로 변화시킨다음 덧셈 연산자를 수행하면 된다.
-> 즉, 단항 덧셈 연산자가 먼저 문자열('2'와 '3')을 숫자 변환시키고, 이항 덧셈 연산자가 그 결과를 더해준다.
단항 덧셈(+)과 단항 부정(-)은 우선순위가 17로 (이항)덧셈 연산자(+)와 (이항)뺄셈 연산자(-)는 순위 13위로 단항 덧셈과 부정이 우선 순위가 높다.
그렇기 떄문에 "+apples + +oragne"에서 단항 덧셈 연산자가 덧셈보다 먼저 수행된다.
: 할당 연산자(=)는 우선순위 3으로 매우 낮다.
ex) x = 2*2+1과 같은 식에서 계산이 먼저 이뤄지고, 그결과가 x에 할당되는 이유가 이것떄문이다.
let n = 2;
n = n+5;
n = n*2;
-> 프로그램을 짜다보면 변수에 연산자를 적용하고 그 결과를 같은 변수에 저장해야 하는 경우가 종종 생긴다.
-> 이때, +=와 *= 연산자를 사용하면 짧은 문법으로 동일한 연산을 수행할 수 있다.
let n = 2;
n += 5; // n은 7이 된다. (n = n+5와 동일)
n *= 2; // n은 14가 된다. (n = n*2와 동일)
alert(n); // 14
let n = 2;
b *= 3 + 5;
alert(n); //16 (*=의 우측이 먼저 평가되므로, 위 식은 n *= 8과 동일하다.)
: 숫자를 하나 늘리거나 줄이는데 사용되는 연산자다.
let counter = 2;
counter++; // counter = counter + 1과 동일하다. 하지만 식은 더 짧다.
alert(counter); //3
let counter = 2;
counter--;
alert(counter); // 1
중요!
증가, 감소 연산자는 변수에만 쓸 수 있다. 5++와 같이 값에 사용하려고 하면 에러가 난다.
: 후위형과 전위형은 피연산자인 counter를 1만큼 증가시켜 준다는 점에서 동일하다
-> 두 형의 차이는 값을 반활할 떄 드러난다.
let counter =1;
let a = ++counter;
alert(a); //2
-> ++counter는 counter를 증가시키고 새로운 값 2를 반환한다.
-> 따라서, alert는 2를 표시한다.
let counter = 1;
let a = counter++;
alert(a); //1
-> counter++은 counter를 증가시킨다. 하지만, a는 증가 전의 기존 값을 반환한다.
-> 따라서, alert는 1을 표시한다.
let counter = 0;
counter++;
++counter;
alert(counter); //2, 위 두라인은 동일한 연산을 수행한다.
-> 반환값을 사용하지 않으면, 전위형과 후회형엔 차이가 없다.
//1) 값을 증가시키고 난 후, 증가한 값을 바로 사용하라면 전위형 증가 연산자를 사용한다.
let counter = 0;
alert(++counter);//1
//2) 값을 증가시키지만, 증가 전의 기존값을 사용하려면 후휘형 증가 연산자를 사용한다.
let counter2 = 0;
alert(counter2++); // 0
: ++/--연산자를 표현식 중간에 사용하는 것도 가능하다.
: 이때, 증가/감소 연산자의 우선순위는 다른 대부분의 산술 연산자보다 높기 때문에 평가가 먼저 이뤄진다.
let counter = 1;
alert(2 * ++counter); //4
let counter2 = 1;
alert(2 * counter++);//2
-> 아래의 예시는 counter++는 '기존'값을 반환하기 때문에 2가 출력된다.
아래와 같은 식은 가독성이 떨어지기 때문에
'코드 한줄에느, 특정 동작 하나' 에 관련된 내용만 작서하는 것이 좋다.
let counte = 1;
alert(2 * counter);
counter++; //2
// 후휘형 증가 연산자는 기존값을 반환한다.
let a = 1, b =1;
let c = ++a;
let b = b++;
-> a=2 / b=2 / c=2 / d=1
let a=2;
let x=1 + (a *= 2);
a=4 (기존값(@)에 2를 곱한 4)
x=5(1+4의 결과)