데이터 타입

연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산 등을 수행해 하나의 값을 만든다. 연산의 대상을 피연산자라고 하는데, 피연산자는 값으로 평가될 수 있는 표현식이어야 한다. (피연산자 + 연산자 조합도 값으로 평가되는 표현식)

ex)

//산술 연산자
5 * 4 //20

//문자열 연산자
'안녕하세요 ' + '하이.' //'안녕하세요 하이.'

//할당 연산자
color = 'blue' //'blue'

//비교 연산자
3 > 5 //false

//논리 연산자
true && false //false

//타입 연산자
typeof 'Hi' //String
  • 피연산자 > 값(명사) 연산자 > 새로운 값(동사)

위의 비교 연산자를 예를 들면, 피연산자는 3,5 이며, 연산자는 >이다.

📌산술 연산자

산술 연산자는 피연산자를 수학적 계산을 수행해 새로운 숫자 값을 만든다. 산술 연산자가 불가능한 경우, NaN을 반환한다. 산술 연산자는 피연산자의 개수에 따라 이항 산술 연산자와 단항 산술 연산자로 구분할 수 있다.

이항 산술 연산자

2개의 피연산자를 산술 연산하여 숫자 값을 만든다.
피연산자의 값을 변경하는 부수 효과가 없다. 즉, 어떤 산술 연산을 해도 피연산자의 값이 바뀌는 경우가 아니고 새로운 값을 만든다.

  • +, -, *, /, % > 부수효과 ❌

ex)

5 + 4 // 9
5 - 4 // 1
5 * 4 // 20
5 / 4 // 1.25
5 % 4 // 1

단항 산술 연산자

1개의 피연산자를 산술 연산하여 숫자 값을 만든다. 증가/감소(++/--) 연산자는 피연산자의 값을 변경하는 부수 효과가 있다.

  • ++, -- > 부수효과 ⭕
  • +, - > 부수효과 ❌

ex) ++, --

let x = 1;

// ++연산자는 피연산자의 값을 변경하는 암묵적 할당이 이뤄진다.
x++; // x = x + 1
console.log(x) // 2

// --연산자는 피연산자의 값을 변경하는 암묵적 할당이 이뤄진다.
x--; // x = x - 1
console.log(x) // 1
  • 증감 연산자는 위치에 의미가 있다
  • 피연산자 앞에 위치 > 전위 증감 연산자는 먼저 피연산자 값을 증감하고 연산을 수행.
  • 피연산자 뒤에 위치 > 후위 증감 연산자는 먼저 연산을 수행 후 피연산자 값을 증감.

ex) ++, --

let x = 5, result;

// 선할당 후증가
result = x++;
console.log(result, x) // 5 6

// 선증가 후할당
result = ++x;
console.log(result, x) // 7 7

// 선할당 후감소
result = x--;
console.log(result, x) // 7 6

// 선감소 후할당
result = --x;
console.log(result, x) // 5 5

ex) +, -


//아무런 효과가 없다
+10;   // 10
+(-10) // 10
-(-10) // 10

let x = '1';

// 문자열을 숫자로 타입 변환
console.log(+x) // 1
// 부수효과 없음
console.log(x) // '1'

// 불리언 값을 숫자로 타입 변환
x = true
console.log(+x) // 1
// 부수효과 없음
console.log(x) // true

// 문자열을 숫자로 타입 변환안되므로 NaN반환
x = '하이'
console.log(+x) // NaN
// 부수효과 없음
console.log(x) // '하이'

//문자열을 숫자로 타입 변환
-'10'; // 10

//불리언을 숫자로 타입 변환
-true; // -1

//문자열을 숫자로 타입 변환
-'하이'; // NaN
  • 단항 연산자는 피연산자의 부호를 반전한 값을 반환
  • 숫자타입이 아닌 피연산자에 사용하면 숫자타입으로 변환한다.
  • 역시 부수효과는 없다.

문자열 연결 연산자

+연산자는 피연산자 중 하나 이상이 문자열인 경우 운자열 연결 연산자로 동작한다. 그외는 산술로 동작한다.

ex)

// 문자열 연결 연산자
'1' + 2; // 12

// true는 1로 타입 변환
1 + true // 2

// false는 0로 타입 변환
1 + false // 1

// null는 0로 타입 변환
1 + null // 1

// underfined는 숫자로 타입 변환 X
+underfined; // Nan
1 + underfined; // Nan

이 예제로 알 수 있는 사실은 개발자의 의도와 상관없이 자바스크립트에서는 암묵적으로 타입이 자동 변환되기도 한다.(1+true=2) 이를 암묵적 타입 변환, 타입 강제 변환이라 한다.

📌할당 연산자

할당 연산자는 우항에 있는 피연산자의 평가 결과를 좌항에 있는 변수에 할당한다. 할당 연산자는 좌항의 변수에 값을 할당하므로 변수 값이 변하는 부수 효과가 있다.

  • = > x = 5(x = 5) > 부수효과 ⭕
  • += > x += 5(x = x + 5) > 부수효과 ⭕
  • -= > x -= 5(x = x - 5) > 부수효과 ⭕
  • = > x = 5(x = x * 5) > 부수효과 ⭕
  • /= > x /= 5(x = x / 5) > 부수효과 ⭕
  • %= > x %= 5(x = x % 5) > 부수효과 ⭕

ex)

// 문자열 연결 연산자
let str = 'hi ';
str += '안녕'; // str = str + '안녕'
console.log(str); // 'hi 안녕'

할당문은 변수에 값을 할당하는 부수 효과만 있을 뿐, 값으로 평가되지 않을 것처럼 보인다. 하지만 할당문은 값으로 평가되는 표현식인 문으로서 할당된 값으로 평가된다.

ex) 연쇄 할당

let a, b, c;
a = b = c = 0; // 연쇄할당. 오른쪽에서 왼쪽으로 진행
console.log(a, b, c); // 0 0 0

위의 예제처럼 할당문을 다른 변수에 할당할 수 있는 여러 변수에 동일한 값을 할당하는 연쇄 할당도 가능하다.

📌비교 연산자

비교 연산자는 좌항과 우항의 피연산자를 비교한 다음 그 결과를 불리언 값으로 반환한다. 비교 연산자는 if, for문과 같은 제어문의 조건식에서 주로 사용한다.

동등/일치 비교 연산자

동등 비교, 일치 비교 연산자는 좌항과 우항의 피연산자가 같은 값으로 평가되는지 비교해 불리언 값을 반환한다. 동등비교는 느슨한 비교, 일치 비교는 엄격한 비교를 한다.

  • == > 동등비교 > x == y (x,y 값 같음) > 부수효과 ❌
  • === > 일치비교 > x === y (x,y 값,타입 같음) > 부수효과 ❌
  • != > 부동등비교 > x != y (x,y 값 다름) > 부수효과 ❌
  • !== > 불일치비교 > x !== y (x,y 값,타입 다름) > 부수효과 ❌

동등비교 연산자는 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다. 하지만 동등 비교는 편리한 경우도 있지만 결과를 예측하기 어렵고 실수하기 쉽기 때문에 조심해야 한다.

ex)동등 비교 / 일치 비교

// 동등비교
5 == 5; // true

// 타입은 다르지만 암묵적 타입 변환으로 동등
5 == '5'; // true

// 일치비교
5 === 5; // true
5 === '5'; // false

// NaN은 자신과 일치하지 않은 유일한 값
NaN === NaN; // false

// Number.isNaN 함수는 지정한 값이 NaN인지 확인하고 그 결과를 불리언 값으로 반환
Number.isNaN(NaN); // true
Number.isNaN(10); // false
Number.isNaN(1+undefinfed); // true

0 === -0 // true
0 == -0 // true

//object 메소드는 예측가능한 정확한 비교 결과를 반환. 그외는 일치 비교과 동일
-0 === +0; // true
object.is(-0, +0); // false

NaN === NaN; // false
object.is(NaN, NaN); // true

ex)부동등 비교 / 불일치 비교

// 부동등비교
5 != 5; // true
5 != 9; // false
5 != '5'; // false

// 불일치비교
5 !== 9; // true
5 !== 5; // false
5 !== '5'; // false

대소 관계 비교 연산자

> → x > y (x가 y보다 크다) → 부수효과 ❌
< → x < y (x가 y보다 작다) → 부수효과 ❌
>= → x >= y (x가 y보다 크거나 작다) → 부수효과 ❌
<= → x <= y (x가 y보다 작거나 크다) → 부수효과 ❌

ex)대소 관계 비교

// 대소 관계 비교
5 > 0; // true
5 > 5; // false
5 >= 5; // true
5 <= 5; // true

📌삼항 조건 연산자

자바스크립트에서 세 개의 피연산자를 받는 유일한 연산자이다. 앞에서부터 조건문, 물음표(?), 조건문이 참(truthy)일 경우 실행할 표현식, 콜론(:), 조건문이 거짓(falsy)일 경우 실행할 표현식이 배치된다. 해당 연산자는 if...else문의 대체재로 빈번히 사용된다.

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

ex)

let x = 2;
// 2 % 2는 0이고, 0은 false로 암묵적 타입 변환
let result = x % 2 ? '홀수' : '짝수';
                     //참   : //거짓
console.log(result) // 짝수

//else if문도 유사하게 처리 가능
let x = 2, result;
if(x % 2){
  result = '홀수'
}else{
  result = '짝수'
}
console.log(result) // 짝수

하지만 if else문과 중요한 차이가 있다. 삼항 조건 표현식은 값처럼 사용할 수 있는 표현식인 문이지만, if else문은 표현식이 아닌 문이기 때문에 값처럼 사용할 수 없다.

ex)

let x = 10;
let result = if(x % 2){result = '홀수'}else{result = '짝수'}
//SyntaxError

//else if문도 유사하게 처리 가능
let x = 10
let result = x % 2 ? '홀수' : '짝수';
console.log(result) // 짝수

📌논리 연산자

논리 연산자는 우항과 좌항의 피연산자(부정 논리 연산자의 경우 우항의 피연산자)를 논리 연산한다.

  • || > 논리합(OR) > 부수효과 ❌
  • && > 논리곱(AND) > 부수효과 ❌
  • ! > 부정(NOT) > 부수효과 ❌

ex)

// 논리합 연산자
true || true;   // true
true || false;  // true
false || true;  // true
false || false; // false

// 논리곱 연산자
true && true;   // true
true && false;  // false
false && true;  // false
false && false; // false

// 논리 부정 연산자
!true;   // false
!false;  // true

//암묵적 타입 변환
!0 // true
!'Hello'; // false

//단축 평가
'Cat' && 'Dog' // 'Dog'

드 모르간의 법칙

논리 연산자로 구성된 복잡한 표현식은 가독성이 좋지 않아서 드모르간의 법칙을 활용하면 복잡한 표현식을 가독성 좋은 표현식으로 변환할 수 있다.

!(x || y) === (!x && !y)
!(x && y) === (!x || !y)

📌쉼표 연산자

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

let x, y, z;
x = 1, y = 2, z = 3; // 3

📌그룹 연산자

소괄호로 피연산자를 감싸는 그룹연산자는 자신의 피연산자인 표현식을 가장 먼저 평가한다. 따라서 연산자의 우선순위를 조절할 수 있다. 그룹 연산자는 연산자 우선순위가 가장 높다.

10 * 2 + 3; // 23

//그룹연산자로 우선순위 조절
10 * (2 + 3); // 50

📌typeof 연산자

typeof 연산자는 피연산자의 데이터 타입을 문자열로 반환한다. 'null'을 반환하는 경우는 없으며, 함수의 경우 'function'을 반환한다.

typeof ''			// string
typeof 1			// number
typeof NaN			// number
typeof true			// bloolean
typeof underfined	// underfined
typeof Symbol()		// symbol
typeof null			// object
typeof []			// object
typeof {}			// object
typeof new Date()   // object
typeof /test/gi     // object
typeof function(){} // function

typeof 연산자로 null 값은 null이 아닌 object로 반환하는데에 주의. 이부분은 자바스크립트의 첫 번째 버전의 버그이다. 하지만 기존 코드에 영향을 줄 수 있기 때문에 아직까지 수정되지 못하고 있다.

let foo = null;

typeof foo === null; // false
foo === null; // true

// 선언하지 않은 식별자
typeof wow; // underfined

✅ null타입을 확인할 때는 일치 연산자(===)를 사용한다.
✅ 선언하지 않은 식별자를 typeof 연산자로 연산하면 error가 발생하지 않고 underfinedf를 반환한다.

📌지수 연산자

좌항의 피연산자를 밑으로 우항의 피연산자를 지수로 거듭 제곱하여 숫자 값을 반환한다.

2 ** 2; 	// 4
2 ** 2.5; 	// 5.656854...
2 ** 0; 	// 1
2 ** -2; 	// 0.25

// 지수연산자가 도입되기 전에는 Math.pow 메서드를 사용했다.
Math.pow(2, 2);		// 4
Math.pow(2, 2.5);	// 5.656854...
Math.pow(2, 0);		// 1
Math.pow(2, -2);	// 0.25

// 지수 연산자는 Math.pow보다 가독성이 좋다.
2 ** (3 ** 2);	// 512
Math.pow(2, Math.pow(3, 2)); // 512

// 음수를 거듭제곱의 밑으로 사용히려면 괄호로 묶어야 된다
-5 ** 2;	// SyntaxError
(-5) ** 2;	// 25

// 다른 산술과 마찬가지로 할당 연산자와 사용할 수 있다.
let num = 5;
num **= 2; // 25

// 지수 연산자는 이항 연산자 중에서 우선순위가 가장 높다.
2 * 5 ** 2; // 50

📌그 외의 연산자

  • ?. > 옵셔널 체이닝 연산자
  • ?? > null 병합 연산자
  • delete > 프로퍼티 삭제
  • new > 생성자 함수를 호출할 때 사용하여 인스턴스 생성
  • instanceof > 좌변의 객체가 우변의 생성자 함수와 연결된 인스턴스인지 판별
  • in > 프로퍼티 존재 확인

📌연산자 부수효과

대부분의 연산자는 다른 코드에 영향을 주지 않는데, 일부 연산자는 영향을 주는 부수 효과가 있다. 할당 연산자(=), 증가/감소 연산자(++/--), delete 연산자이다.

// 할당 연산자
let x;
x = 1; // 1

// 증가/감소 연산자
x++; // 2

// delete 연산자
let o = { a:1 };
delete o.a; // {}

📌연산자 우선순위

연산자가 실행되는 순서. 우선순위가 높을수록 먼저 실행된다.

  • ()
  • new(매개변수 존재), [](프로퍼티 접근), ()(함수 호출), .?(옵셔널 체이닝 연산자)
  • new(매개변수 미존재)
  • x++, x--
  • !x, +x, -x, ++x, --x, typeof, delete
  • **(이항 연산자 중에서 우선순위 가장 높음)
  • *, /, %
  • +, -
  • <, <=, >, >= in, instanceof
  • ==, !=, ===, !==
  • ??(null 병합 연산자)
  • &&
  • ||
  • ? ... : ...(삼항 연산자)
  • 할당 연산자(=, +=, -=, ...)
  • ,

📌연산자 결합 순서

연산자의 어느 쪽부터 평가를 수행할 것인지 나타내는 순서이다.

  • 좌항 → 우항 : +, -, /, %, <, <=, >, >=, &&, ||, [], (), ??, ?
  • 우항 → 좌항 : ++, --, 할당 연산자, !x, +x, -x, --x typeof, delete, 삼항 연산자, **
profile
발로하는 코딩 정리기

0개의 댓글