🎯 JavaScript의 μ „λ°˜μ μΈ κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.


πŸ“— Today I Learned

μžλ°”μŠ€ν¬λ¦½νŠΈ νŠΉμ§•

인터프리터 μ–Έμ–΄

인터프리터 μ–Έμ–΄λŠ” λ³„λ„μ˜ 컴파일 κ³Όμ • 없이 μ‹€ν–‰λ˜λ―€λ‘œ μ½”λ“œ μž‘μ„± ν›„ λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” μ–Έμ–΄μž…λ‹ˆλ‹€.

πŸ“Œ νŠΉμ§•

  • 컴파일 단계가 μ—†μŠ΅λ‹ˆλ‹€.

  • μ‹€ν–‰ 속도가 비ꡐ적 λŠλ¦½λ‹ˆλ‹€.

  • μˆ˜μ •κ³Ό 싀행이 λΉ λ¦…λ‹ˆλ‹€.

μ΅œμ‹  JavaScript μ—”μ§„(V8 λ“±)은 JIT(Just-In-Time) 컴파일 방식을 λ„μž…ν•˜μ—¬ 속도λ₯Ό μ΅œμ ν™”ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

πŸ€” JIT 컴파일 λ°©μ‹μ΄λž€?
인터프리터 방식과 컴파일러 방식을 ν˜Όν•©ν•œ λ°©μ‹μœΌλ‘œ, μ‹€ν–‰ 도쀑에 ν•„μš”ν•œ μ½”λ“œλ§Œ μ¦‰μ‹œ μ»΄νŒŒμΌν•˜μ—¬ 속도λ₯Ό 높인 λ°©μ‹μž…λ‹ˆλ‹€.



동적 νƒ€μž… μ–Έμ–΄

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… μ–Έμ–΄λ‘œ, λ³€μˆ˜μ— μ €μž₯λ˜λŠ” 값에 따라 νƒ€μž…μ΄ μžλ™μœΌλ‘œ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜

κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ νƒ€μž…μ„ λ³€κ²½ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

  • λ¬Έμžμ—΄ λ³€ν™˜: κ°’.toString() λ˜λŠ” String(κ°’)

  • 숫자 λ³€ν™˜: Number(κ°’)

  • λΆˆλ¦¬μ–Έ λ³€ν™˜: Boolean(κ°’)


암묡적 νƒ€μž… λ³€ν™˜

κ°œλ°œμžκ°€ μ˜λ„ν•˜μ§€ μ•Šμ•„λ„ μ—°μ‚° κ³Όμ •μ—μ„œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ©λ‹ˆλ‹€.

  • λ¬Έμžμ—΄ λ³€ν™˜: κ°’ + ""

  • 숫자 λ³€ν™˜: κ°’ * 1

  • λΆˆλ¦¬μ–Έ λ³€ν™˜: !!κ°’

⚠️ μ˜ˆμƒμΉ˜ λͺ»ν•œ νƒ€μž… λ³€ν™˜μ΄ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ, typeof λ˜λŠ” 일치 μ—°μ‚°μž (===)λ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ„ κ²€μ‚¬ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

=> 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ TypeScript μ‚¬μš©μ„ κ³ λ €ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



ν”„λ‘œν† νƒ€μž… 기반의 상속

클래슀 기반이 μ•„λ‹Œ ν”„λ‘œν† νƒ€μž… 기반 상속을 μ‚¬μš©ν•©λ‹ˆλ‹€. λͺ¨λ“  κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž…μ΄λΌλŠ” λΆ€λͺ¨ 객체λ₯Ό μƒμ†λ°›μœΌλ©°, ν”„λ‘œν† νƒ€μž… 체이닝을 톡해 속성과 λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function () {
  console.log(`My name is ${this.name}`);
};

const dog = new Animal('Buddy');
dog.sayName(); // "My name is Buddy"



νŒ¨λŸ¬λ‹€μž„ 지원

JavaScriptλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°, λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°, 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ λͺ¨λ‘ μ§€μ›ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

ν•¨μˆ˜λ₯Ό κ°’μœΌλ‘œ 닀루고, λΆ€μˆ˜ 효과(side effects)λ₯Ό μ΅œμ†Œν™”ν•˜λ©°, μƒνƒœ 변경을 ν”Όν•˜κ³ , λΆˆλ³€μ„±μ„ μœ μ§€ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€.

const add = (a, b) => a + b;

const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);

console.log(doubled); // [2, 4, 6, 8]

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ–΄λ–»κ²Œ ν• μ§€λ₯Ό λͺ…μ‹œν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμž…λ‹ˆλ‹€. 즉, μƒνƒœ λ³€κ²½κ³Ό λͺ…령을 톡해 ν”„λ‘œκ·Έλž¨μ„ μ œμ–΄ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

const numbers = [1, 2, 3, 4];
let doubled = [];

for (let i = 0; i < numbers.length; i++) {
  doubled.push(numbers[i] * 2);
}

console.log(doubled); // [2, 4, 6, 8]

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 데이터와 κ·Έ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 객체둜 λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(`${this.name} makes a sound.`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} barks.`);
  }
}

const dog = new Dog('Buddy');
dog.speak(); // "Buddy barks."



μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 역사

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 탄생 λ°°κ²½

Brendan Eich 사진 (좜처: wikipedia) Netscape μ›Ήμ‚¬μ΄νŠΈ ν™”λ©΄ (좜처: zdnet)

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 1995λ…„, λ„·μŠ€μΌ€μ΄ν”„(Netscape)μ‚¬μ˜ 개발자 Brendan Eich에 μ˜ν•΄ μ›Ή νŽ˜μ΄μ§€μ˜ 보쑰적인 κΈ°λŠ₯을 μœ„ν•΄ κ°œλ°œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • 1995λ…„ : 이름 λ³€κ²½

    • Mocha β†’ LiveScript β†’ JavaScript

  • 1996λ…„ : 크둜슀 λΈŒλΌμš°μ§• 이슈 λ°œμƒ

    • Netscape의 Netscape Navigator browser와 Mircrosoft의 Internet Explorer 의 μ‚¬μš©μž μ μœ μœ¨μ„ 높이기 μœ„ν•΄ 경쟁적으둜 κΈ°λŠ₯을 μΆ”κ°€ν•˜λ©΄μ„œ, μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λΈŒλΌμš°μ €λ§ˆλ‹€ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이둜 인해 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 λΈŒλΌμš°μ €λ§ˆλ‹€ λ™μž‘ν•˜μ§€ μ•ŠλŠ” 크둜슀 λΈŒλΌμš°μ§• μ΄μŠˆκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

ECMAScript

ECMAScriptλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript)의 기반이 λ˜λŠ” ν‘œμ€€ 규격으둜 1996년에 λ„·μŠ€μΌ€μ΄ν”„κ°€ ECMA(유럽 컴퓨터 μ œμ‘°μ—…μ²΄ ν˜‘νšŒ)에 ν‘œμ€€ν™” μš”μ²­μ„ ν•˜λ©΄μ„œ 개발이 μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • 1997λ…„ : ECMAScript 1 (ES1) 채택
    ECMA μ΄νšŒμ—μ„œ ECMAScript 1둜 μ±„νƒλ˜μ—ˆκ³ , 이후 ECMAScriptλΌλŠ” 이름이 κ³΅μ‹μ μœΌλ‘œ μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • 버전 ν‘œκΈ°λ²•

    • ECMAScript(연도)

    • ES(연도)

    • ES(판)

    • μ˜ˆμ‹œ : ECMAScript2015 - ES2015 - ES6

  • ✨ λΈŒλΌμš°μ €λŠ” λΈŒλΌμš°μ € λ²„μ „λ§ˆλ‹€ μ§€μ›ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μŠ€νŽ™μ΄ μƒμ΄ν•©λ‹ˆλ‹€. (ECMAScript 기쀀을 따라가지 μ•ŠμŠ΅λ‹ˆλ‹€.)


ECMAScript 2015+ (ES6 이후)

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ€‘μš”ν•œ λ²„μ „μœΌλ‘œ let, const, arrow function, class, modules, promise λ“± λ§Žμ€ μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ”μš± κ°•λ ₯ν•˜κ³  μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ μ–Έμ–΄λ‘œ λ°œμ „ν•˜μ˜€μœΌλ©°, 비동기 μ²˜λ¦¬μ™€ λͺ¨λ“ˆν™”κ°€ κ°•ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ€” κ°œλ°œμ—μ„œ μ΅œμ‹  κΈ°λŠ₯을 μ‚¬μš©ν•˜κ³  싢을 λ•ŒλŠ” μ–΄λ–»κ²Œ ν• κΉŒ?

polyfill와 Babel을 ν™œμš©ν•΄μ„œ μ΅œμ‹  κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

polyfill
μ§€μ›ν•˜μ§€ μ•ŠλŠ” λΈŒλΌμš°μ €μ—μ„œ μ΅œμ‹  κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ μ½”λ“œμž…λ‹ˆλ‹€. polyfill λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 주둜 core-jsλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

Babel
μ΅œμ‹  λ²„μ „μ˜ μ½”λ“œλ₯Ό 이전 λ²„μ „μœΌλ‘œ λ³€ν™˜ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. @babel/preset-env을 μ‚¬μš©ν•˜λ©΄, μ„€μΉ˜λœ 폴리필(core-js λ“±)을 가져와 ν•„μš”ν•œ κΈ°λŠ₯만 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘‰ λ˜‘λ˜‘ν•˜κ²Œ λΈŒλΌμš°μ € Polyfill κ΄€λ¦¬ν•˜κΈ° ( ν† μŠ€ κ°œλ°œμžκ°€ μ•Œλ €μ£ΌλŠ” polyfill μ‚¬μš©λ°©μ•ˆ μ°Έκ³  )




μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜

μ»΄ν“¨ν„°λŠ” 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κ³ , 이 데이터λ₯Ό μ°ΎκΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ³€μˆ˜λŠ” 이 μ£Όμ†Œλ₯Ό λŒ€μ‹ ν•  μ΄λ¦„μœΌλ‘œ, 데이터λ₯Ό μ‰½κ²Œ 찾을 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. λ³€μˆ˜λŠ” 데이터λ₯Ό 담아놓은 μƒμžμ˜ 이름이라고 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ³€μˆ˜ syntax

ν‚€μ›Œλ“œ λ³€μˆ˜λͺ… ν• λ‹Ή μ—°μ‚°μž κ°’ 으둜 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

const variable = 1;

λ³€μˆ˜ 생성 κ³Όμ •

1. μ„ μ–Έ 단계

λ³€μˆ˜μ— λ³€μˆ˜ 객체에 λ“±λ‘ν•©λ‹ˆλ‹€.

2. μ΄ˆκΈ°ν™” 단계

λ³€μˆ˜λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ήν•˜κ³ , undefined둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

3. ν• λ‹Ή 단계

undefined둜 μ΄ˆκΈ°ν™”λœ λ³€μˆ˜μ— μ‹€μ œλ‘œ 값을 ν• λ‹Ήν•©λ‹ˆλ‹€.


λ³€μˆ˜ 생성 3λ‹¨κ³„λŠ” var, const, let λ³„λ‘œ λ‹€λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

πŸ‘‰ ν˜Έμ΄μŠ€νŒ…κ³Ό λ³€μˆ˜λŠ” 미리 μž‘μ„±ν•œ 제 λΈ”λ‘œκ·Έλ₯Ό 톡해 κ°œλ…μ„ ν™•μΈν•΄μ£Όμ„Έμš”!




μžλ°”μŠ€ν¬λ¦½νŠΈ μžλ£Œν˜•

λ°μ΄ν„°μ˜ μ’…λ₯˜λ₯Ό 데이터 νƒ€μž…, μžλ£Œν˜•μ΄λΌκ³  ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μžλ£Œν˜•μ€ μ›μ‹œ νƒ€μž…κ³Ό μ°Έμ‘° νƒ€μž…μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

μ›μ‹œ νƒ€μž…

String, Number, BigInt, Undefined, Null, Boolean, Symbol

πŸ“Œ νŠΉμ§•

  • 값은 λ³€κ²½ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. (immutable value)

  • κ°’μœΌλ‘œμ¨ μ „λ‹¬λ©λ‹ˆλ‹€.

  • μ›μ‹œ 래퍼 객체가 λ”°λ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

    πŸ€” μ›μ‹œ 래퍼 객체 (Primitive Wrapper Object)λž€?

    μ›μ‹œ νƒ€μž… 값을 객체처럼 μ·¨κΈ‰ν•  수 있게 ν•΄μ£ΌλŠ” μž„μ‹œ κ°μ²΄μž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ›μ‹œ νƒ€μž…μ„ 객체처럼 λ‹€λ£° 수 μžˆλŠ” 래퍼 객체λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

    <String 래퍼 객체 μ˜ˆμ‹œ>

    let str = "hello";
    console.log(str.toUpperCase()); // "HELLO"

    πŸ’‘ 래퍼 객체λ₯Ό μ‚¬μš©ν•΄λ„ μ›μ‹œ 값은 λ³€κ²½λ˜μ§€ μ•Šκ³ , λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„ 래퍼 κ°μ²΄λŠ” μ‚¬λΌμ§‘λ‹ˆλ‹€.


Number Type

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•˜λ‚˜μ˜ 숫자 νƒ€μž…, Number만 μ‘΄μž¬ν•©λ‹ˆλ‹€. λͺ¨λ“  μˆ«μžλŠ” μ‹€μˆ˜λ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€. 즉, μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” λ³„λ„μ˜ μ •μˆ˜ νƒ€μž…μ΄ μ—†μŠ΅λ‹ˆλ‹€.

μˆ«μžν˜• Number Type

  • 배정밀도 64λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ (IEEE 754)ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

    πŸ€” 배정밀도 64λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ (IEEE 754)ν˜•μ‹μ΄λž€?

    μ „μžκΈ°μˆ μž ν˜‘νšŒμ˜ λΆ€λ™μ†Œμˆ˜μ  ν‘œν˜„λ°©μ‹ ν‘œμ€€μž…λ‹ˆλ‹€. μ‹€μˆ˜ μ—°μ‚° μ‹œ, κ·Όμ‚¬κ°’μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

    console.log(0.1 + 0.2); // 0.30000000000000004
  • 숫자의 λ²”μœ„

// μ›μ‹œ 래퍼 객체(Number)μ—μ„œ μƒμˆ˜ λ³€μˆ˜λ‘œ 제곡
console.log(Number.MAX_SAFE_INTEGER); // -9,007,199,254,740,991
console.log(Number.MIN_SAFE_INTEGER); // 9,007,199,254,740,991

숫자 μ΄μ™Έμ˜ Number Type

  • Infinity : λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 숫자 νƒ€μž…μž…λ‹ˆλ‹€.

  • NaN : Not a NumberλΌλŠ” 뜻으둜 μˆ«μžκ°€ μ•„λ‹˜μ„ λ‚˜νƒ€λ‚΄λŠ” 숫자 νƒ€μž…μž…λ‹ˆλ‹€.



BigInt Type

μž„μ˜ μ •λ°€λ„λ‘œ μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” JavaScript 숫자 μ›μ‹œ κ°’μž…λ‹ˆλ‹€. Number νƒ€μž…μ΄ ν‘œν˜„ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜λŠ” 맀우 큰 μ •μˆ˜ 값을 λ‹€λ£° 수 있게 ν•΄μ€λ‹ˆλ‹€.

  • λ‹€λ₯Έ νƒ€μž…κ³Ό ν˜Όν•©ν•˜μ—¬ μ—°μ‚°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

  • BigIntλŠ” 숫자 뒀에 n을 λΆ™μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

const bigIntValue = 123456789012345678901234567890n;
console.log(bigIntValue); // 123456789012345678901234567890n



String Type

λ¬Έμžμ—΄ 데이터λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. λ¬Έμžμ—΄μ€ λ¬Έμžλ“€μ˜ μˆœμ„œλ₯Ό μ˜λ―Έν•˜λ©°, UTF-16 인코딩 λ°©μ‹μœΌλ‘œ 각 문자λ₯Ό ν‘œν˜„ν•©λ‹ˆλ‹€.

  • λ¬Έμžμ—΄μ€ λ¬Έμžλ“€μ˜ μ§‘ν•©μž…λ‹ˆλ‹€.

  • λ¬Έμžμ—΄μ˜ 각 λ¬ΈμžλŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λŠ” 인덱슀 번호둜 κ΅¬λΆ„λ©λ‹ˆλ‹€.

let str = "hello";
console.log(str[0]);  // "h" (0번째 인덱슀)
console.log(str[1]);  // "e" (1번째 인덱슀)
console.log(str.length);  // 5 (λ¬Έμžμ—΄μ˜ 길이)

ν‘œκΈ°λ²•

  • λ”°μ˜΄ν‘œ('), μŒλ”°μ˜΄ν‘œ("), λ°±ν‹±(`)으둜 κ°μ‹Έμ„œ λ¬Έμžμ—΄μž„μ„ ν‘œν˜„ν•©λ‹ˆλ‹€.

  • λ°±ν‹±(`)은 μ€„λ°”κΏˆ ν˜•μ‹μ΄ ν—ˆμš©λ˜λ©° λ¬Έμžμ—΄ λ‚΄μ—μ„œ λ³€μˆ˜λ₯Ό 직접 μ‚½μž…ν•˜κ±°λ‚˜ ν‘œν˜„μ‹μ„ κ³„μ‚°ν•˜μ—¬ λ™μ μœΌλ‘œ 값을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

let name = "Alice";
let age = 25;

let greeting = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(greeting);  // "Hello, my name is Alice and I am 25 years old."



Boolean Type

논리적인 데이터 μœ ν˜•μœΌλ‘œ ture ν˜Ήμ€ false κ°’λ§Œ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μƒνƒœκ°’(State): Boolean은 주둜 μ–΄λ–€ κ°μ²΄λ‚˜ μš”μ†Œμ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

  • Flagκ°’: νŠΉμ • UI의 λ…ΈμΆœ μ—¬λΆ€λ‚˜ μ–΄λ–€ 쑰건을 λ§Œμ‘±ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ flag λ³€μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.



Undefined Type

λ³€μˆ˜ μ„ μ–Έ ν›„ 값이 ν• λ‹Ήλ˜μ§€ μ•Šμ•˜μ„ λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μžλ™μœΌλ‘œ ν• λ‹Ήλ˜λŠ” κΈ°λ³Έκ°’μž…λ‹ˆλ‹€.

  • λ³€μˆ˜ μ„ μ–Έλ§Œ ν•˜κ³  κ°’ 할당을 ν•˜μ§€ μ•ŠμœΌλ©΄ 값이 undefined둜 μ„€μ •λ©λ‹ˆλ‹€.



Null Type

값이 μ—†λ‹€λŠ” 것을 μ˜λ„μ μœΌλ‘œ ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • 이전에 μ°Έμ‘°λ˜μ—ˆλ˜ 값을 μ˜λ„μ μœΌλ‘œ 더이상 μ°Έμ‘°ν•˜μ§€ μ•Šκ² λ‹€λŠ” λœ»μœΌλ‘œλ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • null은 undefined와 λ‹€λ₯΄κ²Œ μ˜λ„μ μΈ λΉ„μ–΄μžˆμŒμ„ λ‚˜νƒ€λ‚΄λ―€λ‘œ, ===둜 비ꡐ해야 ν•©λ‹ˆλ‹€.



Symbol Type

ES6에 μΆ”κ°€λœ νƒ€μž…μœΌλ‘œ, μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ λ‹ˆν¬ν•œ 값을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 객체의 ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•  수 있으며, λ‹€λ₯Έ κ°’λ“€κ³Ό μΆ©λŒν•˜μ§€ μ•Šλ„λ‘ 보μž₯λ©λ‹ˆλ‹€.

  • μœ λ‹ˆν¬ν•œ 값이기 λ•Œλ¬Έμ— λ‹€λ₯Έ μ½”λ“œλ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ‚¬μš©λœ 심볼과 μ ˆλŒ€λ‘œ μ€‘λ³΅λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • 주둜 λ‚΄λΆ€ 속성에 λŒ€ν•œ κ³ μœ ν•œ ν‚€λ₯Ό μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

// 심볼을 μ‚¬μš©ν•˜μ—¬ κ³ μœ ν•œ ν‚€ λ§Œλ“€κΈ°
const uniqueKey = Symbol('description');

const obj = {
  [uniqueKey]: 'This is a unique symbol key',
};

console.log(obj[uniqueKey]); // "This is a unique symbol key"

// 심볼은 항상 κ³ μœ ν•˜λ―€λ‘œ, λ‹€λ₯Έ κ³³μ—μ„œ λ™μΌν•œ μ΄λ¦„μ˜ 심볼을 λ§Œλ“€μ–΄λ„ 값은 λ‹€λ¦…λ‹ˆλ‹€.
const anotherKey = Symbol('description');
console.log(uniqueKey === anotherKey); // false

πŸ€” 킀값에 []κ°€ λΆ™λŠ” μ΄μœ λŠ” 뭘까?

객체λ₯Ό μ •μ˜ν•˜λŠ” μ‹œμ μ— μ •ν•΄μ§€μ§€ μ•Šμ€ 속성λͺ…을 λ™μ μœΌλ‘œ μƒμ„±ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.




μ°Έμ‘° νƒ€μž…

Object, Function, Date, Array, RegExp, Map, Set λ“± μ›μ‹œ νƒ€μž…μ˜ 값을 μ œμ™Έν•œ λͺ¨λ“  것을 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

πŸ“Œ νŠΉμ§•

  • 속성듀을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (mutable value)

  • μ°Έμ‘° νƒ€μž…μ„ 전달할 λ•ŒλŠ” 값이 μ•„λ‹ˆλΌ μ£Όμ†Œκ°€ μ „λ‹¬λ©λ‹ˆλ‹€.

  • μ£Όμ†Œκ°’μ€ μŠ€νƒ λ©”λͺ¨λ¦¬μ— μ €μž₯되고, νž™ λ©”λͺ¨λ¦¬μ— μ‹€μ œ 데이터(객체)κ°€ μ €μž₯λ©λ‹ˆλ‹€.

    • μ°Έμ‘° νƒ€μž… λ°μ΄ν„°λŠ” νž™μ— μ €μž₯되며, λ™μ μœΌλ‘œ 크기가 λ³€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



데이터 처리

μ—°μ‚°μž (Operators)

μ—°μ‚°μžλŠ” ν‘œν˜„μ‹(κ°’, λ³€μˆ˜ λ“±)을 λŒ€μƒμœΌλ‘œ 연산을 μˆ˜ν–‰ν•˜μ—¬ ν•˜λ‚˜μ˜ 값을 μƒμ„±ν•˜λŠ” κΈ°ν˜Έμž…λ‹ˆλ‹€.

단항 μ—°μ‚°μž (Unary Operators)

typeof : κ°’μ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ λ°˜ν™˜ν•©λ‹ˆλ‹€.

void : ν‘œν˜„μ‹μ„ ν‰κ°€ν•˜λ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

delete : 객체의 속성을 μ‚­μ œν•©λ‹ˆλ‹€.




μ‚°μˆ  μ—°μ‚°μž (Arithmetic Operators)

단항 μ‚°μˆ  μ—°μ‚°μž

  • ++x : 값이 1 μ¦κ°€ν•œ ν›„ λ°˜ν™˜ν•©λ‹ˆλ‹€. (μ „μœ„)

  • x++ : 값을 λ°˜ν™˜ν•œ ν›„ 1 μ¦κ°€ν•©λ‹ˆλ‹€. (ν›„μœ„)

  • --x : 값이 1 κ°μ†Œν•œ ν›„ λ°˜ν™˜ν•©λ‹ˆλ‹€. (μ „μœ„)

  • x-- : 값을 λ°˜ν™˜ν•œ ν›„ 1 κ°μ†Œν•©λ‹ˆλ‹€. (ν›„μœ„)

  • +x : 값을 숫자둜 λ³€ν™˜ν•©λ‹ˆλ‹€. (λ¬Έμžμ—΄ β†’ 숫자)

  • -x : κ°’μ˜ λΆ€ν˜Έλ₯Ό λ°˜μ „ν•©λ‹ˆλ‹€.


이항 μ‚°μˆ  μ—°μ‚°μž

  • + : 두 값을 λ”ν•©λ‹ˆλ‹€.

  • - : 두 값을 λΊλ‹ˆλ‹€.

  • * : 두 값을 κ³±ν•©λ‹ˆλ‹€.

  • / : 두 값을 λ‚˜λˆ•λ‹ˆλ‹€.

  • % : λ‚˜λˆ—μ…ˆ ν›„ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.




비ꡐ μ—°μ‚°μž (Comparison Operators)

  • == : 두 값이 κ°™μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. (νƒ€μž… λ³€ν™˜ O)

  • === : 두 κ°’κ³Ό νƒ€μž…μ΄ λͺ¨λ‘ κ°™μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. (νƒ€μž… λ³€ν™˜ X)

  • != : 두 값이 λ‹€λ₯΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • !== : 두 값이 λ‹€λ₯΄κ±°λ‚˜ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • > : μ™Όμͺ½ 값이 였λ₯Έμͺ½ 값보닀 크면 trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • >= : μ™Όμͺ½ 값이 였λ₯Έμͺ½ 값보닀 ν¬κ±°λ‚˜ κ°™μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • < : μ™Όμͺ½ 값이 였λ₯Έμͺ½ 값보닀 μž‘μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • <= : μ™Όμͺ½ 값이 였λ₯Έμͺ½ 값보닀 μž‘κ±°λ‚˜ κ°™μœΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.




논리 μ—°μ‚°μž (Logical Operators)

논리 μ—°μ‚°μžλŠ” λΆˆλ¦¬μ–Έ κ°’ λ˜λŠ” νŠΉμ • 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • && : AND μ—°μ‚° (첫 번째 값이 falseλ©΄ κ·Έ 값을 λ°˜ν™˜)

  • || : OR μ—°μ‚° (첫 번째 값이 falseλ©΄ 두 번째 값을 λ°˜ν™˜)

  • ! : NOT μ—°μ‚° (λΆˆλ¦¬μ–Έ 값을 λ°˜μ „)




기타 μ—°μ‚°μž

  • , : μ‰Όν‘œ μ—°μ‚°μž, 두 ν‘œν˜„μ‹ 평가 ν›„ λ§ˆμ§€λ§‰ κ°’ λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • " "+" " : λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μž

  • ? : μ˜΅μ…”λ„ μ—°μ‚°μž (obj?.prop), 객체의 속성을 μ°Έμ‘° μ‹œμ— μœ νš¨ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • +=, -=, *=, /=, %= : ν• λ‹Ή μ—°μ‚°μž, 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžκ°€ μ™Όμͺ½ ν”Όμ—°μ‚°μžμ— 값을 ν• λ‹Ήν•©λ‹ˆλ‹€.

  • &&=, ||= : 논리 μ—°μ‚°κ³Ό 할당을 λ™μ‹œμ— μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • condition ? trueValue : falseValue : μ‚Όν•­ μ—°μ‚°μž, 쑰건 μ—°μ‚°μžμ— 따라 두 κ°’ 쀑 ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.




μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜

μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ νŠΉμ • λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” μ½”λ“œ 일뢀뢄을 μ˜λ―Έν•©λ‹ˆλ‹€.

ν•¨μˆ˜μ˜ νŠΉμ§•

  • 일급 객체둜 λ™μž‘ν•©λ‹ˆλ‹€.

    • ν•¨μˆ˜μ˜ μ‹€μ œ λ§€κ°œλ³€μˆ˜κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

    • ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

    • ν• λ‹Ήλͺ…λ Ήλ¬Έμ˜ λŒ€μƒμ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

    • λ™μΌλΉ„κ΅μ˜ λŒ€μƒμ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€. (κ°’μœΌλ‘œ ν‘œν˜„ κ°€λŠ₯)

ν•¨μˆ˜ μ‹€μŠ΅

// ν•¨μˆ˜λŠ” μ‹€μ œ λ§€κ°œλ³€μˆ˜κ°€ 될 수 μžˆλ‹€, ν•¨μˆ˜λŠ” ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 될 수 μžˆλ‹€.
function foo(arg) {
  return arg;
}

function bar() {
  console.log('bar');
}

foo(bar)(); // 'bar'


// ν•¨μˆ˜λŠ” ν• λ‹Ήλͺ…λ Ήλ¬Έμ˜ λŒ€μƒμ΄ 될 수 μžˆλ‹€.
const foo1 = function (arg) {
  return arg;
};

foo1(1); // 1을 λ°˜ν™˜


// κΈ°λ³Έκ°’ λ§€κ°œλ³€μˆ˜λ₯Ό 넣을 수 μžˆλ‹€.
function foo2(arg = 1) {
  console.log(arg);
}

foo2(); // '1'


// λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λ₯Ό 넣을 수 μžˆλ‹€.
function foo3(arg, ...rest) {
  console.log(rest);
}

foo3(1, 2, 3, 4); // [2, 3, 4]

// argument 객체
function foo4(arg) {
  console.log(arguments);
}

foo4(1, 2, 3, 4); // [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4 }

// ν•¨μˆ˜ μ„ μ–Έλ¬Έ
function foo5() {
  console.log('foo5');
}

foo5(); // 'foo5'


// ν•¨μˆ˜ ν‘œν˜„μ‹
const foo6 = function () {
  console.log('foo6');
};

foo6(); // 'foo6'


// Function μƒμ„±μž ν•¨μˆ˜
const foo7 = new Function("console.log('foo7')");

foo7(); // 'foo7'


// ν™”μ‚΄ν‘œ ν•¨μˆ˜ ν‘œν˜„μ‹
const foo8 = () => {
  console.log('foo8');
};

foo8(); // 'foo8'


// IIFE (μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜)
(function foo9() {
  console.log('foo9');
})();


// μž¬κ·€ ν•¨μˆ˜
function foo10(arg) {
  if (arg === 3) return;
  console.log('foo10>>>>' + arg);

  foo10(arg + 1);
}

foo10(1);


// 쀑첩 ν•¨μˆ˜
function foo11(arg) {
  function bar() {
    console.log(arg);
  }
  bar();
}

foo11('foo11');


// 콜백 ν•¨μˆ˜
function foo12(arg) {
  arg();
}

foo12(() => {
  console.log('foo12');
});



✏️ ν•œ 쀄 회고

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ‹€μ–‘ν•œ νŠΉμ§•μ„ μ •λ¦¬ν•˜λ©΄μ„œ κ·Έλƒ₯ λ„˜κ²Όλ˜ κ°œλ…λ“€λ„ μ •ν™•νžˆ μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

profile
🌱개발 기둝μž₯

0개의 λŒ“κΈ€