[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 21μž₯. 빌트인 객체

λ…Έμ˜μ™„Β·2023λ…„ 11μ›” 21일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
17/23
post-thumbnail
post-custom-banner

빌트인 객체

1. μžλ°”μŠ€ν¬λ¦½νŠΈ 객체의 λΆ„λ₯˜

μžλ°”μŠ€ν¬λ¦½νŠΈ κ°μ²΄λŠ” 크게 3개의 객체둜 λΆ„λ₯˜ κ°€λŠ₯.

βœ” ν‘œμ€€ 빌트인 객체

ν‘œμ€€ 빌트인 κ°μ²΄λŠ” ECMAScript 사양에 μ •μ˜λœ 객체λ₯Ό λ§ν•˜λ©°, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ˜ 곡톡 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

ν‘œμ€€ 빌트인 κ°μ²΄λŠ” ECMAScript 사양에 μ •μ˜λœ κ°μ²΄μ΄λ―€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ν™˜κ²½(λΈŒλΌμš°μ € λ˜λŠ” Node.js ν™˜κ²½)κ³Ό 관계없이 μ–Έμ œλ‚˜ μ‚¬μš©ν•  수 있음.

ν‘œμ€€ 빌트인 κ°μ²΄λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œμ„œ μ œκ³΅λœλ‹€. λ”°λΌμ„œ λ³„λ„μ˜ 선없이 μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ–Έμ œλ‚˜ μ°Έμ‘° κ°€λŠ₯.

βœ” 호슀트 객체

호슀트 κ°μ²΄λŠ” ECMAScript 사양에 μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ν•œ ν™˜κ²½(λΈŒλΌμš°μ € ν™˜κ²½ λ˜λŠ” Node.js ν™˜κ²½)μ—μ„œ μΆ”κ°€λ‘œ μ œκ³΅ν•˜λŠ” 객체λ₯Ό λ§ν•œλ‹€.

λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” DOM, BOM, Canvas, XMLHttpRequest, fetch, requestAnimationFrame, SVG, Web Storage, Web Component, Web Worker와 같은 ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ Web APIλ₯Ό 호슀트 객체둜 μ œκ³΅ν•˜κ³ ,
Node.jsν™˜κ²½μ—μ„œλŠ” Node.js 고유의 APIλ₯Ό 호슀트 객체둜 μ œκ³΅ν•œλ‹€.

βœ” μ‚¬μš©μž μ •μ˜ 객체

μ‚¬μš©μž μ •μ˜ κ°μ²΄λŠ” ν‘œμ€€ 빌트인 객체와 호슀트 객체처럼 κΈ°λ³Έ μ œκ³΅λ˜λŠ” 객체가 μ•„λ‹Œ μ‚¬μš©μžκ°€ 직접 μ •μ˜ν•œ 객체λ₯Ό λ§ν•œλ‹€.

2. ν‘œμ€€ 빌트인 객체

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” Object String Number Boolean Symbol Date Math RegExp Array Map/Set WeakMap WeakSet Function Promise Reflect, Proxy JSON Errorλ“± 40μ—¬ 개의 ν‘œμ€€ 빌트인 객체λ₯Ό μ œκ³΅ν•œλ‹€.

Math Reflect Json을 μ œμ™Έν•œ ν‘œμ€€ 빌트인 κ°μ²΄λŠ” λͺ¨λ‘ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλŠ” 객체닀.

μƒμ„±μž ν•¨μˆ˜μΈ ν‘œμ€€ 빌트인 객체가 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž…μ€ ν‘œμ€€ 빌트인 객체의 prototype ν”„λ‘œνΌν‹°μ— λ°”μΈλ”©λœ 객체닀. 예λ₯Ό λ“€μ–΄, ν‘œμ€€ 빌트인 객체인 String을 μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•˜μ—¬ μƒμ„±ν•œ String μΈμŠ€ν„΄μŠ€μ˜ ν”„λ‘œν† νƒ€μž…μ€ String.prototype이닀.

// String μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ String 객체 생성.
const strObj = new String('Noh'); // String {"Noh"}

// String μƒμ„±μž ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±ν•œ strObj 객체의 ν”„λ‘œν† νƒ€μž…μ€ String.prototype이닀.
console.log(Object.getPrototypeOf(strObj) === String.prototype); // true

ν‘œμ€€ 빌트인 객체인 Number μΈμŠ€ν„΄μŠ€λŠ” prototype ν”„λ‘œνΌν‹°μ— λ°”μΈλ”©λœ 객체에 λ‹€μ–‘ν•œ κΈ°λŠ₯의 빌트인 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

ν‘œμ€€ 빌트인 객체인 NumberλŠ” μΈμŠ€ν„΄μŠ€ 없이 μ •μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” 정적 λ©”μ„œλ“œ 제곡

// Number μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ Number 객체 생성
const numObj = new Number(1.5); // Number {1.5}

// toFixedλŠ” Number.prototype의 ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œλ‹€.
// Number.prototype.toFixedλŠ” μ†Œμˆ˜μ  자리λ₯Ό λ°˜μ˜¬λ¦Όν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
console.log(numObj.toFixed()); // 2

// isIntegerλŠ” Number의 정적 λ©”μ„œλ“œλ‹€.
// Number.isIntegerλŠ” μΈμˆ˜κ°€ μ •μˆ˜(integer)인지 κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό Boolean으둜 λ°˜ν™˜ν•œλ‹€.
console.log(Number.isInteger(0.5)); // false

3. μ›μ‹œκ°’κ³Ό 래퍼 객체

λ¬Έμžμ—΄ 숫자 λΆˆλ¦¬μ–Έλ“±μ˜ μ›μ‹œκ°’ μžˆλŠ”λ°λ„ λ¬Έμžμ—΄ 숫자 λΆˆλ¦¬μ–Έ 객체λ₯Ό μƒμ„±ν•˜λŠ” String Number Booleanλ“±μ˜ ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ κ°€ λ¬΄μ—‡μΌκΉŒ?

const str = 'hello';

// μ›μ‹œ νƒ€μž…μΈ λ¬Έμžμ—΄μ΄ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κ°–κ³  μžˆλŠ” 객체처럼 λ™μž‘.
console.log(str.length); // 5
console.log(str.toUpperCase()); // HELLO

μ›μ‹œκ°’μΈ λ¬Έμžμ—΄ 숫자 λΆˆλ¦¬μ–Έ κ°’μ˜ 경우 이듀 μ›μ‹œκ°’μ— λŒ€ν•΄ 마치 객체처럼 λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•(λ˜λŠ” λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•)으둜 μ ‘κ·Όν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μΌμ‹œμ μœΌλ‘œ μ›μ‹œκ°’μ„ μ—°κ΄€λœ 객체둜 λ³€ν™”ν•΄ μ£ΌκΈ° λ•Œλ¬Έ.

λ‹€μ‹œλ§ν•΄, μ›μ‹œκ°’μ„ 객체처럼 μ‚¬μš©ν•˜λ©΄ μžλ°”μŠ€ν¬λ¦¬λΈŒ 엔진은 μ•”λ¬΅μ μœΌλ‘œ μ—°κ΄€λœ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μƒμ„±λœ 객체둜 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κ±°λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  λ‹€μ‹œ μ›μ‹œκ°’μœΌλ‘œ λ˜λŒλ¦°λ‹€.

이처럼 λ¬Έμžμ—΄ 숫자 λΆˆλ¦¬μ–Έ 값에 λŒ€ν•΄ 객체처럼 μ ‘κ·Όν•˜λ©΄ μƒμ„±λ˜λŠ” μž„μ‹œ 객체λ₯Ό 래퍼 객체라 ν•œλ‹€.

const str = 'hi';

// μ›μ‹œ νƒ€μž…μΈ λ¬Έμžμ—΄μ΄ 래퍼 객체인 String μΈμŠ€ν„΄μŠ€λ‘œ λ³€ν™˜λœλ‹€.
console.log(str.length) // 2
console.log(str.toUpperCase); //  HI

// 래퍼 객체둜 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜κ±°λ‚˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„ , λ‹€μ‹œ μ›μ‹œκ°’μœΌλ‘œ λ˜λ λ¦°λ‹€.
console.log(typeof str); // string

객체에 ν”„λ‘œνΌν‹° λ©”μ„œλ“œμ— μ ‘κ·Όν•˜λ©΄ 래퍼 객체인 String μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ μƒμ„±λ˜κ³  λ¬Έμžμ—΄μ€ 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœλ‹€.

λ¬Έμžμ—΄ 래퍼 객체인 String μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ String.prototype의 λ©”μ„œλ“œλ₯Ό 상속받아 μ‚¬μš©ν•  수 있음.

κ·Έ ν›„ 래퍼 객체의 처리 μ’…λ£Œλ˜λ©΄ 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μœΌλ‘œ λ‹€μ‹œ λ˜λŒμ•„μ˜¨λ‹€. 즉, 래퍼 κ°μ²΄λŠ” 가비지 μ»¬λ ‰μ…˜μ΄ λœλ‹€.

const bool = true;

console.log(bool.toValueof)
console.log(bool.toString())

console.log(typeof bool, bool)
const num = 2

console.log(num.toFixed()); // 2

console.log(typeof num, num)

숫자 λΆˆλ¦¬μ–Έ μ›μ‹œ νƒ€μž… λ˜ν•œ, μ•žμ„  λ¬Έμžμ—΄νƒ€μž…κ³Ό 같은 λ°©μ‹μœΌλ‘œ 래퍼 객체 μƒμ„±ν•˜κ³  각각 래퍼객체의 [[NumberData]] [[BooleanData]]에 ν• λ‹Ή, 처리 μ’…λ£Œλ˜λ©΄ μ›μ‹œ κ°’μœΌλ‘œ λ˜λŒμ•„ μ˜¨λ‹€. 즉, 래퍼 κ°μ²΄λŠ” 가비지 μ»¬λ ‰μ…˜μ΄ λœλ‹€.

4. μ „μ—­ 객체

μ „μ—­ κ°μ²΄λŠ” μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전 단계에 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ–΄λ–€ 객체보닀도 λ¨Όμ € μƒμ„±λ˜λŠ” νŠΉμˆ˜ν•œ 객체이며, μ–΄λ–€ 객체에도 μ†ν•˜μ§€ μ•Šμ€ μ΅œμƒμœ„ 객체

μ „μ—­ κ°μ²΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ— 따라 μ§€μΉ­ν•˜λŠ” 이름이 제각각 λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλŠ” window(λ˜λŠ” self this frames) Node.js ν™˜κ²½μ—μ„œλŠ” global이 μ „μ—­ 객체λ₯Ό 가리킨닀.

μ „μ—­ κ°μ²΄λŠ” ν‘œμ€€ 빌트인 객체 호슀트 객체(ν΄λΌμ΄μ–ΈνŠΈ Web API λ˜λŠ” Node.js의 호슀트 API), 그리고 var둜 μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜λ₯Ό ν”„λ‘œνΌν‹°λ‘œ κ°–λŠ”λ‹€.

μ „μ—­ κ°μ²΄λŠ” 계측적 ꡬ쑰상 μ–΄λ–€ 객체에도 μ†ν•˜μ§€ μ•Šμ€ λͺ¨λ“  빌트인 객체(ν‘œμ€€ 빌트인 객체와 호슀트 객체)의 μ΅œμƒμœ„ 객체닀. μ „μ—­ 객체가 μ΅œμƒμœ„ κ°μ²΄λΌλŠ” 것은 ν”„λ‘œν† νƒ€μž… 상속 κ΄€κ³„μƒμ—μ„œ μ΅œμƒμœ„ κ°μ²΄λΌλŠ” μ˜λ―Έκ°€ μ•„λ‹ˆλ‹€. μ „μ—­ 객체 μžμ‚°μ€ μ–΄λ–€ 객체의 ν”„λ‘œνΌν‹°λ„ μ•„λ‹ˆλ©° 객체의 계측적 ꡬ쑰상 ν‘œμ€€ 빌트인 객체와 호슀트 객체λ₯Ό ν”„λ‘œνΌν‹°λ‘œ μ†Œμœ ν•œλ‹€λŠ” 것을 λ§ν•œλ‹€.

❗ μ „μ—­κ°μ²΄μ˜ νŠΉμ§• 정리

βœ” μ „μ—­ κ°μ²΄λŠ” κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ 생성할 수 μ—†λ‹€. 즉, μ „μ—­ 객체λ₯Ό 생성할 수 μžˆλŠ” μƒμ„±μž ν•¨μˆ˜κ°€ μ œκ³΅λ˜μ§€ μ•ŠλŠ”λ‹€.

βœ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ window(λ˜λŠ” global)λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.

// λ¬Έμžμ—΄ 'F'λ₯Ό 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ 10μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ λ³€ν™˜ν•œλ‹€.
window.paresInt('F', 16); // 15
// window.parseIntλŠ” parseInt둜 ν˜ΈμΆœν•  수 μžˆλ‹€.
parseInt('F', 16); // 15

window.parseInt === parseInt; // true

βœ” μ „μ—­ κ°μ²΄λŠ” Object String Number Function 같은 λͺ¨λ“  ν‘œμ€€ 빌트인 객체λ₯Ό ν”„λ‘œνΌν‹°λ‘œ 가지고 μžˆλ‹€.

βœ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ ν™˜κ²½(λΈŒλΌμš°μ € ν™˜κ²½ λ˜λŠ” Node.js ν™˜κ²½)에 따라 μΆ”κ°€μ μœΌλ‘œ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.

βœ” var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œ 암묡적 μ „μ—­, 그리고 μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.

// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜
var foo = 1;
console.log(window.foo); // 1

// μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 암묡적 μ „μ—­. barλŠ” μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‹€.
bar = 2;  // window.bar = 2
console.log(window.bar); // 2

// μ „μ—­ ν•¨μˆ˜
function baz() { return 3;}
console.log(window.baz()); // 3

βœ” letμ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.

letμ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” 보이지 μ•ŠλŠ” κ°œλ…μ μΈ 블둝(μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 선언적 ν™˜κ²½ λ ˆμ½”λ“œ)내에 μ‘΄μž¬ν•˜κ²Œ λœλ‹€.

βœ” λΈŒλΌμš°μ € ν™˜κ²½μ˜ λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” ν•˜λ‚˜μ˜ μ „μ—­ 객체 windowλ₯Ό κ³΅μœ ν•œλ‹€.

πŸ’‘ globalThis

ES11 μ—μ„œ λ„μž…λœ globalThisλŠ” λΈŒλΌμš°μ € ν™˜κ²½κ³Ό Node.js ν™˜κ²½μ—μ„œ μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚¨λ˜ λ‹€μ–‘ν•œ μ‹λ³„μžλ₯Ό ν†΅μΌν•œ μ‹λ³„μžλ‹€. globalThisλŠ” ν‘œμ€€ μ‚¬μ–‘μ΄λ―€λ‘œ ECMAScript ν‘œμ€€ 사양을 μ€€μˆ˜ν•˜λŠ” λͺ¨λ“  ν™˜κ²½μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

// λΈŒλΌμš°μ € ν™˜κ²½
globalThis === this // true
globalThis === window // true
globalThis === self // true
globalThis === frames // true

// Node.js ν™˜κ²½(12.0.0 이상)
globalThis === this // true
globalThis === global // true

4-1. 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°

빌트인 μ „μ—­ ν”„λ‘œνΌν‹°λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό 의미.

βœ” Infinity

Infinity ν”„λ‘œνΌν‹°λŠ” λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’ Infinityλ₯Ό κ°–λŠ”λ‹€.

// μ „μ—­ ν”„λ‘œνΌν‹°λŠ” windowλ₯Ό μƒλž΅ν•˜κ³  μ°Έμ‘°ν•  수 μžˆλ‹€.
console.log(window.Infinity === Infinity); // true

// μ–‘μ˜ λ¬΄ν•œλŒ€
console.log(3/0);  // Infinity
// 음의 λ¬΄ν•œλŒ€
console.log(-3/0); // -Infinity
// InfinityλŠ” μˆ«μžκ°’μ΄λ‹€.
console.log(typeof Infinity); // number

βœ” NaN

NaN ν”„λ‘œνΌν‹°λŠ” μˆ«μžκ°€ μ•„λ‹˜(Not-a-Number)을 λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’ NaN을 κ°–λŠ”λ‹€. NaNν”„λ‘œνΌν‹°λŠ” Number NaN ν”„λ‘œνΌν‹°μ™€ κ°™λ‹€.

console.log(window.NaN); // NaN

console.log(Number('xyz')); // NaN
console.log(1 * 'string');  // NaN
console.log(typeof NaN);    // number

βœ” undefined

undefinedν”„λ‘œνΌν‹°λŠ” μ›μ‹œ νƒ€μž… undefinedλ₯Ό κ°’μœΌλ‘œ κ°–λŠ”λ‹€.

console.log(window.undefined); // undefined

var foo;
console.log(foo); // undefined
console.log(typeof undefined); // undefined

4-2. 빌트인 μ „μ—­ ν•¨μˆ˜

빌트인 μ „μ—­ ν•¨μˆ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ ν˜ΈμΆœν•  수 μžˆλŠ” 빌트인 ν•¨μˆ˜λ‘œμ„œ μ „μ—­ 객체의 λ©”μ„œλ“œ

βœ” eval

evalν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ 인수둜 전달받아, 전달받은 λ¬Έμžμ—΄ μ½”λ“œκ°€ ν‘œν˜„μ‹ 이라면 evalν•¨μˆ˜λŠ” λ¬Έμžμ—΄ μ½”λ“œλ₯Ό λŸ°νƒ€μž„μ— ν‰κ°€ν•˜μ—¬ 값을 μƒμ„±ν•˜κ³ ,
전달받은 μΈμˆ˜κ°€ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이라면 evalν•¨μˆ˜λŠ” λ¬Έμžμ—΄ μ½”λ“œλ₯Ό λŸ°νƒ€μž„μ— μ‹€ν–‰ν•œλ‹€.

/// ν‘œν˜„μ‹μΈ λ¬Έ
eval('1 + 2;'); // -> 3

// ν‘œν˜„μ‹μ΄ μ•„λ‹Œ λ¬Έ
eval('var x = 5;'); // -> undefined

// eval ν•¨μˆ˜μ— μ˜ν•΄ λŸ°νƒ€μž„μ— λ³€μˆ˜ 선언문이 μ‹€ν–‰λ˜μ–΄ x λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλ‹€.
console.log(x); // 5

// 객체 λ¦¬ν„°λŸ΄μ€ λ°˜λ“œμ‹œ κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Όλ‹€.
const o = eval('({ a: 1 })');
console.log(o); // {a: 1}

// ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ λ°˜λ“œμ‹œ κ΄„ν˜Έλ‘œ λ‘˜λŸ¬μ‹Όλ‹€.
const f = eval('(function() { return 1; })');
console.log(f()); // 1

μ—¬λŸ¬κ°œμ˜ 문으둜 이루어져 μžˆλ‹€λ©΄ λͺ¨λ“  문을 μ‹€ν–‰ν•œ λ‹€μŒ, λ§ˆμ§€λ§‰ 결과값을 λ°˜ν™˜ν•œλ‹€.

eval('1 + 2; 3 + 4'); // 7

evalν•¨μˆ˜λŠ” μžμ‹ μ΄ 호좜된 μœ„μΉ˜μ— ν•΄λ‹Ήν•˜λŠ” 기쑴의 μŠ€μ½”ν”„λ₯Ό λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ μˆ˜μ •ν•œλ‹€.

const x = 1;

function foo() {
  // eval ν•¨μˆ˜λŠ” λŸ°νƒ€μž„μ— foo ν•¨μˆ˜μ˜ μŠ€μ½”ν”„λ₯Ό λ™μ μœΌλ‘œ μˆ˜μ •ν•œλ‹€.
  eval('var x = 2;');
  console.log(x); // 2
}

foo();
console.log(x); // 1

strict modeμ—μ„œλŠ” evalν•¨μˆ˜λŠ” 기쑴의 μŠ€μ½”ν”„λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  evalν•¨μˆ˜ μžμ‹ μ˜ 자체적인 μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€.

const x = 1;

function foo() {
  'use strict';

  // strict modeμ—μ„œ eval ν•¨μˆ˜λŠ” 기쑴의 μŠ€μ½”ν”„λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  eval ν•¨μˆ˜ μžμ‹ μ˜ 자체적인 μŠ€μ½”ν”„λ₯Ό μƒμ„±ν•œλ‹€.
  eval('var x = 2; console.log(x);'); // 2
  console.log(x); // 1
}

foo();
console.log(x); // 1

인수둜 전달받은 λ¬Έμžμ—΄ μ½”λ“œκ°€ let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš”ν•œ λ³€μˆ˜ 선언문이라면 μ•”λ¬΅μ μœΌλ‘œ strict modeκ°€ μ μš©λœλ‹€.

const x = 1;

function foo() {
  eval(`var x = 2; console.log(x);`) // 2
  // let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ μ„ μš΄λ¬Έμ€ strict modeκ°€ μ μš©λœλ‹€.
  eval(`const x = 3; console.log(x);`) // 3
  console.log(x); // 2
}

foo()'
conosole.log(x); // 1

eval ν•¨μˆ˜λŠ” λ³΄μ•ˆμ— 맀우 μ·¨μ•½ν•˜λ‹€ λ˜ν•œ, evalν•¨μˆ˜λ₯Ό 톡해 μ‹€ν–‰λ˜λŠ” μ½”λ“œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ΅œμ ν™”κ°€ μˆ˜ν–‰λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 일반적인 μ½”λ“œ 싀행에 λΉ„ν•΄ 처리 속도가 λŠλΌλ‹€. λ”°λΌμ„œ evalν•¨μˆ˜μ˜ μ‚¬μš©μ€ κΈˆμ§€ν•΄μ•Ό ν•œλ‹€.

βœ” isFinite

μΈμˆ˜κ°€ 정상적인 μœ ν•œμˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ λ¬΄ν•œμˆ˜ 이면 falseλ₯Ό 반, 전달받은 인수의 νƒ€μž…μ΄ μˆ«μžκ°€ μ•„λ‹Œ 경우, 숫자둜 νƒ€μž…μ„ λ³€ν™˜ μ΄λ•Œ μΈμˆ˜κ°€ NaN으둜 ν‰κ°€λ˜λŠ” κ°’ falseκ°’ λ°˜ν™˜

// μΈμˆ˜κ°€ μœ ν•œμˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
isFinite(0); // true
isFinite(264) // true
isFinite('10'); // '10' -> 10 true
isFintie(null); // null -> 0 true

// μΈμˆ˜κ°€ λ¬΄ν•œμˆ˜ λ˜λŠ” NaN으둜 ν‰κ°€λ˜λŠ” 값이라면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
isFintie(Infinity); // false
isFintie(-Infinity); // false

// μΈμˆ˜κ°€ NaN으둜 ν‰κ°€λ˜λŠ” 값이라면 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
isFintie(NaN); // false
isFintie('Hello'); // false
isFintie('2005/12/12') // false

βœ” isNaN

전달받은 μΈμˆ˜κ°€ NaN인지 κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. 전달받은 μΈμˆ˜μ±μž…μ΄ μˆ«μžκ°€ μ•„λ‹Œ 경우 숫자둜 νƒ€μž…μ„ λ³€ν™˜ν•œ ν›„ 검사λ₯Ό μˆ˜ν–‰ν•œλ‹€.

// 숫자
isNaN(NaN); // true
isNaN(10); // false

// λ¬Έμžμ—΄
isNaN('blabla'); // true: 'blabla' -> NaN
isNaN('10'); // false : '10' -> 10
isNaN('10.22'); // false : '10.22' -> 10.22
isNaN(''); // false : '' -> 0
isNaN(' '); // false : '  ' -> 0

// λΆˆλ¦¬μ–Έ
isNaN(true); // false: true -> 1
isNaN(null); // false: null -> 0

// undefined
isNaN(undefined); // true: undefined -> NaN

// 객체
isNaN({}); // true: {} -> NaN

// date
isNaN(new Date()); // false : new Date() -> Number
isNaN(new Date().toString()); // true : String -> NaN

βœ” parseFloat

전달받은 λ¬Έμžμ—΄ 인수λ₯Ό 뢀동 μ†Œμˆ˜μ  숫자, 즉 μ‹€μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

// λ¬Έμžμ—΄μ„ μ‹€μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
parseFloat('3.14'); // 3.14
parseFloat('10.00'); // 10

// 곡백으둜 κ΅¬λΆ„λœ λ¬Έμžμ—΄μ€ 첫 번째 λ¬Έμžμ—΄λ§Œ λ³€ν™˜ν•œλ‹€.
parseFloat('34 45 66'); // 34
parseFloat('40 years'); // 40

// 첫 번째 λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•  수 μ—†λ‹€λ©΄ NaN을 λ°˜ν™˜ν•œλ‹€.
parseFloat('He was 40'); // NaN

// μ•žλ’€ 곡백은 λ¬΄μ‹œλœλ‹€.
parseFloat('  60  ') // 60

βœ” parseInt

전달받은 λ¬Έμžμ—΄ 인수λ₯Ό μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. 두 번째 인수둜 진법을 λ‚˜νƒ€λ‚΄λŠ” 기수(2~36)을 전달할 수 μžˆλ‹€.

// λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. 
parseInt('10'); // 10
parseInt('10.123'); // 10

parseInt(10);     // -> 10
parseInt(10.123); // -> 10

// 10'을 10μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt('10'); // -> 10
// '10'을 2μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt('10', 2); // -> 2
// '10'을 8μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt('10', 8); // -> 8
// '10'을 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt('10', 16); // -> 16

기수λ₯Ό μ§€μ •ν•˜μ—¬ 10μ§„μˆ˜ 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•˜λ €λ©΄ Number.prototype.toStringλ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

const x = 15;

// 10μ§„μˆ˜ 15λ₯Ό 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
x.toString(2); // -> '1111'
// λ¬Έμžμ—΄ '1111'을 2μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt(x.toString(2), 2); // -> 15

// 10μ§„μˆ˜ 15λ₯Ό 8μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
x.toString(8); // -> '17'
// λ¬Έμžμ—΄ '17'을 8μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt(x.toString(8), 8); // -> 15

// 10μ§„μˆ˜ 15λ₯Ό 16μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.
x.toString(16); // -> 'f'
// λ¬Έμžμ—΄ 'f'λ₯Ό 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt(x.toString(8), 8); // -> 15

// μˆ«μžκ°’μ„ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.
x.toString(); // -> '15'
// λ¬Έμžμ—΄ '15'λ₯Ό 10μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€
parseInt(x.toString()); // -> 15

λ¬Έμžμ—΄μ΄ 16μ§„μˆ˜ λ¦¬ν„°λŸ΄(0xλ˜λŠ” 0X둜 μ‹œμž‘)이면 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€.

// 16μ§„μˆ˜ λ¦¬ν„°λŸ΄ '0xf'λ₯Ό 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜κ³  10μ§„μˆ˜ μ •μˆ˜λ‘œ κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€.
parseInt('0xf'); // -> 15
// μœ„ μ½”λ“œμ™€ κ°™λ‹€.
parseInt('f', 16); // -> 15

2μ§„μˆ˜ λ¦¬ν„°λŸ΄κ³Ό 8μ§„μˆ˜ λ¦¬ν„°λŸ΄μ€ μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•œλ‹€. "0"으둜 μ‹œμž‘ν•˜λŠ” 숫자 10μ§„μˆ˜λ‘œ 해석

// 2μ§„μˆ˜ λ¦¬ν„°λŸ΄(0b둜 μ‹œμž‘)은 μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•œλ‹€. 0 이후가 λ¬΄μ‹œλœλ‹€.
parseInt('0b10'); // 0
// 8μ§„μˆ˜ λ¦¬ν„°λŸ΄(ES6μ—μ„œ λ„μž…. 0o둜 μ‹œμž‘)은 μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•œλ””. 0 이후가 λ¬΄μ‹œλœλ‹€.
parseInt('0o19'); // 0

두 번째 인수둜 λͺ…ν™•ν•˜κ²Œ μ•Œλ €μ€˜μ•Ό ν•œλ‹€.

// λ¬Έμžμ—΄ '10'을 2μ§„μˆ˜λ‘œ ν•΄μ„ν•œλ‹€.
parseInt('10', 2); // 2
// λ¬Έμžμ—΄ '10'을 8μ§„μˆ˜λ‘œ ν•΄μ„ν•œλ‹€.
parseInt('10', 8); // 8

κ·Έ λ°–μ˜ μ°Έκ³ 

// 'A'λŠ” 10μ§„μˆ˜λ‘œ 해석할 수 μ—†λ‹€.
parseInt('A0'); // NaN
// '2'λŠ” 2μ§„μˆ˜λ‘œ 해석할 수 μ—†λ‹€.
parseInt('20', 2); // NaN

// 10μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” 'A' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
// 'A'λŠ” 10μ§„μˆ˜λ‘œ 해석할 수 μ—†λ‹€.
parseInt('A0'); // -> NaN
// '2'λŠ” 2μ§„μˆ˜λ‘œ 해석할 수 μ—†λ‹€.
parseInt('20', 2); // -> NaN

// 10μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” 'A' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt('1A0'); // -> 1
// 2μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” '2' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt('102', 2); // -> 2
// 8μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” '8' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt('58', 8); // -> 5
// 16μ§„μˆ˜λ‘œ 해석할 수 μ—†λŠ” 'G' μ΄ν›„μ˜ λ¬ΈμžλŠ” λͺ¨λ‘ λ¬΄μ‹œλœλ‹€.
parseInt('FG', 16); // -> 15

// 곡백으둜 κ΅¬λΆ„λœ λ¬Έμžμ—΄μ€ 첫 번째 λ¬Έμžμ—΄λ§Œ λ³€ν™˜ν•œλ‹€.
parseInt('34 45 66'); // -> 34
parseInt('40 years'); // -> 40
// 첫 번째 λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•  수 μ—†λ‹€λ©΄ NaN을 λ°˜ν™˜ν•œλ‹€.
parseInt('He was 40'); // -> NaN
// μ•žλ’€ 곡백은 λ¬΄μ‹œλœλ‹€.
parseInt(' 60 '); // -> 60

βœ” encodeURI / decodeURI

encodeURIν•¨μˆ˜λŠ” μ™„μ „ν•œ URI(Uniform Resource Identifier)λ₯Ό λ¬Έμžμ—¬λ‘œ 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ μΈμ½”λ”©ν•œλ‹€.

URIλŠ” 인터넷에 μžˆλŠ” μžμ›μ„ λ‚˜νƒ€λ‚΄λŠ” μœ μΌν•œ μ£Όμ†Œλ₯Ό λ§ν•˜κ³  URI의 ν•˜μœ„

μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬λž€?

μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬λž€ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 정보λ₯Ό κ³΅μœ ν•  λ•Œ μ–΄λ–€ μ‹œμŠ€ν…œμ—μ„œλ„ 읽을 수 μžˆλŠ” μ•„μŠ€ν‚€ 문자 μ…‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것이닀. 예λ₯Όλ“€λ©΄ ν•œκΈ€β€™κ°€β€™λŠ” %EC%9E%90 으둜 μΈμ½”λ”©λœλ‹€.

// μ™„μ „ν•œ URI
const uri = 'http://example.com?name=이웅λͺ¨&job=programmer&teacher';

// encodeURI ν•¨μˆ˜λŠ” μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ μΈμ½”λ”©ν•œλ‹€.
const enc = encodeURI(uri);
console.log(enc);
// http://example.com?name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher

decodeURIν•¨μˆ˜λŠ” μΈμ½”λ”©λœ URIλ₯Ό 인수둜 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리 μ΄μ „μœΌλ‘œ λ””μ½”λ”©ν•œλ‹€.

const uri = 'http://example.com?name=이웅λͺ¨&job=programmer&teacher';

// encodeURI ν•¨μˆ˜λŠ” μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리λ₯Ό μœ„ν•΄ μΈμ½”λ”©ν•œλ‹€.
const enc = encodeURI(uri);
console.log(enc);
// http://example.com?name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher

// decodeURI ν•¨μˆ˜λŠ” μΈμ½”λ”©λœ μ™„μ „ν•œ URIλ₯Ό 전달받아 μ΄μŠ€μΌ€μ΄ν”„ 처리 μ΄μ „μœΌλ‘œ λ””μ½”λ”©ν•œλ‹€.
const dec = decodeURI(enc);
console.log(dec);
// http://example.com?name=이웅λͺ¨&job=programmer&teacher

βœ” encodeURIComponent / decodeURIComponent

encodeURIComponentν•¨μˆ˜λŠ” URI ꡬ성 μš”μ†Œλ₯Ό 인수둜 전달받아 μΈμ½”λ”©ν•œλ‹€.

encodeURICompoenet ν•¨μˆ˜λŠ” 인수둜 μ „λ‹¬λœ λ¬Έμžμ—΄μ„ URI의 κ΅¬μ„±μš”μ†ŒμΈ 쿼리 슀트링의 μΌλΆ€λ‘œ κ°„μ£Ό. λ”°λΌμ„œ 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λœ = ? &κΉŒμ§€ μΈμ½”λ”©λœλ‹€.

반면 encodeURIν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ λ¬Έμžμ—΄μ„ μ™„μ „ν•œ URI 전체라고 κ°„μ£Όν•œλ‹€. λ”°λΌμ„œ 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λœ = ? &은 인코딩 ν•˜μ§€ μ•ŠλŠ”λ‹€.

decodeURIComponent ν•¨μˆ˜λŠ” URI ꡬ성 μš”μ†Œλ₯Ό λ””μ½”λ”©ν•œλ‹€.

// URI의 쿼리 슀트링
const uriComp = 'name=이웅λͺ¨&job=programmer&teacher';

// encodeURIComponent ν•¨μˆ˜λŠ” 인수둜 전달받은 λ¬Έμžμ—΄μ„ URI의 κ΅¬μ„±μš”μ†ŒμΈ 쿼리 슀트링의 μΌλΆ€λ‘œ κ°„μ£Όν•œλ‹€.
// λ”°λΌμ„œ 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λ˜λŠ” =, ?, &κΉŒμ§€ μΈμ½”λ”©ν•œλ‹€.
let enc = encodeURIComponent(uriComp);
console.log(enc);
// name%3D%EC%9D%B4%EC%9B%85%EB%AA%A8%26job%3Dprogrammer%26teacher

let dec = decodeURIComponent(enc);
console.log(dec);
// 이웅λͺ¨&job=programmer&teacher

// encodeURI ν•¨μˆ˜λŠ” 인수둜 전달받은 λ¬Έμžμ—΄μ„ μ™„μ „ν•œ URI둜 κ°„μ£Όν•œλ‹€.
// λ”°λΌμ„œ 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λ˜λŠ” =, ?, &λ₯Ό μΈμ½”λ”©ν•˜μ§€ μ•ŠλŠ”λ‹€.
enc = encodeURI(uriComp);
console.log(enc);
// name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher

dec = decodeURI(enc);
console.log(dec);
// name=이웅λͺ¨&job=programmer&teacher

4-3. 암묡적 μ „μ—­

μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ήν•˜λ©΄ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€. 이λ₯Ό 암묡적 μ „μ—­ 이라 ν•œλ‹€.

var x = 10; // μ „μ—­ λ³€μˆ˜

function foo () {
  // μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ή
  y = 20; // window.y = 20;
}
foo();

// μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžλ₯Ό yλ₯Ό μ „μ—­μ—μ„œ μ°Έμ‘°ν•  수 μžˆλ””.
console.log(x + y); // 30

fooν•¨μˆ˜ 내뢀에 y = 20;이 μ‹€ν–‰λ˜λ©΄ μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ³ , μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λœλ‹€.
μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œ λ“±λ‘λ˜μ–΄ 참쑰되기 λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ yλŠ” λ³€μˆ˜ μ„ μ–Έ 없이 단지 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€λ˜μ—ˆμ„ 뿐이닀.
yλŠ” λ³€μˆ˜κ°€ μ•„λ‹ˆλ‹€. λ”°λΌμ„œ λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…λ„ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

// μ „μ—­ λ³€μˆ˜λŠ” xλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•œλ‹€. 
console.log(x); // undefined
// μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ 단지 μ „μ—­ 객체의 ν”„λ‘œνΌν‹°μΈ yλŠ” ν˜Έμ΄μŠ€νŒ…μ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(y); // ReferenceError : y is not defined

var x = 10; // μ „μ—­ λ³€μˆ˜

function foo() {
  // μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ή
  y = 20; // window.y = 20;
}
foo();

// μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžλ₯Ό yλ₯Ό μ „μ—­μ—μ„œ μ°Έμ‘°ν•  수 μžˆλ‹€.
console.log(x + y); // 30
var x = 10; // μ „μ—­ λ³€μˆ˜

function foo () {
  // μ„ μ–Έν•˜μ§€ μ•Šμ€ μ‹λ³„μžμ— 값을 ν• λ‹Ή
  y = 20; // window.y = 20;
  console.log(x + y);
}
foo(); // 30

console.log(window.x); // 10
console.log(window.y); // 20

delete x; // μ „μ—­ λ³€μˆ˜λŠ” μ‚­μ œλ˜μ§€ μ•ŠλŠ”λ‹€.
delete y; // ν”„λ‘œνΌν‹°λŠ” μ‚­μ œλœλ‹€.

console.log(window.x); // 10
console.log(winodw.y); // undefined
post-custom-banner

0개의 λŒ“κΈ€