Skip to content

Latest commit

Β 

History

History
877 lines (607 loc) Β· 30 KB

File metadata and controls

877 lines (607 loc) Β· 30 KB

21μž₯ 빌트인 객체

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

  • ν‘œμ€€ 빌트인 객체
    • ECMAScript 사양에 μ •μ˜λœ 객체
    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ˜ 곡톡 κΈ°λŠ₯을 제곡
    • μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ ν™˜κ²½ (λΈŒλΌμš°μ € λ˜λŠ” Node.js ν™˜κ²½)κ³Ό 관계없이 μ–Έμ œλ‚˜ μ‚¬μš© κ°€λŠ₯
    • μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œμ„œ 제곡됨
    • μ§€μ—­ λ³€μˆ˜μ²˜λŸΌ μ–Έμ œλ‚˜ μ°Έμ‘° κ°€λŠ₯
  • 호슀트 객체
    • ECMAScript 사양에 μ •μ˜λ˜μ§€ μ•ŠμŒ
    • μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ ν™˜κ²½ (λΈŒλΌμš°μ € λ˜λŠ” Node.js ν™˜κ²½)μ—μ„œ μΆ”κ°€λ‘œ μ œκ³΅ν•˜λŠ” 객체
  • μ‚¬μš©μž μ •μ˜ 객체
    • μ‚¬μš©μžκ°€ 직접 μ •μ˜ν•œ 객체

21.2 ν‘œμ€€ 빌트인 객체

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” 객체듀을 λœ»ν•˜λ©°, 40μ—¬ 개의 ν‘œμ€€ 빌트인 객체가 μžˆλ‹€. ex ) Object, String, Number, Boolean, Function, Array, RegExp, Date, Math, Map/Set, WeakMap/WeakSet, Promise, Reflect, JSON, Error λ“± ...

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

μƒμ„±μž ν•¨μˆ˜ 객체인 ν‘œμ€€ 빌트인 κ°μ²΄λŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³  μƒμ„±μž ν•¨μˆ˜ 객체가 μ•„λ‹Œ ν‘œμ€€ 빌트인 κ°μ²΄λŠ” 정적 λ©”μ„œλ“œλ§Œ μ œκ³΅ν•œλ‹€.

μ •μ λ©”μ„œλ“œ ν΄λž˜μŠ€λ‚˜ μƒμ„±μž ν•¨μˆ˜μ— 직접 μ—°κ²°λœ ν•¨μˆ˜
μƒμ„±μž ν•¨μˆ˜ 객체인 ν‘œμ€€ 빌트인 객체 μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹Œ ν‘œμ€€ 빌트인 객체
λŒ€λΆ€λΆ„ Math, Reflect, JSON
ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œ, 정적 λ©”μ„œλ“œ 제곡 정적 λ©”μ„œλ“œ 제곡

Math : μˆ˜ν•™μ μΈ μƒμˆ˜μ™€ ν•¨μˆ˜λ₯Ό μœ„ν•œ 속성, λ©”μ„œλ“œ 제곡 JSON : JSON ν˜•μ‹μ˜ 데이터λ₯Ό λ‹€λ£¨λŠ” λ©”μ„œλ“œ 제곡



21-01 : μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜μ—¬ μΈμŠ€ν„΄μŠ€ 생성
μΈμŠ€ν„΄μŠ€ ν΄λž˜μŠ€λ‚˜ μƒμ„±μž ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±λœ 객체

String, Number, Boolean, Function, Array, Date

"μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄ 객체가 μƒμ„±λœλ‹€" = μƒμ„±μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ νŠΉμ • νƒ€μž…μ˜ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•œλ‹€.

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

      객체 strObj λŠ” String 의 μΈμŠ€ν„΄μŠ€μ΄λ‹€.

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

// Boolean μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ Boolean 객체 생성
const boolObj= new Boolean(true); // Boolean {true}
console.log(typeof boolObj);      // object

// Function μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ Function 객체(ν•¨μˆ˜) 생성
const func = new Function('x', 'return x * x'); // Ζ’ anonymous(x )
console.log(typeof func);                       // function

// Array μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ Array 객체(λ°°μ—΄) 생성
const arr = new Array(1, 2, 3); // (3) [1, 2, 3]
console.log(typeof arr);        // object

// RegExp μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ RegExp 객체(μ •κ·œ ν‘œν˜„μ‹) 생성
const regExp = new RegExp(/ab+c/i); // /ab+c/i
console.log(typeof regExp);         // object

// Date μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ Date 객체 생성
const date = new Date();  // Fri May 08 2020 10:43:25 GMT+0900 (λŒ€ν•œλ―Όκ΅­ ν‘œμ€€μ‹œ)
console.log(typeof date); // object
21-02 μ˜ˆμ‹œ
// String μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•œ String 객체 생성
const strObj = new String('Lee'); // String {"Lee"}

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

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

21-03
// 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

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

이 λ©”μ„œλ“œλŠ” λͺ¨λ“  Number μΈμŠ€ν„΄μŠ€κ°€ 상속받아 μ‚¬μš©ν•  수 μžˆλ‹€. Number λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅ν•˜μ§€ μ•Šκ³  μ •μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” 정적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

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

μ›μ‹œκ°’μ΄ μžˆλŠ”λ°λ„ ν‘œμ€€ 빌트인 μƒμ„±μž ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ κ°€ λ¬΄μ—‡μΌκΉŒ?

21-04
const str = 'hello';

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

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

21-05
const str = 'hi';

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

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

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

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

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

21-06 : λ¬Έμžμ—΄
// β‘  μ‹λ³„μž str은 λ¬Έμžμ—΄μ„ κ°’μœΌλ‘œ κ°€μ§€κ³  μžˆλ‹€.
const str = 'hello';

// β‘‘ μ‹λ³„μž str은 μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ 래퍼 객체λ₯Ό 가리킨닀.
// μ‹λ³„μž str의 κ°’ 'hello'λŠ” 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœλ‹€.
// 래퍼 객체에 name ν”„λ‘œνΌν‹°κ°€ 동적 μΆ”κ°€λœλ‹€.
str.name = 'Lee';

// β‘’ μ‹λ³„μž str은 λ‹€μ‹œ μ›λž˜μ˜ λ¬Έμžμ—΄, 즉 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μ„ κ°–λŠ”λ‹€.
// μ΄λ•Œ β‘‘μ—μ„œ μƒμ„±λœ 래퍼 κ°μ²΄λŠ” 아무도 μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” μƒνƒœμ΄λ―€λ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.

// β‘£ μ‹λ³„μž str은 μƒˆλ‘­κ²Œ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ(β‘‘μ—μ„œ μƒμ„±λœ 래퍼 κ°μ²΄μ™€λŠ” λ‹€λ₯Έ) 래퍼 객체λ₯Ό 가리킨닀.
// μƒˆλ‘­κ²Œ μƒμ„±λœ 래퍼 κ°μ²΄μ—λŠ” name ν”„λ‘œνΌν‹°κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(str.name); // undefined

// β‘€ μ‹λ³„μž str은 λ‹€μ‹œ μ›λž˜μ˜ λ¬Έμžμ—΄, 즉 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μ„ κ°–λŠ”λ‹€.
// μ΄λ•Œ β‘£μ—μ„œ μƒμ„±λœ 래퍼 κ°μ²΄λŠ” 아무도 μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ” μƒνƒœμ΄λ―€λ‘œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.
console.log(typeof str, str);

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

κ·Έ ν›„, 래퍼 객체의 μ²˜λ¦¬κ°€ μ’…λ£Œλ˜λ©΄ 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μœΌλ‘œ μ›λž˜μ˜ μƒνƒœμΈ μ‹λ³„μžκ°€ μ›μ‹œκ°’μ„ 갖도둝 되돌리고 래퍼 κ°μ²΄λŠ” κ°€λΉ„μ§€ μ»¬λ ‰ν„°μ˜ λŒ€μƒμ΄ λœλ‹€.

21-07 : 숫자 κ°’
const num = 1.5;

// μ›μ‹œ νƒ€μž…μΈ μˆ«μžκ°€ 래퍼 객체인 Number 객체둜 λ³€ν™˜λœλ‹€.
console.log(num.toFixed()); // 2

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

숫자 값도 λ§ˆμ°¬κ°€μ§€μ΄λ‹€.

숫자 값에 λŒ€ν•΄ λ§ˆμΉ¨ν‘œ ν‘œκΈ°λ²•μœΌλ‘œ μ ‘κ·Ό => 래퍼 객체인 Number μƒμ„±μž ν•¨μˆ˜μ˜ μΈμŠ€ν„΄μŠ€ 생성 / μˆ«μžλŠ” 래퍼 객체의 [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ή : 이 λ•Œ, Nymber 의 λ©”μ„œλ“œ μ‚¬μš©κ°€λŠ₯해짐 => 래퍼 객체의 처리 μ’…λ£Œ => [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— ν• λ‹Ήλœ μ›μ‹œκ°’μ„ 되돌림 => 래퍼 객체가 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ 됨.

λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°κ°€ μ—†μ–΄μ„œ μœ μš©ν•˜μ§€ μ•Šλ‹€.

λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ, μ‹¬λ²Œμ€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λ˜λŠ” 래퍼 객체에 μ˜ν•΄ 마치 객체처럼 μ‚¬μš©ν•  수 있으며, λ©”μ„œλ“œ λ˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— String, Number, Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μžμ™€ ν•¨κ²Œ ν˜ΈμΆœν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 ν•„μš”κ°€ μ—†μœΌλ©° ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

null, undefined λŠ” 래퍼 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 객체처럼 μ‚¬μš©ν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€.



21.4 전역객체

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

μžλ°”μŠ€ν¬λ¦½νŠΈ ν™˜κ²½μ— 따라 μ§€μΉ­ν•˜λŠ” 이름

λΈŒλΌμš°μ € ν™˜κ²½ Node.js ν™˜κ²½
window λ˜λŠ” self, this, frames global
21-08 : globalThis
// λΈŒλΌμš°μ € ν™˜κ²½
globalThis === this   // true
globalThis === window // true
globalThis === self   // true
globalThis === frames // true

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

globalthis λŠ” λΈŒλΌμš°μ € ν™˜κ²½κ³Ό Node.js ν™˜κ²½μ—μ„œ μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚€λ˜ λ‹€μ–‘ν•œ μ‹λ³„μžλ₯Ό ν†΅μΌν•œ μ‹λ³„μžμ΄λ‹€.

μ „μ—­ κ°μ²΄λŠ” 3κ°€μ§€ μ’…λ₯˜μ˜ ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§„λ‹€.

  1. ν‘œμ€€ 빌트인 객체 (String, Nymber, Array, Object, Function)와
  2. ν™˜κ²½μ— λ”°λ₯Έ 호슀트 객체 ( ν΄λΌμ΄μ–ΈνŠΈ Web API λ˜λŠ” Node.js의 호슀트 API )
  3. var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ μ „μ—­ ν•¨μˆ˜

μ „μ—­ 객체의 νŠΉμ§•

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

window.parseInt === parseInt; // -> true
  • κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ 생성할 수 μ—†λ‹€. 즉, μ „μ—­ 객체λ₯Ό 생성할 수 μžˆλŠ” μƒμ„±μž ν•¨μˆ˜κ°€ μ œκ³΅λ˜μ§€ μ•ŠλŠ”λ‹€.
  • ν”„λ‘œνΌν‹°λ₯Ό μ°Έμ‘°ν•  λ•Œ window λ˜λŠ” global 을 μƒλž΅ν•  수 μžˆλ‹€.
21-10
// 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
  • μ „μ—­ κ°μ²΄λŠ” Object, String, Number, Boolean, Function, Array, RegExp, Date, Math, Promise 같은 λͺ¨λ“  ν‘œμ€€ 빌트인 객체λ₯Ό ν”„λ‘œνΌν‹°λ‘œ κ°€μ§€κ³  μžˆλ‹€. = ν”„λ‘œκ·Έλž¨ μ½”λ“œ λ‚΄ μ–΄λ””μ„œλ“  μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ ν™˜κ²½μ— 따라 좔가적인 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό κ°–λŠ”λ‹€.
λΈŒλΌμš°μ € ν™˜κ²½ Node.js ν™˜κ²½
ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ Web API λ₯Ό 호슀트 객체둜 제곡 (DOM,BOM,fetch,Web Storage λ“± λ“± ..) Node.js 고유의 APIλ₯Ό 호슀트 객체둜 제곡
  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜μ™€ μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œ 암묡적 μ „μ—­, 그리고 μ „μ—­ ν•¨μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λœλ‹€.
21-11
let foo = 123;
console.log(window.foo); // undefined
  • let μ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ μ „μ—­ λ³€μˆ˜λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.
    • let, constλŠ” μ „μ—­ λ ‰μ‹œμ»¬ ν™˜κ²½μ˜ 선언적 ν™˜κ²½ λ ˆμ½”λ“œ 내에 μ‘΄μž¬ν•œλ‹€.

- λΈŒλΌμš°μ € ν™˜κ²½μ˜ λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” ν•˜λ‚˜μ˜ μ „μ—­ 객체 `window`λ₯Ό κ³΅μœ ν•œλ‹€. - μ—¬λŸ¬ 개의 `script` νƒœκ·Έλ₯Ό 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό 뢄리해도 ν•˜λ‚˜μ˜ μ „μ—­ 객체 `window` λ₯Ό κ³΅μœ ν•˜λŠ” 것은 변함이 μ—†λ‹€.

21.4.1 빌트인 μ „μ—­ ν”„λ‘œνΌν‹°

μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ˜λ―Έν•œλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ μ‚¬μš©ν•˜λŠ” 값을 μ œκ³΅ν•œλ‹€.

21-12 : 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
21-13 : NaN

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

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

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

// NaN ν”„λ‘œνΌν‹°λŠ” Number.NaN ν”„λ‘œνΌν‹°μ™€ κ°™λ‹€.
console.log(NaN === Number.NaN); // true
21-14 : undefined

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

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

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

21.4.2 빌트인 μ „μ—­ ν•¨μˆ˜

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

eval

evaluate ν‰κ°€ν•˜λ‹€μ˜ μ€„μž„λ§λ‘œ, λ¬Έμžμ—΄μ„ μ½”λ“œλ‘œ ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν•¨μˆ˜μ΄λ‹€. eval ν•¨μˆ˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ 인수둜 μ „λ‹¬λ°›λŠ”λ‹€.

21-15
// ν‘œν˜„μ‹μΈ λ¬Έ
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

전달받은 λ¬Έμžμ—΄ μ½”λ“œκ°€ ν‘œν˜„μ‹μ΄λΌλ©΄ λ¬Έμžμ—΄ μ½”λ“œλ₯Ό λŸ°νƒ€μž„μ— ν‰κ°€ν•˜μ—¬ 값을 μƒμ„±ν•˜κ³ , 문이라면 λ¬Έμžμ—΄ μ½”λ“œλ₯Ό λŸ°νƒ€μž„μ— μ‹€ν–‰ν•œλ‹€.

21-16
console.log(eval('1 + 2; 3 + 4;')); // 7

인수둜 전달받은 λ¬Έμžμ—΄ μ½”λ“œκ°€ μ—¬λŸ¬ 개의 문으둜 이루어져 μžˆλ‹€λ©΄ λͺ¨λ“  문을 μ‹€ν–‰ν•œ λ‹€μŒ, λ§ˆμ§€λ§‰ 결과값을 λ°˜ν™˜ν•œλ‹€.

21-17 : eval ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λŸ°νƒ€μž„μ— μŠ€μ½”ν”„λ₯Ό λ™μ μœΌλ‘œ μˆ˜μ •ν•˜λŠ” μ˜ˆμ‹œ
const x = 1;

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

foo();
console.log(x); // 1
  1. μ „μ—­λ³€μˆ˜ x λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”
  2. foo ν•¨μˆ˜ μ„ μ–Έ
    • 이 ν•¨μˆ˜ λ‚΄μ—μ„œ evalν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ var x = 2; λ₯Ό λ™μ μœΌλ‘œ μ‹€ν–‰ => eval ν•¨μˆ˜κ°€ foo ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„ λ‚΄μ—μ„œ μƒˆλ‘œμš΄ λ³€μˆ˜ xλ₯Ό μ„ μ–Έν•˜κ³  2둜 μ΄ˆκΈ°ν™”
  3. foo ν•¨μˆ˜λ‚΄μ˜ console.log(x); λŠ” μ΄ˆκΈ°ν™”λ˜μ—ˆμœΌλ―€λ‘œ, ν•¨μˆ˜μ˜ μ§€μ—­ μŠ€μ½”ν”„μ— μžˆλŠ” x 값인 2κ°€ 좜λ ₯됨
  4. foo ν•¨μˆ˜ 호좜 : ν•¨μˆ˜ λ‚΄μ˜ console.log(x);κ°€ μ‹€ν–‰λ˜μ–΄ 2 좜λ ₯
  5. λ§ˆμ§€λ§‰ μ€„μ˜ console.log(x); // 1 λŠ” μ „μ—­ μŠ€μ½”ν”„μ— μžˆλŠ” x 값인 1 좜λ ₯

eval ν•¨μˆ˜κ°€ λŸ°νƒ€μž„μ— μŠ€μ½”ν”„λ₯Ό λ™μ μœΌλ‘œ μˆ˜μ •ν•˜κΈ° λŒ€λ¬Έμ— foo ν•¨μˆ˜ 내뢀와 μ™ΈλΆ€μ—μ„œ x의 값이 2κ°€ λœλ‹€.

21-18 : strict mode
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

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

21-19
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();
console.log(x); // 1

let, const ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ λ³€μˆ˜ 선언문은 strict modeκ°€ μ μš©λœλ‹€.

eval ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 λ³΄μ•ˆμ— 맀우 μ·¨μ•½ν•˜λ‹€. λ˜ν•œ eval ν•¨μˆ˜λ₯Ό 톡해 μ‹€ν–‰λ˜λŠ” μ½”λ“œλŠ” μ΅œμ ν™” μˆ˜ν–‰μ΄ λ˜μ§€ μ•Šμ•„ 처리 속도가 λŠλ¦¬λ‹€.

eval ν•¨μˆ˜μ˜ μ‚¬μš©μ€ κΈˆμ§€ν•΄μ•Ό ν•œλ‹€.


isFinite

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

21-20
// μΈμˆ˜κ°€ μœ ν•œμˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
isFinite(0);    // -> true
isFinite(2e64); // -> true
isFinite('10'); // -> true: '10' β†’ 10
isFinite(null); // -> true: null β†’ 0

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

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

isFinite(null) 은 trueλ₯Ό λ°˜ν™˜ν•œλ‹€.

21-21
console.log(+null); // 0

null을 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λ©΄ 0이 λœλ‹€.


####isNaN

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

21-22
// 숫자
isNaN(NaN); // -> true
isNaN(10);  // -> false

// λ¬Έμžμ—΄
isNaN('blabla'); // -> true: 'blabla' => NaN
isNaN('10');     // -> false: '10' => 10
isNaN('10.12');  // -> false: '10.12' => 10.12
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

전달받은 λ¬Έμžμ—΄ 인수λ₯Ό 뢀동 μ†Œμˆ˜μ  숫자, μ‹€μˆ˜(= μ •μˆ˜μ™€ λΆ„μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” λͺ¨λ“  κ°’ )둜 ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

ν•΄μ„ν•˜λŠ” : parsing

21-23
// λ¬Έμžμ—΄μ„ μ‹€μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.
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

전달받은 λ¬Έμžμ—΄ 인수λ₯Ό μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

μ •μˆ˜ : integer 해석 : parsing

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

전달받은 μΈμˆ˜κ°€ λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλ©΄ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œ λ‹€μŒ μ •μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

21-26
// 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

두 번째 인수둜 진법을 λ‚˜νƒ€λ‚΄λŠ” 기수 ( 2 ~ 36 )λ₯Ό 전달할 수 μžˆλ‹€. 기수λ₯Ό μ§€μ •ν•˜λ©΄ 첫 번째 인수둜 μ „λ‹¬λœ λ¬Έμžμ—΄μ„ ν•΄λ‹Ή 기수의 숫자둜 ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜κ°’μ€ μ–Έμ œλ‚˜ 10μ§„μˆ˜μ΄λ©°, 기수λ₯Ό μƒλž΅ν•˜λ©΄ 첫 번째 인수둜 μ „λ‹¬λœ λ¬Έμžμ—΄μ„ 10μ§„μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

21-27
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

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

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

두 번째 인수둜 진법을 λ‚˜νƒ€λ‚΄λŠ” 기수λ₯Ό μ§€μ •ν•˜μ§€ μ•Šλ”λΌλ„ 첫 번째 인수둜 μ „λ‹¬λœ λ¬Έμžμ—΄μ΄ 0x λ˜λŠ” 0X 둜 μ‹œμž‘ν•˜λŠ” 16μ§„μˆ˜ λ¦¬ν„°λŸ΄μ΄λΌλ©΄ 16μ§„μˆ˜λ‘œ ν•΄μ„ν•˜μ—¬ 10μ§„μˆ˜ μ •μˆ˜λ‘œ λ°˜ν™˜ν•œλ‹€.

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

2μ§„μˆ˜ λ¦¬ν„°λŸ΄κ³Ό 8μ§„μˆ˜ λ¦¬ν„°λŸ΄μ€ μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•œλ‹€.

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

ES5 μ—μ„œλŠ” 비둝 κΈˆμ§€λ˜μ—ˆμ—ˆμ§€λ§Œ "0" 으둜 μ‹œμž‘ν•˜λŠ” 숫자λ₯Ό 8μ§„μˆ˜λ‘œ ν•΄μ„ν–ˆλ‹€. ES6 λΆ€ν„° "0" 으둜 μ‹œμž‘ν•˜λŠ” 숫자λ₯Ό 8μ§„μˆ˜λ‘œ ν•΄μ„ν•˜μ§€ μ•Šκ³  10μ§„μˆ˜λ‘œ ν•΄μ„ν•œλ‹€. λ¬Έμžμ—΄μ„ 8μ§„μˆ˜λ‘œ ν•΄μ„ν•˜λ €λ©΄ μ§€μˆ˜λ₯Ό λ°˜λ“œμ‹œ μ§€μ •ν•΄μ•Ό ν•œλ‹€.

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

첫 번째 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄μ˜ 첫 번째 λ¬Έμžκ°€ ν•΄λ‹Ή μ§€μˆ˜μ˜ 숫자둜 λ³€ν™˜λ  수 μ—†λ‹€λ©΄ NaN을 λ°˜ν™˜ν•œλ‹€.

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

첫 번째 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄μ˜ 두 번째 λ¬ΈμžλΆ€ν„° ν•΄λ‹Ή μ§„μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžμ™€ 마주치면 이 λ¬Έμžμ™€ λ’€μ˜ λ¬Έμžλ“€μ€ μ „λΆ€ λ¬΄μ‹œλ˜λ©° ν•΄μ„λœ μ •μˆ˜κ°’λ§Œ λ°˜ν™˜ν•œλ‹€.

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

첫 번째 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄μ— 곡백이 μžˆλ‹€λ©΄ 첫 번재 λ¬Έμžμ—΄λ§Œ ν•΄μ„ν•˜μ—¬ λ°˜ν™˜ν•˜λ©° μ•žλ’€ 곡백은 λ¬΄μ‹œλœλ‹€. 첫 번째 λ¬Έμžμ—΄μ„ 숫자둜 해석할 수 μ—†λŠ” 경우 NaN을 λ°˜ν™˜ν•œλ‹€.


encodeURI / decodeURI

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

μ›Ήμ—μ„œ μ•ˆμ „ν•˜κ²Œ URI λ₯Ό μ „μ†‘ν•˜κ±°λ‚˜ λ°›μ•„μ˜¬ λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

μ΄μŠ€μΌ€μ΄ν”„ 처리 : λ„€νŠΈμ›Œν¬λ₯Ό 톡해 정보λ₯Ό κ³΅μœ ν•  λ•Œ μ–΄λ–€ μ‹œμŠ€ν…œμ—μ„œλ„ 읽을 수 μžˆλŠ” μ•„μŠ€ν‚€ 문자 μ…‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것

μ•ŒνŒŒλ²³, 09 숫자, -_.!*`() λŠ” μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬μ—μ„œ μ œμ™Έλœλ‹€.

21-34
// μ™„μ „ν•œ 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
21-35
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

URI κ΅¬μ„±μš”μ†Œ(component)λ₯Ό 인수둜 전달받아 μΈμ½”λ”©ν•œλ‹€.

λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ URI ꡬ성 μš”μ†Œλ₯Ό λ””μ½”λ”©ν•œλ‹€.

μ•ŒνŒŒλ²³, 09 숫자, -_.!*`() λŠ” μ΄μŠ€μΌ€μ΄ν”„ μ²˜λ¦¬μ—μ„œ μ œμ™Έλœλ‹€.

21-36
// 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
encodeURIComponent encodeURI
인수둜 μ „λ‹¬λœ λ¬Έμžμ—΄μ„ URI의 κ΅¬μ„±μš”μ†ŒμΈ 쿼리 슀트링의 μΌλΆ€λ‘œ κ°„μ£Ό λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœ λ¬Έμžμ—΄μ„ μ™„μ „ν•œ URI 전체라고 κ°„μ£Ό
=,?,&κΉŒμ§€ 인코딩 =,?,& 인코딩 ν•˜μ§€ μ•ŠμŒ

=,?,& λŠ” 쿼리 슀트링 κ΅¬λΆ„μžλ‘œ μ‚¬μš©λœλ‹€.


###21.4.3 암묡적 μ „μ—­

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

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

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

암묡적 μ „μ—­μ΄λž€, μ–΄λ–€ λ³€μˆ˜λ₯Ό μ„ μ–Έ 없이 λ°”λ‘œ μ‚¬μš©ν•˜λ©΄, κ·Έ λ³€μˆ˜κ°€ μ „μ—­ 객체의 ν”„λ‘œνΌν‹°λ‘œ μΆ”κ°€λ˜λŠ” ν˜„μƒ

y=20 이 μ‹€ν–‰λ˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν• κΉŒμš”!? => no μ΄μœ κ°€ λ¬΄μ—‡μΌκΉŒμš”? => 암묡적 μ „μ—­ ν˜„μƒμ΄ μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ—

μΌμ–΄λ‚˜λŠ” 일 :

  1. fooν•¨μˆ˜ 호좜
  2. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 y=20 을 window.y = 20으둜 ν•΄μ„ν•˜μ—¬ μ „μ—­ 객체에 ν”„λ‘œνΌν‹°λ₯Ό 동적 μƒμ„±ν•œλ‹€.
  3. y λŠ” μ „μ—­ 객체의 ν”„λ‘œνΌν‹°κ°€ λ˜μ–΄ μ „μ—­ λ³€μˆ˜μ²˜λŸΌ λ™μž‘ν•œλ‹€.
21-38
// μ „μ—­ λ³€μˆ˜ 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

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

21-39
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(window.y); // undefined

단지 ν”„λ‘œνΌν‹°μΈ yλŠ” deleteμ—°μ‚°μžλ‘œ μ‚­μ œν•  수 μžˆλ‹€. μ „μ—­ λ³€μˆ˜λŠ” ν”„λ‘œνΌν‹°μ΄μ§€λ§Œ delete μ—°μ‚°μžλ‘œ μ‚­μ œν•  수 μ—†λ‹€.