7장 연산자


산술 연산자

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 엔진에 의해서 암묵적으로 타입이 자동 변환되는 것을 암묵적 타입 변환, 타입 강제 변환 이라고 함.

// 문자열 연결 연산자
'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

할당 연산자

비교 연산자

==

암묵적 타입 변환을 통해서 좌항과 우항의 타입을 일치 시킨 후 값 비교

// 동등 비교. 결과를 예측하기 어렵다.
'0' == ''; // -> false
0 == '';   // -> true
0 == '0';  // -> true
false == 'false';   // -> false
false == '0';       // -> true
false == null;      // -> false
false == undefined; // -> false

===

좌항과 우항이 타입도 같고 값도 같은 경우에 true 반환

-0 === +0;         // -> true
Object.is(-0, +0); // -> false

NaN === NaN;         // -> false
Object.is(NaN, NaN); // -> true

삼항 조건 연산자

조건식 ? 조건식이 true 일 때 반환 값 : 조건식이 false 일 때 반환 값

var x = 10;

// 삼항 조건 연산자 표현식은 표현식인 문이다. 따라서 값처럼 사용할 수 있다.
var result = x % 2 ? '홀수' : '짝수';
console.log(result); // 짝수

// if...else 문은 표현식이 아닌 문이다. 따라서 값처럼 사용할 수 없다.
var result = if (x % 2) { result = '홀수'; } else { result = '짝수'; };
// SyntaxError: Unexpected token if

논리 연산자

쉼표 연산자

왼쪽 피연산자 부터 차례대로 평가하고 마지막 평가가 끝나면 마지막 평가 결과를 반환.

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

연산자의 부수효과

부수효과 있는 연산자들

reference