7장 연산자
산술 연산자
+
,-
단항 연산자 : 숫자 타입이 아닌 피연산자에 사용하면 숫자 타입으로 변환하여 반환함- 변환이 되지않는 경우(문자열 등) 은
NaN
반환
var x = '1';
// 문자열을 숫자로 타입 변환한다.
console.log(+x); // 1
// 부수 효과는 없다.
console.log(x); // "1"
// 불리언 값을 숫자로 타입 변환한다.
x = true;
console.log(+x); // 1
// 부수 효과는 없다.
console.log(x); // true
// 불리언 값을 숫자로 타입 변환한다.
x = false;
console.log(+x); // 0
// 부수 효과는 없다.
console.log(x); // false
// 문자열을 숫자로 타입 변환할 수 없으므로 NaN을 반환한다.
x = 'Hello';
console.log(+x); // NaN
// 부수 효과는 없다.
console.log(x); // "Hello"
JS 엔진에 의해서 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입 변환, 타입 강제 변환 이라고 함.
- true,false 는 각각 1,0 로 반환
- null 은 0으로 변환
- undefined 는 반환되지 않음 → NaN
// 문자열 연결 연산자
'1' + 2; // -> '12'
1 + '2'; // -> '12'
// 산술 연산자
1 + 2; // -> 3
// true는 1로 타입 변환된다.
1 + true; // -> 2
// false는 0으로 타입 변환된다.
1 + false; // -> 1
// null은 0으로 타입 변환된다.
1 + null; // -> 1
// undefined는 숫자로 타입 변환되지 않는다.
+undefined; // -> NaN
1 + undefined; // -> NaN
할당 연산자
- 당연히 변수 값 변하는 부수효과 있음.
- 할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 표현된다.
→ x=10 은 x 에 할당된 숫자 값 10으로 평가됨. 연쇄 할당 가능var a, b, c; // 연쇄 할당. 오른쪽에서 왼쪽으로 진행. // ① c = 0 : 0으로 평가된다 // ② b = 0 : 0으로 평가된다 // ③ a = 0 : 0으로 평가된다 a = b = c = 0; console.log(a, b, c); // 0 0 0
비교 연산자
==
암묵적 타입 변환을 통해서 좌항과 우항의 타입을 일치 시킨 후 값 비교
- [!] 타입 변환 때문에 결과 예측하기 어렵기도 함
// 동등 비교. 결과를 예측하기 어렵다.
'0' == ''; // -> false
0 == ''; // -> true
0 == '0'; // -> true
false == 'false'; // -> false
false == '0'; // -> true
false == null; // -> false
false == undefined; // -> false
===
좌항과 우항이 타입도 같고 값도 같은 경우에 true 반환
-
NaN 은 자신과 일치하지 않음
// NaN은 자신과 일치하지 않는 유일한 값이다. NaN === NaN; // -> false
숫자가 NaN 인지 확인하려면 빌트인 함수
isNaN
사용// Number.isNaN 함수는 지정한 값이 NaN인지 확인하고 그 결과를 불리언 값으로 반환한다. Number.isNaN(NaN); // -> true Number.isNaN(10); // -> false Number.isNaN(1 + undefined); // -> true
-
0, -0 도 같은 true로 반환함
Object.is 메서드
- -0, 0 는 다르다고 평가하고
- NaN 는 같다고 평가
-0 === +0; // -> true
Object.is(-0, +0); // -> false
NaN === NaN; // -> false
Object.is(NaN, NaN); // -> true
삼항 조건 연산자
조건식 ? 조건식이 true 일 때 반환 값 : 조건식이 false 일 때 반환 값
- 삼항 조건 연산자 표현식은 값으로 평가할 수 있는 표현식인 문
↔ if else문은 표현식이 아닌 문이라서 값처럼 사용할 수 없음.
var x = 10;
// 삼항 조건 연산자 표현식은 표현식인 문이다. 따라서 값처럼 사용할 수 있다.
var result = x % 2 ? '홀수' : '짝수';
console.log(result); // 짝수
// if...else 문은 표현식이 아닌 문이다. 따라서 값처럼 사용할 수 없다.
var result = if (x % 2) { result = '홀수'; } else { result = '짝수'; };
// SyntaxError: Unexpected token if
논리 연산자
- 피연산자들이 반드시 boolean 일 필요는 없음
- 결과값이 boolean 값이 아닐 수도 있음. 나중에 단축평가에서 다시 다룰 것
쉼표 연산자
왼쪽 피연산자 부터 차례대로 평가하고 마지막 평가가 끝나면 마지막 평가 결과를 반환.
var x, y, z;
x = 1, y = 2, z = 3; // 3
그룹 연산자
- 그룹 연산자 안에는 표현식인 문만 들어갈 수 있음.
- 우선순위가 가장 높음
typeof 연산자
피연산자의 데이터 타입을 문자열로 반환.
null, 배열, 객체 등등은 object
로 반환함
typeof '' // -> "string"
typeof 1 // -> "number"
typeof NaN // -> "number"
typeof true // -> "boolean"
typeof undefined // -> "undefined"
typeof Symbol() // -> "symbol"
typeof null // -> "object"
typeof [] // -> "object"
typeof {} // -> "object"
typeof new Date() // -> "object"
typeof /test/gi // -> "object"
typeof function () {} // -> "function"
typeof null 이 object?
typeof null 값이 object인건 버그라고함. 근데 여러 이유로 안바꿨다
=> null 타입인지 확인할 때는 typeof
연산자가 아닌 === 사용하자.
var foo = null;
typeof foo === null; // -> false
foo === null; // -> true
선언하지 않은 식별자는 error 가 아닌 undefined 반환
// undeclared 식별자를 선언한 적이 없다.
typeof undeclared; // -> undefined
연산자의 부수효과
부수효과 있는 연산자들
- = , ++ ,—
- delete 연산자
객체의 프로퍼티 삭제함 → 해당 객체 사용하는 다른 코드에 영향을 줌