์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด๋ ์ํ๊น๊ฒ๋ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ๋ฅ๋ฉ๋๋ค. ์ด๋ฒ ์ฅ์์๋ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด, ํธ์คํธ ๊ฐ์ฒด, ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ ์์ ๋ณผ ๊ฒ๋๋ค.
์ธ๊ธํ๋ฏ, ํฌ๊ฒ 3๊ฐ์ง๋ก ๊ตฌ๋ถํฉ๋๋ค.
- ํ์ค ๋นํธ์ธ ๊ฐ์ฒด(Standard Built-in Objects, Native Objects, Global Objects)
- ECMAScript ์ฌ์์ ์ ์๋ ๊ฐ์ฒด๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ ๊ณตํต ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ(๋ธ๋ผ์ฐ์ , Node.js)๊ณผ ๊ด๊ณ์์ด ์ธ์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์ ๊ณต๋ฉ๋๋ค.
- ๋ณ๋์ ์ ์ธ ์์ด ์ ์ญ ๋ณ์์ฒ๋ผ ์ธ์ ๋ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- ํธ์คํธ ๊ฐ์ฒด(Host Objects)
- ECMAScript ์ฌ์์ ์ ์๋์ง ์์, ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ(๋ธ๋ผ์ฐ์ , Node.js)์ ์ถ๊ฐ๋ก ์ ๊ณต๋๋ ๊ฐ์ฒด์ ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด(User-Defined Objects)
- ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ๊ฐ์ฒด์ ๋๋ค.
40์ฌ ๊ฐ์ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค.
Math, Reflect, JSON์ ์ ์ธํ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ ๋ชจ๋ ์์ฑ์ ํจ์์ ๋๋ค.
- ์์ฑ์ ํจ์ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ : ํ๋กํ ํ์ ๋ฉ์๋, ์ ์ ๋ฉ์๋ ๋ ๋ค ์ ๊ณตํฉ๋๋ค.
- ์์ฑ์ ํจ์ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ : ์ ์ ๋ฉ์๋๋ง ์ ๊ณตํฉ๋๋ค.
ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ธ String์ ์์ฑ์ ํจ์๋ก์ ํธ์ถํ์ฌ ์์ฑํ String ์ธ์คํด์ค์ ํ๋กํ ํ์
์ String.prototype ์ด๋ฏ, ์์ฑ์ ํจ์๋ก ์์ฑ๋ ์ธ์คํด์ค์ ํ๋กํ ํ์
์ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ prototype ํ๋กํผํฐ์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ๊น์ง๋ ๋ค๋ฅธ ์์ฑ์ ํจ์์ ๊ฐ์ ๋ณด์ด์ฃ ? ๊ทธ๋ฌ๋ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ ์ธ์คํด์ค ์์ด๋ ํธ์ถ ๊ฐ๋ฅ
ํ ๋นํธ์ธ ์ ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ธ๊ธํ๋ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ ์ด๋์ ๊ฐ ๋ง์ด ๋ณธ ๋จ์ด์ ๋๋ค. ๋ฐ๋ก ์์ ๊ฐ์ด์ฃ . ์ด๋ฐ ์์ ๊ฐ์ ์ ๊ฐ์ฒด๋ก ์์ฑํ ๊น์?
์์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋๋ฏ๋ก ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ง๋ง, ๋ํผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์น ๊ฐ์ฒด์ธ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋์ ์ฝ๋๋ฅผ ๋ด ์๋ค.
const str = 'hi';
console.log(str.length); // 2
console.log(str.toUpperCase()); // HI
์ด๋ป๊ฒ ์ด๋ด๊น์? ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ์ด๋ค ์์ ๊ฐ์ ๋ํด ๋ง์น ๊ฐ์ฒด์ฒ๋ผ ๋ง์นจํ ํ๊ธฐ๋ฒ(๋๋ ๋๊ดํธ ํ๊ธฐ๋ฒ)์ผ๋ก ์ ๊ทผํ๋ฉด ์ผ์์ ์ผ๋ก ๊ทธ๋ค๊ณผ ์ฐ๊ด๋ ๊ฐ์ฒด
๋ก ๋ณํํด ์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฆ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ฌต์ ์ผ๋ก ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์์ฑ๋ ๊ฐ์ฒด๋ก ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๋ค์ ์์ ๊ฐ์ผ๋ก ๋๋๋ฆฝ๋๋ค. ์ด๋ฌํ ์์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ํผ ๊ฐ์ฒด(Wrapper Object) ๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์์ด์ ๋ํด ๋ง์นจํ ํ๊ธฐ๋ฒ์ผ๋ก ์ ๊ทผํ๋ฉด ๋ํผ ๊ฐ์ฒด์ธ String ์์ฑ์ ํจ์์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ , ๋ฌธ์์ด์ ๋ํผ ๊ฐ์ฒด์ [[StringData]]
๋ด๋ถ ์ฌ๋กฏ์ ํ ๋น๋๋ ๊ฒ์ด์ฃ . ๊ทธ๋ผ String.prototype์ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ํผ ๊ฐ์ฒด์ ์ฒ๋ฆฌ๊ฐ ์ข
๋ฃ๋๋ฉด ๋ํผ ๊ฐ์ฒด์ [[StringData]]
๋ด๋ถ ์ฌ๋กฏ์ ํ ๋น๋ ์์ ๊ฐ์ ์๋์ ์ํ๋ก ๋๋๋ฆฌ๊ณ ๋ํผ ๊ฐ์ฒด๋ GC(Garbage Collection)์ ๋์์ด ๋ฉ๋๋ค. ์ด๋ Number, Boolean๋ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. Symbol์ ์ถํ ์์ธํ ์์๋ณด๋๋ก ํ์ฃ . ์ด ์ธ์ ์์ ๊ฐ์ธ null, undefined๋ ๋ํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฉฐ, ๊ฐ์ฒด์ฒ๋ผ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ํ์ธ์.
์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ด์ ๋จ๊ณ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ์ด๋ค ๊ฐ์ฒด๋ณด๋ค ๋จผ์ ์์ฑ๋๋ ํน์ํ ๊ฐ์ฒด๋ก ์ด๋ค ๊ฐ์ฒด์ ์ํ์ง ์์ ์ต์์ ๊ฐ์ฒด์ ๋๋ค.
๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ winow, self, this, frames๊ฐ, Node.js ํ๊ฒฝ์์๋ global์ด ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํผ ํ๊ฒฝ๋ง๋ค ์ด๋ฆ์ด ๋ค๋ฆ ๋๋ค. ๊ทธ ์ค ES11์ ๋์ ๋ globalThis๋ ์ด ์๋ณ์๋ฅผ ํต์ผํ ์๋ณ์๋ก ECMAScript ํ์ค์ ๋๋ค.
// ES11์ ๋์
๋ globalThis
// ๋ธ๋ผ์ฐ์
console.log(globalThis === this); // true
console.log(globalThis === window); // true
console.log(globalThis === self); // true
console.log(globalThis === frames); // true
// Node.js
console.log(globalThis === this); // true
console.log(globalThis === global); // true
์ ์ญ ๊ฐ์ฒด๋ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด
์ ํ๊ฒฝ์ ๋ฐ๋ฅธ ํธ์คํธ(ํด๋ผ์ด์ธํธ Web API, Node.js Host API) ๊ฐ์ฒด
, var ํค์๋๋ก ์ ์ธํ ์ ์ญ ๋ณ์/ํจ์
๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ต๋๋ค. ์ฆ, ์ ์ญ ๊ฐ์ฒด ์์ ์ ์ด๋ค ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๊ณ , ๊ฐ์ฒด์ ๊ณ์ธต์ ๊ตฌ์กฐ์ ์ด๋ค์ ํ๋กํผํฐ๋ก ์์ ํ๋ ๊ฒ์ด์ฃ . ์ ์ญ ๊ฐ์ฒด์ ๋ํด ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- ์ ์ญ ๊ฐ์ฒด๋ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๋ง์ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ ์์ฑ์ ํจ์๊ฐ ์ ๊ณต๋์ง ์์์ ์๋ฏธํฉ๋๋ค.
- ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ๋ window(๋๋ global)์ ์๋ตํ ์ ์์ต๋๋ค.
- ์ ์ญ ๊ฐ์ฒด๋ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ฅผ ํ๋กํผํฐ๋ก ์์ ํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ์ ๋ฐ๋ผ ์ถ๊ฐ์ ์ธ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ต๋๋ค.
- var ํค์๋๋ก ์ ์ธํ ์ ์ญ ๋ณ์, ์๋ฌต์ ์ ์ญ, ์ ์ญ ํจ์๋ฅผ ํ๋กํผํฐ๋ก ์์ ํฉ๋๋ค.
- let, const ํค์๋๋ก ์ ์ธํ ์ ์ญ ๋ณ์๋ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ ์๋๋๋ค(์ด๋ค์ ์ ์ญ ๋ ์์ปฌ ํ๊ฒฝ์ ์ ์ธ์ ํ๊ฒฝ ๋ ์ฝ๋์ธ ๊ฐ๋ ์ ๋ธ๋ก์ ์กด์ฌํฉ๋๋ค).
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๋จ ํ๋์ ์ ์ญ ๊ฐ์ฒด window๋ฅผ ๊ณต์ ํฉ๋๋ค. ์ด ๋ง์ ๋ถ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ํ๋์ ์ ์ญ์ ๊ณต์ ํ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ ์ญ ๊ฐ์ฒด์ ๋ํ์ ์ธ ํ๋กํผํฐ๋ฅผ ๋ช๊ฐ ์ดํด๋ณผ๊น์?
์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก, ์ฃผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ ์ฌ์ฉํ๋ ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
Infinity
: ๋ฌดํ๋๋ฅผ ๋ํ๋ด๋ ์ซ์๊ฐInfinity
๋ฅผ ๊ฐ์ต๋๋ค.console.log(window.Infinity === Infinity); // true console.log(3/0); // Infinity, ์์ ๋ฌดํ๋ console.log(-3/0); // -Infinity, ์์ ๋ฌดํ๋ console.log(typeof Infinity); // number
NaN
: ์ซ์๊ฐ ์๋(Not-a-Number)๋ผ๋ ์ซ์๊ฐ NaN์ ๊ฐ์ต๋๋ค.console.log(window.NaN); // NaN console.log(Number('xyz')); // NaN console.log(1*'str'); // NaN console.log(typeof NaN); // Number
undefined
: ์์ ๊ฐ์ธ undefined๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ต๋๋ค.console.log(window.undefined); // undefined var foo; console.log(foo); // undefined console.log(typeof undefined); // undefined
์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์์ ํธ์ถํ ์ ์๋ ๋นํธ์ธ ํจ์๋ก์ ์ ์ญ ๊ฐ์ฒด์ ๋ฉ์๋์ ๋๋ค.
eval
: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌ๋ฐ๊ณ ์ด๋ฅผ ํ๊ฐํ์ฌ ๊ฐ์ ์์ฑํฉ๋๋ค.eval('1 + 2;'); // 3 eval('var x = 5;'); // undefined console.log(x); // 5 // ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๋ฐ๋์ ๊ดํธ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค. const o = eval('({ a: 1 })'); console.log(o); // { a: 1 } // ํจ์ ๋ฆฌํฐ๋ด์ ๋ฐ๋์ ๊ดํธ๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค. const f = eval('(function() { return 1; })'); console.log(f()); // 1
- ์ฌ์ฉํ์ง ๋ง์ธ์! ์ต์ ํ๊ฐ ์งํ๋์ง ์์ ์๋๊ฐ ๋๋ฆฌ๊ณ , ๋ฐํ์์ ํ๊ฐํ์ฌ ๊ฐ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ ๋ณ์กฐ์ ์ํ์ด ์์ต๋๋ค.
isFinite
: ์ ๋ฌ๋ฐ์ ์ธ์๊ฐ ์ ์์ ์ธ ์ ํ์์ธ์ง ๊ฒ์ฌํ์ฌ ์ ํ์์ด๋ฉด true, ๋ฌดํ์๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.console.log(isFinite(0)); // true console.log(isFinite('10')); // true console.log(isFinite(Infinity)); // false
isNaN
: ์ ๋ฌ๋ฐ์ ์ธ์๊ฐ NaN์ธ์ง ๊ฒ์ฌํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฆฌ์ธ ํ์ ์ผ๋ก ๋ฐํํฉ๋๋ค.console.log(isNaN(NaN)); // true console.log(isNaN(10)); // false console.log(isNaN(new Date())); // false console.log(isNaN(new Date().toString())); // true
parseFloat
: ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด ์ธ์๋ฅผ ๋ถ๋ ์์์ ์ซ์, ์ฆ ์ค์๋ก ํด์ํ์ฌ ๋ฐํํฉ๋๋ค.console.log(parseFloat('3.14')); // 3.14 console.log(parseFloat('10.00')); // 10 console.log(parseFloat('34 45 66')); // 34
- ๊ณต๋ฐฑ ๊ตฌ๋ถ ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์์ด๋ง ๋ฐํํฉ๋๋ค.
parseInt
: ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด ์ธ์๋ฅผ ์ ์๋ก ํด์ํ์ฌ ๋ฐํํฉ๋๋ค.console.log(parseFloat('10')); // 10 console.log(parseFloat('10.123')); // 10
์๋ ํจ์๋ค์ ์์๋ณด๊ธฐ ์์ URI์ ์ธ์ฝ๋ฉ์ ๋ํด ๊ฐ๋ต์ ์ผ๋ก ์์๋ณผ๊น์?
URI๋ ์ธํฐ๋ท์ ์๋ ์์์ ๋ํ๋ด๋ ์ฃผ์์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ํ๋ URI์ ํ์ ๊ฐ๋ ์ผ๋ก URL, URN์ด ์์ฃ .
์ธ์ฝ๋ฉ(Encoding)์ด๋ URI ๋ฌธ์๋ค์ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋คํธ์ํฌ๋ก ์ ๋ณด๋ฅผ ๊ณต์ ํ ๋ ์ด๋ค ์์คํ ์์๋ ์ฝ์ ์ ์๋ ์์คํค ๋ฌธ์ ์ (ASCII Character set)์ผ๋ก ๋ณํํ๋ ๊ฑฐ์ฃ . ํ๊ธ์ ํฌํจํ ๋๋ถ๋ถ์ ์ธ๊ตญ์ด๋ ํน์ ๋ฌธ์์ ๊ฒฝ์ฐ URL์ ํฌํจ๋ ์ ์๊ธฐ์ ์ด๋ฅผ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํ์ฌ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ํจ์๋ ๋ญ๊น์?
-
encodeURI/decodeURI
: ์ ๋ฌ๋ ๋ฌธ์์ด์ ์์ ํ URI๋ก ๊ฐ์ฃผํ์ฌ ์ฟผ๋ฆฌ์คํธ๋ง ๊ตฌ๋ถ์=
,?
,&
๋ ์ธ์ฝ๋ฉํ์ง ์์ต๋๋ค.- encodeURI๋ URI๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌ๋ฐ์ ์ธ์ฝ๋ฉํฉ๋๋ค.
- decodeURI๋ ์ธ์ฝ๋ฉ๋ URI๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋์ฝ๋ฉํฉ๋๋ค.
const url = 'http://localhost:8080/์๋ฐ์คํฌ๋ฆฝํธ/๊ณต๋ถ๋ฅผ์ํ/์ ์ฅ์/FECrash'; const encUrl = encodeURI(url); console.log(encodeURI(url)); console.log(decodeURI(encUrl));
encodeURIComponent/decodeURIComponent
: URI์ ๊ตฌ์ฑ ์์์ธ ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ผ๋ถ๋ก ๊ฐ์ฃผํ์ฌ=
,?
,&
๊น์ง ์ธ์ฝ๋ฉํฉ๋๋ค.- encodeURIComponent ํจ์๋ URI ๊ตฌ์ฑ ์์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ธ์ฝ๋ฉํฉ๋๋ค.
- decodeURIComponent ํจ์๋ ๋งค๊ฐ๋ณ์ ์ ๋ฌ๋ URI ๊ตฌ์ฑ ์์๋ฅผ ๋์ฝ๋ฉํฉ๋๋ค.
strict mode ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์.