표현식과 연산자

Kay·2020년 8월 24일
0
post-custom-banner

연산자

표현식

결과적으로 어떤 값으로 평가(evaluation)되는 것.

  • 표현식을 평가한다?
    표현식의 값과 변수, 함수 등의 값을 바탕으로 식의 값을 계산하는 행위

  • 표현식의 예

    • 숫자, 문자열, 논리값 등의 원시 값(primitive values)
    • 변수, 프로퍼티, 배열 요소, 함수 호출, 메서드 호출
  • 연산자와 피연산자
    연산자(operator)를 사용하면 표현식을 조합하여 더욱 복잡한 표현식을 만들어낼 수 있음.
    연산 대상이 되는 표현식을 피연산자(operand)라고 부름.

    연산자는 피연산자 개수에 따라, 단항 연산자, 이항 연산자, 삼항 연산자로 분류하며, 자바스크립트에서 삼항 연산자는 ?:(삼항 조건 연산자) 뿐이다.

산술 연산

산술 연산자

피연산자가 숫자인 연산자

  • 피연산자가 숫자가 아닐 때는 연산자가 피연산자 타입을 숫자타입으로 바꾸어 연산.
  • 연산 결과로는 숫자 값이 나오지만 피연산자가 숫자로 바꿀 수 없는 값이거나 계산할 수 없을 때는 NaN이 나옴.
  • 모든 산술 연산은 64비트 부동소수점 연산으로 이루어짐.

산술 이항 연산자

+ : 더하기
- : 빼기
* : 곱하기
/ : 나누기 (나눈 값)
% : 나머지 (나눈 나머지 값)
  • 정수끼리 나누어도 결과가 부동소수점이 된다
7 / 2 // -> 3.5
  • 나머지 연산자 %의 피연산자는 부동소수점이다
15 % 4 // -> 3
5 % 1.5 // -> 0.5
  • + 연산자는 피연산자 중 하나가 문자열이면 나머지 피연산자를 문자열로 만든다
1 + "2month" // -> "12month"
  • 기타
// 계산할 수 없는 경우 NaN으로 평가
0 / 0 // -> NaN
"one" * 1 // -> NaN

// 산술 연산자의 피연산자가 true 면 1, false, null 이면 0, undefined 는 NaN으로 평가
true + true // -> 2
1 + null // -> 1
1 + undefined // -> NaN

산술 단항 연산자

++ : 증가 연산자
ex) 
a = 1
++a // -> 2 (a에 1을 더한 다음에 a값을 평가)
a++ // -> 2 (a를 평가한 다음에 a에 1을 더함)

-- : 감소 연산자
ex)
b = 1
--b // -> 0 (b에서 1을 뺀 다음에 b 값을 평가)
b-- // -> 0 (b를 평가한 다음에 b에서 1을 뺌)

+ : 아무것도 처리하지 않음
- : 부호 반전

산술 대입 연산자

대입 연산자와 산술 이항 연산자를 조합한 연산을 좀더 간략하게 표기한 것. (short cut)

ex)
a += b : a = a + b
a -= b : a = a - b
a *= b : a = a * b
a /= b : a = a / b
a %= b : a = a % b

Math 객체의 프로퍼티

  • 자바스크립트에서는 기본적인 산술연산과 복잡한 수학적 연산을 지원함.
  • 이들은 Math 객체의 프로퍼티와 메서드에 포함되어 있음.

부동소수점과 정확도 문제

산술 연산을 할 때는 숫자에 유효한 자릿수가 있으므로 계산할 때 오차가 발생한다는 점을 염두에 두어야함.

  • 일반적으로 값이 가까운 두 수를 뺄셈할 때 정확도 문제가 발생하는 데 이를 정밀도 손실이라고 함.

문자열 제어하기

문자열을 처리하기 위한 객체로 String 객체가 마련되어 있음.
문자열을 String 객체로 변환 하려면 String 생성자를 사용함.

var msgObj = new String("Everything is practice.");
// 원시 값을 객체로 변환하는 행위를 원시값을 객체로 래핑(wrapping)한다고 함.

var msg = "Everything is practice.";
console.log(msg.length); // -> 23
onsole.log(msg.charAt(3)); // -> r (문자열의 n번째 문자를 구할 수 있음)
// String 객체의 프로퍼티와 메서드는 문자열에서도 사용할 수 있음.
// 래퍼 객체(wrapper object)로 자동 변환되기 때문
  • 문자열 메서드 사용 예
var msg = "Everything is practice.";
msg.substring(7, 10) // -> "ing" : 7번째 문자열부터 10번째 이전의 문자열
msg.slice(7, 10) // 위 코드와 같음
msg.slice(-3) // "ce." : 마지막 문자 세 개
msg.indexOf("t") // -> 5 : 문자 t가 처음 나오는 위치
msg.indexOf("i", 10) // -> 11 : 10번째 이후 문자에서 "i"가 처음 나오는 위치
msg.lastIndexOf("t") // -> 18 :  문자 "t"가 마지막으로 나오는 위치
msg.split(" ") // -> ["Everything", "is", "practice."] : " "로 문자열을 나눔
msg.replace("p","P") // -> 'Everything is Practice.' : "p" -> "P"
msg.toUpperCase() // -> 'EVERYTHING IS PRACTICE.'
msg.endsWith(".") // -> true
msg.includes("thing") // -> true
  • JS에서 string replaceAll
var msg = "Everything is practice.";
msg.replace('i','I');
'EverythIng is practice.' // 앞에 한 글자만 바뀐다.

// 1. 정규식을 이용한 replace> msg.replace(/i/gi,'I');
'EverythIng Is practIce.'// gi는 정규식 옵션
// g: global
// i: ignor case
// m: multiline

// 2. replaceAll 함수 사용
const replaceAll = (str, searchStr, replaceStr) => str.split(searchStr).join(replaceStr);
replaceAll("Everything is practice.", "i", "I");
> 'EverythIng Is practIce.'
  • 문자열을 배열로 읽고 쓰기
// 문자열을 읽을 때는 charAt 메서드 대신 대괄호 연산자를 사용할 수 있음.
var msg = "Everything is practice.";
msg[3] // -> r
// 그러나 배열처럼 값을 대입해서 수정할 수 없음. 대입해도 무시됨.
msg[3] = "R";

논리 연산자와 관계 연산자

관계연산자

두 개의 피연산자를 비교한 결과를 논리값(true/ false)로 반환.

  • 동일 연산자 ( == )

    좌변과 우변의 피연산자가 같은지 판별.
    좌우 피연산자의 타입을 변환한 다음에 좌변과 우변이 같은지를 느슨하게 비교.

    • 좌우 피연산자 타입이 같을 때
      → 값이 같으면 true, 다르면 false

      var a = [1, 2, 3];
      var b = [1, 2, 3];
      var c = a;
      console.log( a == b); // -> false
      console.log( a == c); // -> true
    • 좌우 피연산자 타입이 다를 때
      → 두 피연산자가 같은 타입이 되도록 타입을 변환한 뒤, 다음 규칙에 따라 동일한지 판별

      - undefinednull은 같은 것을 친다.
      - 한쪽이 숫자고 다른 한 쪽이 문자열이면 문자열을 순자로 변환해서 비교한다.
      - 둘 중 한쪽이 논리값이면 true1, false0으로 변환해서 비교한다.
      - 한 쪽이 객체이고 다른 한 쪽이 숫자 또는 문자열이면 객체를 toString이나 valueOf 메서드를 사용해서 원시타입으로 변환한 다음에 비교한다.
      - 앞의 규칙에서 벗어나면 모두 '같지 않음'으로 판정한다.
      
      ex)
      null == undefined // -> true
      1 == "1" // -> true
      true == 1 // -> true
      true == "1" // -> true
      [2] == 2 //true
  • 일치 연산자 ( === )

    피연산자를 평가한 후에 타입을 변환하지 않은 상태의 두 값을 엄격하게 비교.
    타입과 값이 모두 같으면 같다고 판정하고, 그렇지 않으면 같지 않다고 판정.
    단, NaN는 NaN를 포함한 모든 값과 같지 않다고 판정.

    NaN === NaN // -> false
    null === undefined // -> false
    1 === "1" // -> false
    true === 1 // -> false
    true === "1" // -> false
    [2] === 2 // -> false

논리 연산자

&& : and
|| : or
! : not

  • 피연산자의 평가

    → 논리 연산자의 피연산자는 논리값이 아니어도 됨.

    0, -0, 빈문자열(""), NaN, null, undefined         -> false
    0을 제외한 숫자, 빈 문자열을 제외한 문자열, 모든 객체, 심벌  -> true

명시적 타입 변환

숫자를 문자열로 변환하기

  • 숫자 + 문자열
10 + "cookies" // -> "10cookies"
100 + "" // -> "100" : 숫자에 빈 문자열을 더해 숫자 타입을 문자열로 바꿀 수 있음.
  • Number 객체의 메서드를 활용
var n = 26;
n.toString() // -> "26" : 인수를 지정하지 않으면 10진수 문자열로 변환
n.toString(2) // -> "11010" : 2진수 문자열로 변환

var x = 1234.567;
x.toFixed(0) // -> "12345" : 숫자의 소수점 아래 자릿수를 지정한 문자열로 변환
  • String 함수를 활용
// String 생성자 앞에 new 연산자를 붙이면 String 객체를 생성하는 함수로 사용할 수 있지만,
// new 연산자를 붙이지 않으면 일반적인 함수로 활용 가능. 반환값은 문자열.

String(26) // -> "26"
String(1234.567) // -> "1234.567"

// String 함수에는 모든 데이터 타입을 문자열 타입으로 바꾸는 기능이 있음.

String(true) // -> "true"
String(NaN) // -> "NaN"
String(null) // -> "null"

문자열을 숫자로 변환하기

  • 수식 안에서 묵시적으로 변환
var s = "2";
s - 0 // -> 2
+s    // -> 2
  • parseInt, parseFloat 함수 사용
// 문자열의 첫 번째 문자를 숫자로 바꾼 값을 반환하고, 이후에 등장하는 문자열은 무시.
// 첫 번째 문자를 숫자로 해석할 수 없을 때는 NaN을 반환.
// 문자열 앞 부분의 공백 문자는 무시
  • Number 함수 활용
// Number 생성자 앞에 new 연산자를 붙이면 Number 객체를 생성하는 함수로 사용할 수 있지만,
// new 연산자를 붙이지 않으면 일반적인 함수로 활용 가능. 반환값은 숫자.

Number("2.71828") // -> 2.71828

Number(true) // -> 1
Number(NaN) // -> NaN

논리값으로 변환하기

x = 1

!x // -> false : !연산자는 논리 타입이 아닌 값의 타입을 논리 타입으로 바꿈.
!!x // -> true

Boolean(x) // -> true
profile
new blog✨ https://kay-log.tistory.com/
post-custom-banner

0개의 댓글