[JS Statement(문)] 연산자(operator)

Chanki Hong·2022년 11월 7일
0

JavaScript

목록 보기
4/30
post-thumbnail

연산자(operator)

  • 값을 만드는 행동. (표현식의 동사느낌)
  • 프로그래밍 언어에서 특정 연산을 할때 사용하는 문자.
  • 연산자는 하나 이상의 피연산자가 있음.
  • 피연산자는 매개변수(argument)라고도 함.

산술 연산자

  • +: 덧셈, 문자열 병합, 단항 플러스.
    • 단항 플러스는 변수와 상수에만 사용 가능함.
    • 숫자형 리터럴 앞에 + 는 숫자형 리터럴의 일부로 해석. (연산자가 아님)
    • 덧셈과 단항 플러스가 동시에 있을 때, 단항 플러스가 먼저 작동.
// 문자열 병합
const a = '안녕';
const b = '하세요';
console.log(a + b); // '안녕하세요' 출력.

// JS는 피연산자의 타입을 보고 덧셈과 문자열 병합을 판단. 왼쪽 => 오른쪽 순서임.
console.log(3 + 5 + '8'); // 문자열 '88' 출력.
console.log('3' + 5 + 8); // 문자열 '358' 출력.

// 단항 플러스
const s = '5'; // 문자형 리터럴 '5' 할당.
const y = 3 + +s; // 단항 플러스는 문자열을 숫자로 강제 변환. y는 8.
// 단항 플러스 이용 안했을 때는 문자열 병합으로 y는 '35'.
  • -: 뺄셈, 단항 부정.
    • 단항 부정은 변수와 상수에만 사용 가능함.
    • 숫자형 리터럴 앞에 - 는 숫자형 리터럴의 일부로 해석. (연산자가 아님)
    • 뺄셈과 단항 부정이 동시에 있을 때, 단항 부정이 먼저 작동.
// 단항 부정
const x = 5;
const y = 3 - -x; // y는 8.
  • *: 곱셈.
  • /: 나눗셈.
  • %: 나머지(remainder).
    • 나눗셈을 한 나머지 반환.
  • ++: 전위/후위 증가.
  • --: 전위/후위 감소.
// 증가.
let a = 1;
console.log(a++); // 1출력 이후에 1증가.
console.log(a); // 2출력.
console.log(++a); // 출력 전에 1증가 후 3출력.
// 감소(--)도 동일.
  • 문자열 붙이기는 + 이용.

대입 연산자

  • 오른쪽 값을 왼쪽에 대입.
  • = 이용.
let a = 1; // 선언문은 대입 연산자에 해당 안함.
a += 4; // a에 4을 더하여 a는 5.
a -= 3; // a에 3을 빼서 a는 2.
a *= 2; // a에 2를 곱해 a는 4.
a /= 4; // a를 4로 나누어 a는 1.

논리 연산자

  • boolean 값을 처리하기 위한 연산자.
  • 조건문에서 유용.

NOT

  • ! 이용.
  • truefalsefalsetrue로 바꿈.
const a = !false; // true로 반전.

AND

  • && 이용.
  • 양 옆의 boolean값이 true일 때만 true를 반환.
const a = true && true; // true 반환.

OR

  • || 이용.
  • 양 옆의 boolean값 중 하나만 ture라면 ture를 반환.
const a = true || false; // true 반환.
const a = false || false; // false 반환.

우선순위

  • 우선순위는 NOT => AND => OR.
let VALUE = !(true && false || true && false || !false);
// let VALUE = !(true && false || true && false || !false);
// VALUE = !((true && false) || (true && false) || true);
// VALUE = !(false || false || true);
// VALUE = !(ture);
// VALUE = false;

단축 평가 논리 계산법(Short-circuit evaluation)

  • 논리 연산자에 boolean이 아닌 피연산자를 사용해서 동작에서 일어나는 부수 효과(side effect)를 이용.
  • ! (NOT)은 boolean이 아닌 값을 반환할 수 없으므로 항상 boolean을 반환.

&& (AND 연산)

  • x && y 에서 xFalsy 한 값이면, y 의 값을 평가할 필요 없이 false.
const doIt = true;
let x = 0;
const result = doIt && x++;
console.log(result); // 0
console.log(x); // 1
console.log(true && 'hello'); // hello 출력.
console.log(false && 'hello'); // false  출력.
console.log('hi' && 'hello'); // hello  출력.
console.log(null && 'hello'); // null  출력.
console.log(undefined && 'hello'); // undefined  출력.
console.log('' && 'hello'); // ""  출력.
console.log(0 && 'hello'); // 0  출력.
console.log(1 && 'hello'); // hello  출력.
console.log(1 && 111); // 111  출력.
  • boolean이 아닌 피연산자에 대한 AND(&&) 진위표.
xyx && y
FalsyFalsyx (Falsy)
FalsyTruthyx (Falsy)
TruthyFalsyy (Falsy)
TruthyTruthyy (Truthy)

|| (OR 연산)

  • x || y 에서 xTruthy 한 값이면, y 의 값을 평가할 필요 없이 true.
const skipIt = true;
let x = 0;
const result = skipIt || x++;
console.log(result); // true
console.log(x); // 0
console.log(false || 'hello'); // hello 출력.
console.log('' || 'hello'); // hello 출력.
console.log(null || 'hello'); // hello 출력.
console.log(undefined || 'hello'); // hello 출력.
console.log(0 || 'hello'); // hello 출력.
console.log(1 || 'hello'); // 1  출력.
console.log(1 || 111); // 1  출력.
  • boolean이 아닌 피연산자에 대한 OR(||) 진위표.
xyx || y
FalsyFalsyy (Falsy)
FalsyTruthyy (Truthy)
TruthyFalsyx (Truthy)
TruthyTruthyx (Truthy)

비교 연산자

  • === (strict equality), !== : 두 값이 일치함불일치.
  • == (loose equality), != : 두 값이 동등함동등하지 않음. (권장안함)
  • < , > , >= , <=: 두 값의 대소관계. (관계 연산자라고도 함)
// 일치함.
const a = 1;
const b = 1;
const equals = a === b;
console.log(equals); // true 출력.

//동등함.
const a = 1;
const b = '1';
const equals = a == b;
console.log(equals); // true 출력.

조건 연산자(3항 연산자)

  • JS의 유일한 3항 연산자로 피연산자를 세개 받음. (다른 연산자는 모두 두개 이하)
  • ? (물음표)와 : (콜론)을 이용.
  • condition ? true : false
  • if ...else 문과 동등한 표현식.
  • 3항 연산자는 표현식이므로 다른 표현식과 결합하여 매우 유용하게 사용 가능.
// if문을 이용할 때.
const arr = [];
let text = '';
if (arr.length === 0) {
  text = '배열이 비어있습니다.';
} else {
  text = '배열이 비어있지 않습니다.';
}
console.log(text); // 배열이 비어있습니다.

// 3항 연산자를 이용할 때.
const arr = [];
let text = '';
arr.length === 0
  ? (text = '배열이 비어있습니다.')
  : (text = '배열이 비어있지 않습니다.');
console.log(text); // 배열이 비어있습니다.
  • 중첩 가능.
  • 하지만 3항 연산자의 중첩은 보기에 좋지 않고, 헷갈려 지양함.
// if문 중첩
let num = 7;
if (num >= 10) {
  console.log('10 이상입니다.');
} else if (num >= 5) {
  console.log('5이상입니다.');
} else {
  console.log('0이상입니다.');
}

// 3항 연산자 중첩.
let num = 7;
num >= 10
  ? console.log('10 이상입니다.')
  : num >= 5
  ? console.log('5이상입니다.')
  : console.log('0이상입니다.');

확산 연산자(spread operator)

객체

  • ... 으로 표시.
  • 기존 객체의 값을 복사하고, 새로운 값을 추가할 때.
  • 객체는 복사될 때 참조형 타입으로 같은 객체를 가르킴.
const slime = {
  name: '슬라임',
};
const cuteSlime = slime;
cuteSlime.attribute = 'cute';

const purpleCuteSlime = cuteSlime;
cuteSlime.color = 'purple';

console.log(slime); // { name: '슬라임', attribute: 'cute', color: 'purple' }
console.log(cuteSlime); // { name: '슬라임', attribute: 'cute', color: 'purple' }
console.log(purpleCuteSlime); // { name: '슬라임', attribute: 'cute', color: 'purple' }
  • 확산 연산자를 이용하면 새로운 객체로 복사.
const slime = {
  name: '슬라임',
};
const cuteSlime = {
  ...slime, // slime 값 복사.
  attribute: 'cute',
};
const purpleCuteSlime = {
  ...cuteSlime, // cuteSlime 값 복사.
  color: 'purple',
};
const redCuteSlime = {
  ...purpleCuteSlime, // purpleCuteSlime 값 복사.
  color: 'red', // color를 red로 수정.
};

console.log(slime); // { name: '슬라임' }
console.log(cuteSlime); // { name: '슬라임', attribute: 'cute' }
console.log(purpleCuteSlime); // { name: '슬라임', attribute: 'cute', color: 'purple' }
console.log(redCuteSlime); // { name: '슬라임', attribute: 'cute', color: 'red' }

배열

const animals = ['개', '고양이', '참새'];
const anotherAnimals = [...animals, '비둘기'];

console.log(animals); // [ '개', '고양이', '참새' ]
console.log(anotherAnimals); // [ '개', '고양이', '참새', '비둘기' ]
  • 중복으로 사용 가능.
const numbers = [1, 2, 3, 4, 5];
const spreadNumbers = [...numbers, 10000, ...numbers];

console.log(spreadNumbers); // [1, 2, 3, 4, 5, 10000, 1, 2, 3, 4, 5]

함수의 인자(파라미터에 들어가는 리터럴)

function subtract(x, y) {
  return x - y;
}

const numbers = [1, 2];
const result = subtract(...numbers);
console.log(result); // -1

나머지 매개변수(rest)

  • 확산 연산자를 이용하여 나머지 매개변수(rest) 문법을 이용.
  • 객체, 배열, 함수의 파라미터에서 사용.
  • 맨 마지막 순서에서만 이용 가능. (맨 앞 또는 중간은 불가)

객체

const purpleCuteSlime = {
  name: '슬라임',
  attribute: 'cute',
  color: 'purple',
};

const { color, ...rest } = purpleCuteSlime;
console.log(color); // purple
console.log(rest); // { name: '슬라임', attribute: 'cute' }
const purpleCuteSlime = {
  name: '슬라임',
  attribute: 'cute',
  color: 'purple',
};

const { color, ...cuteSlime } = purpleCuteSlime;
console.log(color); // purple
console.log(cuteSlime); // { name: '슬라임', attribute: 'cute' }

const { attribute, ...slime } = cuteSlime;
console.log(slime);
  • 꼭 이름이 rest 일 필요는 없음.
const purpleCuteSlime = {
  name: '슬라임',
  attribute: 'cute',
  color: 'purple',
};

const { color, ...cuteSlime } = purpleCuteSlime;
console.log(color); // purple
console.log(cuteSlime); // { name: '슬라임', attribute: 'cute' }

배열

const numbers = [0, 1, 2, 3, 4, 5, 6];
const [one, ...rest] = numbers;
console.log(one); // 0
console.log(rest); // [ 1, 2, 3, 4, 5, 6 ]

함수의 파라미터(매개변수)

  • 함수의 파라미터로 사용하면, 해당 부분은 배열(array)로 묶임.
// 숫자의 개수와 상관없이 합을 반환하는 함수
// rest 배열에 모든 숫자가 들어감.
function sum(...rest) {
  return rest.reduce((acc, current) => acc + current, 0);
}
console.log(sum(1, 2, 3, 4, 5)); // 15

0개의 댓글