- 연산의 대상을 피연산자라고 한다.
- 피연산자는 값으로 평가될 수 있는 표현식 이어야 한다.
- 피연산자와 연산자의 조합으로 이뤄진 연산자 표현식도 값으로 평가될 수 있는 표현식이다.
- 연산의 종류에 따라 피연산자의 값이 바뀌는 경우가 있다.
- 피연산자의 값을 변경하는 것을 부수효과라고 한다.
-
산술 연산자
- 수학적 계산을 수행해 새로운 숫자값을 만든다.
- 연산이 불가능한 경우 NaN을 반환한다.
- 이항 산술 연산자
- 2개의 피연산자를 산술 연산하여 숫자 값을 만든다.
- 부수효과가 없다.
- 단항 산술 연산자
-
1개의 피연산자를 산술 연산하여 숫자값을 만든다.
-
증가(++) / 감소(--) 의 경우는 피연산자를 변경하는 부수효과가 있다.
-
증가와 감소는 부호의 위치에 의미가 있다.
-
숫자가 아닌 타입 중 숫자로 변환할 수 없는 타입에 사용할 경우 NaN을 반환한다.
-
피연산자 앞에 위치한 전위 증가/감소 연산자는 먼저 피연사자의 값을 증가/감소시킨 후 다른 연산을 수행한다.
-
피연산자 뒤에 위치한 후위 증가/감소 연산자는 먼저 다른 연산을 수행한 후에 피연사자의 값을 증가/감소시킨다.
-
- 연산자
- 숫자타입의 피연산자에 사용할 경우 아무런 변화가 없다.
- 숫자타입이 아닌 피연산자에 사용할 경우 피연산자를 숫자 타입으로 변환하여 반환한다.
- 단 피연산자를 변환하는것은 아니고, 변환한 값을 생성하여 반환한다.
- 부수효과가 없다.
-
- 연산자
- 숫자 타입의 경우 피연산자의 부호를 반전한 값을 반환한다.
- 숫자타입이 아닌 피연산자에 사용할 경우 피연산자를 숫자 타입으로 변한한 뒤 부호를 반전한 값을 반환한다.
- 문자열 연결 연산자
- +연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다.
- 그 외에 경우는 위의 산술 연산자로 동작한다.
-
할당 연산자.
- 할당 연산자는 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당한다.
- 부수효과가 있다.
- 할당문은 값으로 평가되는 표현식인 문으로써 할당된 값으로 평가된다.
-
비교 연산자
-
좌항과 우항의 값을 비교한 뒤, boolean 타입으로 반환한다.
-
NaN 비교를 주의해야 한다. NaN은 자신과 일치되지 않는 유일한 값이다. - IEEE-754표준에 명시되어있다고 한다. - 관련 stack overflow url https://stackoverflow.com/questions/1565164/what-is-the-rationale-for-all-comparisons-returning-false-for-ieee754-nan-values
- 0의 비교도 주의가 필요하다. -0과 +0의 동등, 일치비교는 모두 true 를 반환한다.
- 동등/일치 비교 연산자.
- 동등비교
- 암묵적으로 타입을 일치시킨 뒤 비교한다.
- 일치비교
- 좌항과 우항의 값, 타입을 비교하여 모두 일치할 경우 true 를 반한환다.
- 부동등 비교 / 부일치 비교
- 각각 동등비교, 일치비교의 반대 개념이다.
- 대소관계 비교 연산자.
- 대소 관계에서 비교연산자는 피연산자의 크기를 비교하여 boolean 값을 반환한다.
-
-
삼항 조건 연산자
- 삼항 연산자는 조건식의 평과 결과에 따라 반환할 값을 결정한다.
- 자바스크립트의 유일한 삼항 연산자이다.
- 부수효과는 없다.
- 표현식은 예제코드를 참조하면 된다.
- if ... else 문과 유사하지만, 삼항 표현식은 값처럼 사용이 가능하지만, if ... else 문은 표현식이 아닌 문이기 떄문에 값처럼 사용할 수 없다.
-
논리 연산자.
-
논리연산자는 우항과 좌항의 피연산자를 논리 연산한다.
-
부수효과가 없다.
-
논리곱과 논리합의 평과 결과는 boolean 값이 아닐수도 있다.
- 9.4절 단축 평가에서 깊게 확인 가능하다.
-
논리부정 연산자는 언제나 boolean 값을 반환한다.
-
드모르간의 법칙을 활용하여 가독성을 개선할 수 있다.
- !(x || y) === (!x && !y)
- !(x && y) === (!x || !y)
-
-
쉼표 연산자
- 쉼표 연산자는 왼쪽 피연산자부터 차례대로 피연산자를 평가한다.
- 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 결과를 반환한다.
-
그룹 연산자
- 소괄호로 피연산자를 감싼 연산자를 이야기한다.
- 연산자의 우선순위를 조절할 수 있다.
- 연산자의 우선순위가 가장 높다.
-
typeof 연산자
- typeof 연산자는 피연산자의 데이터 타입을 문자열로 반환한다.
- string, boolean, undefined, symbol, object, function 중 하나를 반환한다.
- 데이터 타입과 정확하게 일치하지 않을 수 있다.
- null 의 경우 object 로 반환한다.
- 선언하지 않은 식별자를 typeof 연산자로 연산해보면 ReferenceError 가 발생하지 않고, undefined를 반환한다.
-
지수연산자.
- ES7에 도입된 연산자다.
- 좌항의 피연산자를 밑으로, 우항의 피연산자를 지수로 거듭제곱하여 결과를 반환한다.
- 좌항의 피연산자에 숫자 반환이 되지 않는 타입이 있다면 NaN을 반환한다.
- 좌항의 피연산자에 {} 가 있으면 SyntaxError 가 발생된다.
-
그 외의 연산자
- 옵셔널체이닝
- 좌항의 피연산자가 null 또는 undefind 인 경우 undefind를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어간다.
- null 병합 연산자
- 좌항의 피연산자가 null 또는 undefind 인 경우 우항의 피연산자를 반환한다.
- 프로퍼티 삭제
- 객체의 프로퍼티를 삭제한다. 피연산자는 프로퍼티 값에 접근할 수 있는 표연식이여야 한다.
- 존재하지 않는 프로퍼티를 삭제하려고 한다면 무시된다.
- new 연산자
- 생성자 함수 앞에 사용한다.
- 생성자 함수일경우 생성자 함수로 동작한다.
- 내부 메서드 [[Call]] 이 호출되는 것이 아니고 [[Construct]] 가 호출된다.
- 호출된 함수가 생성자 함수가 아니라면 반환문이 무시된다.
- instanceof
- 이항 연산자로서 우변의 생성자 함수의 prototype 에 바인딩된 객체가 좌변의 객체의 prototype 체인 상에 존재하면 true, 아니면 false로 평가된다.
- in
- 객체 내 특정 프로퍼티가 존재하는지 평가한다.
-
연산자의 부수효과
- 부수효과는 피연산자에 영향을 주는 것을 이야기한다.
- 할당연산자, 증가/감소 연산자, delete 연산자는 부수효과가 있다.
- 연산자의 우선순위
- 여러 개의 다른 연산자로 이뤄진 문이 실행될 때 연산자가 실행되는 순서를 이야기한다.
- 연산자의 종류
- ()
- new(매개변수 존재), [](프로퍼티 접근) ()(함수 호출) ?.(옵셔널 체이닝)
- new(매개변수 미존재)
- x++, x--
- !x, +x, -x, ++x, --x, typeof, delete
- ** (이항 연산자 중에서 우선순위가 가장 높다)
- *, /, %
- +, -
- <, <=, >, >=, in, instanceof
- ==, !=, ===, !==
- ??(null 별합 연산자)
- &&
- ||
- ? ... : ...
- 할당 연산자(=,+=, -=, ...)
- ,
- 연산자의 종류가 많아 우선순위를 모두 기억하기 어렵고 실수하기도 쉽다. 따라서 연산자를 모두 기억하기보단 그룹연산자를 이용하여 연산순서를 조절하는 방법을 추천하고 있다.
- 연산자의 결합 순서
- 좌항 또는 우항 중 어떤 피연산자부터 평가할지 나타내는 순서를 이야기한다.
- 우항 -> 좌항의 경우 우항이 없는 연산자도 포함하고 있는 것 같다. (추정)
- 좌항 -> 우항 : +, -, /, %, <, <=, >, >=, &&, ||, ., [], (), ??, ?., in, instanceof
- 우항 -> 좌항 : ++, --, 할당 연산자(=, +=, -=, ...), !x, +x, -x, ++x, --x, typeof, delete, ? ... : ..., **