표현식과 연산자 정리

표현식과 연산자

표현식이란?

표현식은 어떤 값이 평가되는 식을 말한다. 값이나 변수 그리고 함수 등의 값을 바탕으로 식을 계산하는 행위를 하여 값을 평가하는 것이다.
우리가 앞 시간에 살펴보았던 Primitive value가 가장 쉬운 표현식이다.

연산자란?

연산자(Operator)는 표현식을 조합하여 더욱 복잡한 표현식을 만들도록 도와주는 것이다. 우리가 흔히 사용하는 더하기, 빼기 등이 그 예이다.
연산자는 우리가 어렸을 때 배웠던 산술식이 그대로 적용된다. (우선순위라던지 결합 법칙 이라던지)

산술 연산하기

더하기, 빼기, 곱하기, 나누기 이런 것들이 산술 연산자다. 이것들이 자바스크립트에서는 어떻게 동작하는 지.araboza

  1. 정수끼리 나누어도 부동소수점이 된다.
1
7 / 2 // -> 3.5

다른 언어에서는 정수 나누기 정수는 정수값이 나온다. js는 그딴거 없다.

  1. %의 피연산자는 부동소수점이다.
1
15 % 4 // -> 3
  1. +연산자는 피연사 중 하나가 문자열이면 나머지 피연산자를 문자열로 만든다.
1
1 + '2month' // -> '12month'
  1. NaN, undefined

단항 연산자

++는 증가연산자로 ++a, a++로 나눈다. 둘은 형태가 다르다. 전자의 경우는 a에 1을 더한 후 값을 평가하고 후자의 경우 a를 평가한 후에 1을 더한다.

1
2
3
a = 1;
b = ++a; // b = 2, a = 2
c = a++ +2; // c = 4, a = 3

대입연산자

대입 연산자와 산술 이항 연산자를 조합하여 간략하게 표현할 수도 있다.

+= -> a = a + b 뭐 이런식으로 말이다.

Math 객체의 프로퍼티

자바스크립트는 기본적인 산술 연산과 수학 연산을 지원한다 Math 객체의 프로퍼티와 메서드를 사용하여 간단한 산술 연산을 할 수 있다.

Math의 프로퍼티

프로퍼티에는 여러가지가 있지만 기본적으로(사실 사용하는 것도 많지는 않다.) Math.PI를 사용하여 원주율을 사용한다.

Math의 메서드

  1. Math.abs(x: number): number (ES1)

절댓값을 반환하는 메서드이다.

1
Math.abs(-1) // 1;
  1. Math.round(x: number): number(ES1)

숫자를 가장 인접한 정수로 올리거나 내림한다. (반올림)

1
Math.round(10.49) // 11;
  1. Math.sqrt(x: number): number(ES1)

양의 제곱근을 반환한다.

1
Math.sqrt(9) // 3;
  1. Math.ceil(x: number): number(ES1)

지정된 숫자를 자신보다 큰 가장 가까운 정수로 올림한다.

1
Math.ceil(1.4) // 2;
  1. Math.floor(x: number): number(ES1)

지정된 숫자를 자신보다 작은, 가장 가까운 정수로 내림한다.

1
Math.floor(1.9) // 1;
  1. Math.random(): number(ES1)

0~1 사이의 임의의 숫자를 반환한다. 1은 포함되지 않는다.

1
2
var randomNum = Math.floor((Math.random() * 10) + 1);
console.log(randomNum);
  1. Math.pow(x: number, y: number): number(ES1)

첫 번째 인수를 base, 두 번째 인수를 지수로 하여 거듭제곱을 반환한다.

1
Math.pow(2,8) // 1;

주의할 점

산술 연산을 할 때에는 유효한 자릿수가 있기 때문에 어느 정도의 오차가 발생할 수 있다.

문자열

  1. 문자열 연결하기

+연산자는 피연사자가 모두 문자열이면 문자열로 연결한다. 하나만 문자열일 때는 (혹은 문자열로 변환할 수 있을 때는) 다른 피연사자의 타입을 문자열로 바꾼 다음 연결한다.

  1. 문자열 메서드

String 래퍼 객체는 문자열을 처리하기 위해 프로퍼티와 메서드를 보유하고 있는 객체이다. 하지만 굳이 생성자를 사용하지 않아도 문자열이 일시적으로 래퍼 객체로 변환되기 때문에 메서드를 사용할 수 있다.

    1. String.prototype.charAt(pos: number): string(ES1)

매개 변수로 전달된 인덱스 번호에 해당하는 문자 를 반환한다. 지정된 인덱스를 벗어난 경우 빈문자열을 반환한다.

charAt

1
2
3
4
var str = 'Hello';
for (var i = 0; i < str.length; i++) {
console.log(str.charAt(i));
}
    1. String.prototype.concat(…strings: string[]): string(ES3)

매개변수로 전달된 1개 이상의 문자열과 연결하여 새로운 문자열을 반환한다.

+연산자를 사용하는 것이 더 빠르다.(지금은 뭐..)

    1. String.prototype.indexOf(searchString: string, fromIndex=0): number(ES1)

매개변수로 전달된 문자열을 대상으로 검색하여 처음 발견될 곳에 index를 반환한다. 없을 경우 -1을 반환한다.

    1. String.prototype.lastIndexOf(searchString: string, fromIndex=this.length-1): number(ES1)

마지막으로 발견된 곳의 index를 반환한다. 발견하지 못한 경우 -1을 반환한다.

    1. String.prototype.replace(searchValue: string | RegExp, replaceValue: string): string(ES3)

첫 번째 인자로 전달된 문자열 또는 정규표현식을 대상 문자열에서 검색하여 인자에 전달된 문자열로 대체한다. 원본 문자열은 변경되지 않고 새로운 문자열을 반환한다. 복수일 경우 첫 번째 문자열로 대체된다.

    1. String.prototype.split(separator: string | RegExp, limit?: number): string[] (ES3)

첫 번째 인자에 전달된 문자열 또는 정규표현식을 대상 문자열에서 검색하여 문자열을 구분한 후 분리된 각 문자열로 이루어진 배을 반환한다. 원본 문자열은 변경되지 않는다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var str = 'How are you doing?';

var splitStr = str.split(' ');
console.log(splitStr);
console.log(str);

splitStr = str.split();
console.log(splitStr);

splitStr = str.split('');
console.log(splitStr);

splitStr = str.split(' ', 3);
console.log(splitStr);

splitStr = str.split('o');
console.log(splitStr);
    1. String.prototype.substring(start: number, end=this.length): string(ES3)

첫 번째 인자에 전달된 인덱스의 문자부터 두 번째 인자에 전달된 인덱스에 해당하는 문자의 바로 이전 문자까지 반환한다.

substring

첫 번째 인수가 두번째 인수가 더 클 경우 두 인ㅅ는 교환되고 두 번째 인수가 생략되면 문자열 끝까지 반환한다. 인수가 0보다 작거나 NaN이면 0으로 취급하고 인수가 문자열의 길이보다 크면 문자열의 길이로 인식된다.

동일 연산자와 일치 연산자

둘의 차이는 값만 비교한다는 것과 값과 타입을 같이 비교한다는 점이다.

논리 연산자

&&(논리곱), ||(논리합), !(부정)이 있으며 뜻을 한 번 풀어보면,

a && b는 a와 b가 모두 true면 true가 된다. 여기서 a가 false값이면 b와 상관없이 false가 된다. a를 평가한 값이 true면 b의 값으로 결정된다.

a || b는 a또는 b 중 하나가 true면 true이다. a가 true면 b를 평가하지 않는다. a를 평가한 값이 false면 b의 값이 된다.

조건 연산자

삼항 연산자로 간단히 표현할 수 있다.

1
2
3
4
5
var num = 10;

// 0은 false로 취급된다.
var kind = num ? (num > 0 ? '양수' : '음수') : '영';
console.log(kind); // 양수