Javascript Essentials π₯
μλ°μ€ν¬λ¦½νΈμ κΈ°μ΄μ μΈ λ¬Έλ²κ³Ό κ°λ μ μ΄ν΄λ΄ λλ€.
'use strict'β
ES5(2009)μμ μκ°λ κΈ°λ₯μΌλ‘, λ¨μ΄ κ·Έλλ‘ JSμμ μ격 λͺ¨λλ₯Ό νμ±νμν΅λλ€. λ°λμ μμ€ μ΅μλ¨μ μμΉν΄μΌνλ©°, νμ±νλ μ격λͺ¨λλ λΉνμ±ν ν μ μμ΅λλ€.
μλ μμ λ₯Ό μ΄ν΄λ΄ μλ€.
"use strict";
function strictModeExample() {
a = 123; // μ격λͺ¨λμμλ μ μ μ€μ½ν λ³μ μ μΈ λΆκ°λ₯
}
strictModeExample(); // ReferenceError: a is not defined
function nonStrictModeExample() {
a = 123;
}
nonStrictModeExample(); // OK
console.log(a); // 123
μ΄μ²λΌ μ μ μ€μ½ν λ³μ μ μΈμ΄ λΆκ°λ₯νλλ‘ λ§μ΅λλ€.
μ격λͺ¨λμ κΈ°λν¨κ³Όλ λ€μκ³Ό κ°μ΅λλ€:
- μ€λ₯ κ°μ§ ν₯μ: μΌλ°μ μΌλ‘ 무μλλ μλ¬λ€μ μ€μ μ€λ₯λ‘ μ²λ¦¬
- μμ ν μ½λ©: μ€μλ‘ μ μ λ³μλ₯Ό μμ±νλ κ²μ λ°©μ§
- μ±λ₯ μ΅μ ν: μμ§μ΄ μ½λ μ΅μ νλ₯Ό λ ν¨κ³Όμ μΌλ‘ μν
- ν₯ν λ²μ μ JSμμ νΈνμ±: ν₯ν λ²μ μμ κΈμ§λ κΈ°λ₯λ€μ 미리 κΈμ§
μ€μ½νμ λ³μ μ μΈβ
μ€μ½ν(Scope)β
- μ μ μ€μ½ν (Global Scope):
- μ 체 μ€ν¬λ¦½νΈ μ΄λμλ μ κ·Ό κ°λ₯ν©λλ€.
- μ§μ μ€μ½ν (Local Scope):
- νΉμ μμ λ΄μμλ§ μ κ·Ό κ°λ₯ν©λλ€.
- μ§μ μ€μ½νλ 2κ°μ§λ‘ λλ©λλ€.
- ν¨μ μ€μ½ν (Function Scope): ν¨μ λ΄μμ μ μΈλ λ³μλ€μ ν¨μ λ΄λΆμμλ§ μ κ·Ό κ°λ₯ν©λλ€.
var
λ‘ μ μΈλ λ³μκ° μ¬κΈ°μ ν΄λΉν©λλ€. - λΈλ‘ μ€μ½ν (Block Scope):
{}
λ‘ λλ¬μΈμΈ λΈλ‘ λ΄μμ μ μΈλ λ³μλ€μ ν΄λΉ λΈλ‘ λ΄μμλ§ μ κ·Ό κ°λ₯ν©λλ€.let
κ³Όconst
λ‘ μ μΈλ λ³μκ° μ¬κΈ°μ ν΄λΉν©λλ€.
- ν¨μ μ€μ½ν (Function Scope): ν¨μ λ΄μμ μ μΈλ λ³μλ€μ ν¨μ λ΄λΆμμλ§ μ κ·Ό κ°λ₯ν©λλ€.
ν¨μ μ€μ½νμ λΈλ‘ μ€μ½νλ₯Ό λͺ νν μ΄ν΄νκΈ° μν μμ μ½λμ λλ€.
function functionScopeExample() {
if (true) {
var functionScopedVar = "hello";
}
console.log(functionScopedVar); // "hello"
}
functionScopeExample();
console.log(typeof functionScopedVar); // 'undefined' (ν¨μ μΈλΆμμλ μ κ·Όν μ μμ)
function blockScopeExample() {
if (true) {
let blockScopedLet = "μ λ λΈλ‘ μ€μ½νμ
λλ€";
const blockScopedConst = "μ λ λΈλ‘ μ€μ½νμ
λλ€";
console.log(blockScopedLet); // "μ λ λΈλ‘ μ€μ½νμ
λλ€"
console.log(blockScopedConst); // "μ λ λΈλ‘ μ€μ½νμ
λλ€"
}
// console.log(blockScopedLet); // μλ¬: blockScopedLetμ λΈλ‘ λ΄μμλ§ μ κ·Ό κ°λ₯
// console.log(blockScopedConst); // μλ¬: blockScopedConstλ λΈλ‘ λ΄μμλ§ μ κ·Ό κ°λ₯
}
blockScopeExample();
var
λ₯Ό μ¬μ©ν κ²½μ°μλ λΈλ‘ μ€μ½νκ° μλ ν¨μ μ€μ½νμ΄κΈ° λλ¬Έμ ifλ¬Έ(λΈλ‘ μ€μ½ν) λ°μμλ μ κ·Όμ΄ κ°λ₯ν©λλ€.
ν€μλ μμ΄ μ μΈ λ° μ΄κΈ°νβ
- μ μ λ 벨 μ€μ½ν(Global-level scope)
- νΈμ΄μ€ν λμ§ μμ
- μ격λͺ¨λμμ μ¬μ©λΆκ°
- μ¬μ μΈ λ° μ¬ν λΉ κ°λ₯
μλ μ½λλ₯Ό μ΄ν΄λ΄ μλ€.
// console.log(foo); // ReferenceError: foo is not defined
(function () {
foo = 1;
})();
console.log(foo); // 1
νΈμ΄μ€ν
λμ§ μμ ν¨μ μ€ν μ μλ foo
μ μ κ·Όν μ μμ§λ§, μ€νλ μ΄νμλ μ μ μ€μ½νμ λ³μκ° μ μΈλμ΄ μ κ·Όμ΄ κ°λ₯ν©λλ€.
varβ
- ν¨μ λ 벨 μ€μ½ν(Function-level scope):
var
λ ν¨μ λ΄μμ μ μΈλλ©΄ ν¨μ μ 체μμ, ν¨μ μΈλΆμμ μ μΈλλ©΄ μ μ μ€μ½νμμ μ ν¨ν©λλ€. - νΈμ΄μ€ν : μ μΈλ μμΉμ μκ΄μμ΄ ν¨μμ μ΅μλ¨μΌλ‘ νΈμ΄μ€ν λ©λλ€. λ¨, λ³μ μ΄κΈ°ν κ°μ νΈμ΄μ€ν λμ§ μμ΅λλ€.
- μ¬μ μΈ κ°λ₯: κ°μ μ€μ½ν λ΄μμ λ³μλ₯Ό μ€λ³΅νμ¬ μ μΈν μ μμ΅λλ€.
function varExample() {
console.log(x); // undefined (νΈμ΄μ€ν
μΌλ‘ μΈν΄)
var x = 5;
console.log(x); // 5
}
varExample();
console.log(y); // undefined (νΈμ΄μ€ν
μΌλ‘ μΈν΄)
if (true) {
var y = 10;
}
console.log(y); // 10 (ν¨μ μΈλΆμ΄λ―λ‘ μ μ μ€μ½ν)
letβ
- λΈλ‘ λ 벨 μ€μ½ν(Block-level scope)
- νΈμ΄μ€ν
:
let
λ νΈμ΄μ€ν λμ§λ§, μ μΈλ λΌμΈ μ΄μ μμ μ κ·Όνλ € νλ©΄ μ°Έμ‘° μλ¬(Reference Error)κ° λ°μν©λλ€. μ΄λ₯Ό "μΌμμ μ¬κ°μ§λ(Temporal Dead Zone, TDZ)"λΌκ³ ν©λλ€. - μ¬μ μΈ λΆκ°λ₯: κ°μ μ€μ½ν λ΄μμλ μ¬μ μΈν μ μμ΅λλ€.
- μ¬ν λΉ κ°λ₯: μ¬ν λΉμ κ°λ₯ν©λλ€.
function letExample() {
// console.log(a); // μ°Έμ‘° μλ¬: aκ° μ΄κΈ°νλμ§ μμ (TDZ)
let a = 3;
console.log(a); // 3
// let a = 4; // μλ¬: 'a'κ° μ΄λ―Έ μ μΈλ¨
a = 5; // μ¬ν λΉ κ°λ₯
console.log(a); // 5
}
letExample();
if (true) {
let b = 20;
}
// console.log(b); // μλ¬: bλ λΈλ‘ μ€μ½ν λ΄μμλ§ μ ν¨
constβ
- λΈλ‘ λ 벨 μ€μ½ν:
const
λlet
μ²λΌ λΈλ‘ λ 벨 μ€μ½νλ₯Ό κ°μ΅λλ€. - κ° λ³κ²½(μ¬ν λΉ) λΆκ°: μ μΈκ³Ό λμμ μ΄κΈ°νν΄μΌ νλ©°, ν λ² ν λΉλ κ°μ λ³κ²½ν μ μμ΅λλ€.
- μ¬μ μΈ λΆκ°λ₯:
let
κ³Ό λ§μ°¬κ°μ§λ‘ κ°μ μ€μ½ν λ΄μμ μ¬μ μΈν μ μμ΅λλ€.
varλ μ μ°μ§ μμκΉ?β
var
λ μμμ μ΄ν΄λ³Έλλ‘ νλμ μΈ μ½λ© μ€νμΌμ λ§μ§ μλ νΉμ§μ κ°μ§κ³ μμ΅λλ€.
λ°λΌμ let
, const
λ₯Ό μ¬μ©νλ κ²μ΄ μ’κ² μ΅λλ€.
μ΄μ λ μλμ κ°μ΅λλ€:
- λΈλ‘ λ 벨 μ€μ½ν(Block-level Scope): μ΄λ μ½λ λΈλ‘ λ°μμλ λ³μμ μ κ·Όν μ μκ² νμ¬ μλμΉ μμ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€.
- νΈμ΄μ€ν λ°©μ§: μ μΈ μ μ μ κ·Όνλ©΄, undefinedλ₯Ό λ°νν©λλ€. μ΄λ λλ²κΉ μ μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€.
- μ¬μ μΈ λ°©μ§: κ°μ μ€μ½ν λ΄μμ μ¬μ μΈμ΄ κ°λ₯νμ¬ νΌλμ μ΄λν μ μμ΅λλ€.
- μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ± ν₯μ: letκ³Ό constμ μ¬μ©μ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ ν₯μμν΅λλ€. λ³μμ μ€μ½νκ° λͺ ννκ³ , μ¬μ μΈ λ° λ³κ²½μ΄ μ νλ¨μΌλ‘μ¨ μ½λμ μμΈ‘ κ°λ₯μ±μ΄ λμμ§λλ€.
νΈμ΄μ€ν κ³Ό TDZβ
JSμμλ νΈμ΄μ€ν (hoisting)μ΄λΌλ λ©μ»€λμ¦μ΄ μλνλλ°, μ΄λ λ³μμ ν¨μ μ μΈμ΄ κ·Έλ€μ΄ ν¬ν¨λ λ²μμ μ΅μλ¨μΌλ‘ λμ΄μ¬λ €μ§ κ²μ²λΌ μλνλ€λ κ²μ μλ―Έν©λλ€. λ¨, μ΄ κ³Όμ μμ λ³μμ μ΄κΈ°νλ νΈμ΄μ€ν λμ§ μμ΅λλ€.
μλ μμ μ½λλ₯Ό μ΄ν΄λ΄ μλ€:
(function () {
console.log(num); // μ¬κΈ°μ `num`μ νΈμΆ
var num = 1; // `num` λ³μ μ μΈκ³Ό μ΄κΈ°ν
})();
νΈμ΄μ€ν μ κ΄μ μμ μ΄ μ½λλ λ€μκ³Ό κ°μ΄ ν΄μλ©λλ€:
var num
μ μΈμ΄ ν¨μ λ²μμ μ΅μλ¨μΌλ‘ νΈμ΄μ€ν λ©λλ€.console.log(num)
μ΄ μ€νλ λ,num
μ μ΄λ―Έ μ μΈλμμ§λ§ μμ§ κ°μ΄ ν λΉλμ§ μμμ΅λλ€.- λ°λΌμ
num
μundefined
μνμ λλ€. - μ΄ν
num = 1
μ΄ μ€νλλ©΄μnum
μ1
μ΄ ν λΉλ©λλ€.
μλ£ν(Data type)β
ν¬κ² 2κ°μ§ μλ£νμΌλ‘ λλ©λλ€
- μμ νμ (Primitive Types)
- κ°μ²΄(Object)
μμ νμ (Primitive Types)β
- Number:
123
,0.45
- String: μ:
'hello'
,"world"
- Boolean:
true
,false
- Undefined:
let a;
- Null:
typeof null
μobject
μ§λ§, μ΄λ JS μ΄κΈ°μ€κ³μ μλ λ²κ·Έμ λλ€. μ:let a = null;
- Symbol: ES6μμ μΆκ°λ νμ μΌλ‘, κ³ μ νκ³ λ³κ²½ λΆκ°λ₯ν λ°μ΄ν° νμ μ λλ€. μ£Όλ‘ κ°μ²΄ μμ±μ ν€λ‘ μ¬μ©λ©λλ€.
- BigInt: λ§€μ° ν° μ μλ₯Ό λνλΌ λ μ¬μ©λλ νμ
μ
λλ€. μ«μ λ€μ
n
μ λΆμ¬ μ¬μ©ν©λλ€. μ:12345678901234567890n
κ°μ²΄(Object)β
- Object: λ°μ΄ν°μ κ·Έ λ°μ΄ν°μ κ΄λ ¨λ λμμ κ·Έλ£Ήννλ 컨ν
μ΄λμ
λλ€. κ°μ²΄λ ν€μ κ°μ μμΌλ‘ ꡬμ±λ©λλ€. μ:
{ name: "Alice", age: 30 }
- νΉλ³ν ννμ κ°μ²΄λ€λ μ‘΄μ¬ν©λλ€. μλ₯Ό λ€μ΄ λ°°μ΄(Array), ν¨μ(Function), λ μ§(Date), μ κ·ννμ(RegExp) λ±μ΄ μμ΅λλ€.
typeof null === typeof object?
β
10μΌλ§μ λ§λ€μ΄μ§ JSμ μ΄κΈ°κ΅¬ν λ²κ·Έμ
λλ€.
32λΉνΈ μ€ μ²« 3λΉνΈλ κ°μ νμ
μ κ²°μ νλ λ° μ¬μ©λμμ΅λλ€.
μ΄ μμ€ν
μμ null
μ λͺ¨λ λΉνΈκ° 0
μΌλ‘ μ€μ λ μ μΌν κ°μ΄μκ³ , κ°μ²΄λ νμ
λΉνΈλ 000
μ΄μμ΅λλ€.
μ΄ λ²κ·Έκ° μμ λ λ μκΈ°λ μν₯μ μμΈ‘ν μ μμ΄, μ§κΈκΉμ§ μμ λμ§ μκ³ μμ΅λλ€.
| μ°Έκ³ : λ§ν¬
undefined vs nullβ
typeof null; // "object" (not "null" for legacy reasons)
typeof undefined; // "undefined"
null === undefined; // false
null == undefined; // true
null === null; // true
null == null; // true
!null; // true
Number.isNaN(1 + null); // false
Number.isNaN(1 + undefined); // true
typeof function(){} === 'function'
β
function
μ μλ°νλ κ°μ²΄μ
λλ€. νμ§λ§ typeof
μ°μ°μλ function
μ function
μΌλ‘ λ°νν©λλ€.
ν¨μμ μ λ¬λ μΈμκ° νΉμ ν¨μμΈμ§ νμΈν λ μ¬μ©λ©λλ€. APIλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λ€ λ μ¬μ©μκ° μ 곡ν μ½λ°± ν¨μκ° μ€μ λ‘ ν¨μ νμ
μΈμ§ κ²μ¦νλ λ° μ μ©ν©λλ€.