← 글 목록

notes

07장. 연산자

모던 JS Deep Dive — 연산자 종류·우선순위와 평가 규칙 핵심 정리.

참고: 이웅모 《모던 자바스크립트 Deep Dive》 7장 · [MDN Expressions and operators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators)

연산자는 “값과 값을 결합해 새 값을 내는 기호”로 시작했지만, 동등 비교·논리·지수·typeof까지 가면 언어 철학이 드러난다. 이 장은 산술부터 **, typeof, 쉼표까지 한 지도로 묶는다.

flowchart TB
  OP[연산자] --> AR[산술]
  OP --> AS[할당]
  OP --> CMP[비교 ===]
  OP --> LOG[논리 && || !]
  OP --> SPEC[typeof ** ?: ,]

7.1 산술

이항: + - * / % 단항: + - ++ --

console.log(5 % 2);
console.log(+'10');
let x = 1;
console.log(++x, x++);

+는 문자열 연결도 겸함(9).

7.2 할당

= += -= *= … 할당은 표현식 — 값이 오른쪽(또는 연산 결과).

let a = 1;
a += 2;
let b, c;
b = c = 3;

7.3 비교

== vs ===

느슨한 동등은 타입 변환 후 비교. 일치는 타입까지. 실무 기본 === / !==.

console.log(1 == '1'); // true
console.log(1 === '1'); // false
console.log(NaN === NaN); // false — Object.is / Number.isNaN

대소

< > <= >= — 문자열은 유니코드 순서. 로케일 비교는 localeCompare.

7.4 삼항 ?:

const label = score >= 60 ? 'pass' : 'fail';

중첩 삼항은 가독성 해침 → if/lookup.

7.5 논리

! && || — 단축 평가(9). 반환이 불리언만이 아님.

7.6 쉼표

왼쪽부터 평가, 마지막 값.

let x = (1, 2, 3); // 3

for 절 등. 남용 비추.

7.7 그룹 ()

우선순위 변경.

7.8 typeof

typeof 1; // 'number'
typeof null; // 'object' — 역사적 버그
typeof []; // 'object' — Array.isArray
typeof (() => {}); // 'function'

7.9 지수 **

2 ** 3; // 8
2 ** 3 ** 2; // 512 — 우측 결합

예제

function clamp(n, min, max) {
  return n < min ? min : n > max ? max : n;
}
function isSame(a, b) {
  return Object.is(a, b);
}

헷갈리던 장면 / 함정

  • ==
  • typeof null
  • ++ 전후위
  • ** 결합 방향
  • || 기본값

표

질문 → 자답

Q. Object.is와 === 차이? A. NaN과 +0/-0 처리. 그 외 대부분 같음.

Q. 할당이 비교보다 우선? A. 우선순위 표를 의심스러울 때 괄호.

웹 보강 메모

MDN operator precedence. 린트 eqeqeq, no-sequences.

실무로 바로

  • === 기본
  • 삼항은 얕게
  • typeof는 원시 가드, 객체는 더 구체적 API
  • 지수·비트는 주석

여기서 잠깐 💁‍♂️

8장 제어문 — 연산 결과를 흐름에 연결한다.

보강 — 널리시·옵셔널은 9장과 공유

?? ?.는 현대 코드의 기본 연산자 세트. 7에서 논리만 보고 끝나면 실무가 비다.

보강 — 비트 연산

& | ^ ~ << >> >>> — ToInt32. 플래그·마스크. 가독성 위해 이름있는 상수.

const READ = 1 << 0;
const WRITE = 1 << 1;
const mode = READ | WRITE;
console.log(mode & WRITE);

연습 체크리스트

  • [ ] 핵심 표만 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 링크 한 번씩 훑기
  • [ ] 실무 코드에서 같은 패턴 검색
  • [ ] 관련 장(앞뒤) 한 줄로 연결

일기 보강 — 헷갈림 → 찾아봄 → 정리

처음에 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다.

추가 예제 블록

// 실험 1 — 기대 vs 실제를 주석으로 남긴다
console.log('실험');
// 실험 2 — 경계값
console.log('경계');
// 실험 3 — 실무 형태
function demo() { return true; }
console.log(demo());

웹·스펙 메모

MDN과 ECMA-262 용어가 다를 수 있다. 노트에는 내가 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 원문 복붙 없이 “왜 이렇게 동작하나”만 남긴다.

실무 적용 한 스푼

PR 리뷰 때 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다. 팀 컨벤션이 없으면 이 노트 표를 초안으로 제안한다.

연습 체크리스트

  • [ ] 핵심 표만 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 링크 한 번씩 훑기
  • [ ] 실무 코드에서 같은 패턴 검색
  • [ ] 관련 장(앞뒤) 한 줄로 연결

일기 보강 — 헷갈림 → 찾아봄 → 정리

처음에 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다.

추가 예제 블록

// 실험 1 — 기대 vs 실제를 주석으로 남긴다
console.log('실험');
// 실험 2 — 경계값
console.log('경계');
// 실험 3 — 실무 형태
function demo() { return true; }
console.log(demo());

웹·스펙 메모

MDN과 ECMA-262 용어가 다를 수 있다. 노트에는 내가 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 원문 복붙 없이 “왜 이렇게 동작하나”만 남긴다.

실무 적용 한 스푼

PR 리뷰 때 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다. 팀 컨벤션이 없으면 이 노트 표를 초안으로 제안한다.

연습 체크리스트

  • [ ] 핵심 표만 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 링크 한 번씩 훑기
  • [ ] 실무 코드에서 같은 패턴 검색
  • [ ] 관련 장(앞뒤) 한 줄로 연결

일기 보강 — 헷갈림 → 찾아봄 → 정리

처음에 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다.

추가 예제 블록

// 실험 1 — 기대 vs 실제를 주석으로 남긴다
console.log('실험');
// 실험 2 — 경계값
console.log('경계');
// 실험 3 — 실무 형태
function demo() { return true; }
console.log(demo());

웹·스펙 메모

MDN과 ECMA-262 용어가 다를 수 있다. 노트에는 내가 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 원문 복붙 없이 “왜 이렇게 동작하나”만 남긴다.

실무 적용 한 스푼

PR 리뷰 때 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다. 팀 컨벤션이 없으면 이 노트 표를 초안으로 제안한다.

연습 체크리스트

  • [ ] 핵심 표만 다시 그리기
  • [ ] 함정 예제를 콘솔에서 재현
  • [ ] MDN 링크 한 번씩 훑기
  • [ ] 실무 코드에서 같은 패턴 검색
  • [ ] 관련 장(앞뒤) 한 줄로 연결

일기 보강 — 헷갈림 → 찾아봄 → 정리

처음에 용어가 추상적으로 들렸다. 책을 덮고 한 줄 정의를 내 말로 다시 쓰고, 예제를 최소 세 개 쳐 보니 문제 유형이 보이기 시작했다. “외운 문장”이 아니라 “다시 설명 가능한 문장”이 남을 때까지 표를 줄였다 늘렸다.

추가 예제 블록

// 실험 1 — 기대 vs 실제를 주석으로 남긴다
console.log('실험');
// 실험 2 — 경계값
console.log('경계');
// 실험 3 — 실무 형태
function demo() { return true; }
console.log(demo());

웹·스펙 메모

MDN과 ECMA-262 용어가 다를 수 있다. 노트에는 내가 디버깅에 쓰는 말을 우선 적고, 면접용 키워드를 괄호로 병기한다. 원문 복붙 없이 “왜 이렇게 동작하나”만 남긴다.

실무 적용 한 스푼

PR 리뷰 때 이 장 키워드가 보이면 체크리스트를 붙인다. 버그 리포트에는 재현 코드와 기대/실제를 한 쌍으로 적는다. 팀 컨벤션이 없으면 이 노트 표를 초안으로 제안한다.