JavaScript์ ํ์ ๊ณผ ์๋ฃ๊ตฌ์กฐ
๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ๋ด์ฅ๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ์กด์ฌํ์ง๋ง, ๋ณดํต ๊ทธ ๋ด์ฉ์ ์ธ์ด๋ง๋ค ๋ค๋ฆ ๋๋ค. ์ด ๊ธ์์๋ JavaScript์์ ์ฌ์ฉํ ์ ์๋ ๋ด์ฅ ์๋ฃ๊ตฌ์กฐ์ ๊ทธ ์์ฑ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด ์๋ฃ๊ตฌ์กฐ๋ค์ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ ๊ฐ๋ฐ์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ ๋๋ค.
์ธ์ด ๊ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ์ ์ฌํ ์ ๋ฆฌ๋ ๋ด์ฉ์ ์ ๊ณตํ์ง๋ง, ๋ค๋ฅธ ์ธ์ด์ ๋ ๋ง์ ๋น๊ต๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋์ ๋ฐ ์ฝํ์
JavaScript๋ ๋์ ํ์ ์ด ์๋ ๋์ ์ธ์ด์ ๋๋ค. JavaScript์ ๋ณ์๋ ์ด๋ค ํน์ ํ์ ๊ณผ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ, ๋ชจ๋ ํ์ ์ ๊ฐ์ผ๋ก ํ ๋น (๋ฐ ์ฌํ ๋น) ๊ฐ๋ฅํฉ๋๋ค.
let foo = 42; // foo๋ ์ด์ ์ซ์์
๋๋ค
foo = "bar"; // foo๋ ์ด์ ๋ฌธ์์ด์
๋๋ค
foo = true; // foo๋ ์ด์ ๋ถ๋ฆฌ์ธ์
๋๋ค
JavaScript๋ ๋ํ ์ฝํ์ ์ธ์ด์ด๊ธฐ๋ ํฉ๋๋ค. ์ฆ, ์์ ์ ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋์ , ์ผ์นํ์ง ์๋ ํ์ ์ด ํฌํจ๋ ๊ฒฝ์ฐ ์์์ ํ์ ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.
const foo = 42; // foo๋ ์ซ์์
๋๋ค.
const result = foo + "1"; // JavaScript๋ foo๋ฅผ ๋ฌธ์์ด๋ก ๊ฐ์ ๋ณํํ๋ฏ๋ก, ๋ค๋ฅธ ํผ์ฐ์ฐ์์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
console.log(result); // 421
์์์ ํ๋ณํ์ ๋งค์ฐ ํธ๋ฆฌํ์ง๋ง, ๊ฐ๋ฐ์๊ฐ ๋ณํ์ ์ํํ ์๋๊ฐ ์๊ฑฐ๋, ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋ณํํ๋ ค๋ ๊ฒฝ์ฐ(์: ์ซ์์์ ๋ฌธ์์ด ๋์ , ๋ฌธ์์ด์์ ์ซ์๋ก ๋ณํํ๋ ๊ฒ) ์ ์ฌ์ ์ธ ์ค๋ฅ(footgun)๊ฐ ๋ ์ ์์ต๋๋ค. ๊ธฐํธ ๋ฐ BigInts์ ๊ฒฝ์ฐ, JavaScript๋ ์๋์ ์ผ๋ก ํน์ ์์์ ํ์ ๋ณํ์ ํ์ฉํ์ง ์์ต๋๋ค.
์์ ๊ฐ(Primitive values)
Object๋ฅผ ์ ์ธํ ๋ชจ๋ ํ์ ์ ์ธ์ด์ ์ตํ์ ์์ค์์ ์ง์ ํํ๋๋ ๋ถ๋ณ ๊ฐ์ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ํ์ ์ ๊ฐ์ '์์ ๊ฐ'์ด๋ผ๊ณ ํฉ๋๋ค.
null์ ์ ์ธํ ๋ชจ๋ ๊ธฐ๋ณธ ํ์
์ typeof ์ฐ์ฐ์๋ก ํ
์คํธํ ์ ์์ต๋๋ค. typeof null์ "object"๋ฅผ ๋ฐํํ๋ฏ๋ก === null์ ์ฌ์ฉํ์ฌ null์ ํ
์คํธํด์ผ ํฉ๋๋ค.
null ๋ฐ undefined๋ฅผ ์ ์ธํ, ๋ชจ๋ ์์ ํ์
์๋ ์์ ๊ฐ์ผ๋ก ์์
ํ๋ ๋ฐ ์ ์ฉํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ํด๋น ๊ฐ์ฒด ๋ํผ ํ์
์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Number ๊ฐ์ฒด๋ toExponential()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ ๊ฐ์์ ์์ฑ์ ์ ๊ทผํ๋ฉด, JavaScript๋ ๊ฐ์ ํด๋น ๋ํผ ๊ฐ์ฒด๋ก ์๋์ผ๋ก ๊ฐ์ธ๋ ๋์ ๊ฐ์ฒด์ ์์ฑ์ ์ ๊ทผํฉ๋๋ค. ๊ทธ๋ฌ๋ null ๋๋ undefined์์ ์์ฑ์ ์ ๊ทผํ๋ฉด, TypeError ์์ธ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ ํ์ ์ฒด์ด๋ ์ฐ์ฐ์๋ฅผ ๋์
ํด์ผ ํฉ๋๋ค.
| Type | typeof return value |
Object wrapper |
|---|---|---|
| Null ํ์ | "object" |
N/A |
| Undefined ํ์ | "undefined" |
N/A |
| Boolean ํ์ | "boolean" |
Boolean |
| Number ํ์ | "number" |
Number |
| BigInt ํ์ | "bigint" |
BigInt |
| String ํ์ | "string" |
String |
| Symbol ํ์ | "symbol" |
Symbol |
๊ฐ์ฒด ๋ํผ ํด๋์ค์ ์ฐธ์กฐ ํ์ด์ง์๋ ๊ฐ ํ์ ์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋ ๋ฐ ์์ฑ์ ๋ํ ์์ธํ ์ ๋ณด์, ์์ ํ์ ์์ฒด์ ์๋ฏธ ์ฒด๊ณ์ ๋ํ ์์ธํ ์ค๋ช ์ด ํฌํจ๋์ด ์์ต๋๋ค.
Null ํ์
Null ํ์
์ null์ด๋ผ๋ ์ค์ง ํ๋์ ๊ฐ๋ง ๊ฐ์ง ์ ์์ต๋๋ค.
Undefined ํ์
Undefined ํ์
์ undefined์ด๋ผ๋ ์ค์ง ํ๋์ ๊ฐ๋ง ๊ฐ์ง ์ ์์ต๋๋ค.
๊ฐ๋
์ ์ผ๋ก, undefined๋ ๊ฐ์ด ์์์ ์๋ฏธํ๊ณ , null์ ๊ฐ์ฒด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค.
(typeof null === "object"์ ๋ํ ๋ณ๋ช
์ด ๋ ์๋ ์์ต๋๋ค). ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์ธ์ด์ ๊ธฐ๋ณธ๊ฐ์ undefined์
๋๋ค.
- ๋ฐํ ๊ฐ์ด ์๋
return๋ฌธ(return;)์ ์์์ ์ผ๋กundefined๋ฅผ ๋ฐํํฉ๋๋ค. - ์กด์ฌํ์ง ์๋ ๊ฐ์ฒด ์์ฑ์ ์ ๊ทผ (
obj.iDontExist) ํ๋ฉดundefined๊ฐ ๋ฐํ๋ฉ๋๋ค. - ์ด๊ธฐํ(
let x;)๊ฐ ์๋ ๋ณ์ ์ ์ธ์ ๋ณ์๋ฅผundefined๋ก ์์์ ์ผ๋ก ์ด๊ธฐํํฉ๋๋ค. Array.prototype.find()๋ฐMap.prototype.get()์ ๊ฐ์ ๋๋ถ๋ถ์ ๋ฉ์๋๋, ์์๋ฅผ ์ฐพ์ ์ ์์ ๋undefined๋ฅผ ๋ฐํํฉ๋๋ค.
null์ ์ธ์ด์ ํต์ฌ์ ์ธ ๋ถ๋ถ์์ ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ์์น๋ prototype chain์ ๋๋ถ๋ถ์
๋๋ค. ์ด์ด์, Object.getPrototypeOf(), Object.create() ๋ฑ ํ๋กํ ํ์
๊ณผ ์ํธ ์์ฉํ๋ ๋ฉ์๋๋ undefined ๋์ null์ ๋ฐ๊ฑฐ๋ ๋ฐํํฉ๋๋ค.
null์ ํค์๋์ด์ง๋ง, undefined๋ ์ ์ญ ์์ฑ์ธ ์ผ๋ฐ์ ์ธ ์๋ณ์์
๋๋ค. ์ค์ ๋ก๋ undefined๊ฐ ์ฌ์ ์๋๊ฑฐ๋ ๊ฐ๋ ค์ ธ์๋ ์ ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ์ฐจ์ด๋ ๋ฏธ๋ฏธํฉ๋๋ค.
Boolean ํ์
Boolean ํ์
์ ๋
ผ๋ฆฌ ์์๋ฅผ ๋ํ๋ด๋ฉฐ true์ false ๋ ๊ฐ์ง์ ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๋ถ๋ฆฌ์ธ ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ผํญ ์ฐ์ฐ์ , if...else, while ๋ฑ์ ํฌํจํ, ์กฐ๊ฑด๋ถ ์ฐ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
Number ํ์
Number ํ์
์ ๋ฐฐ์ ๋ฐ๋ 64๋นํธ ์ด์ง ํ์ IEEE 754 ๊ฐ์
๋๋ค. 2-1074 (Number.MIN_VALUE) ์ 21024 (Number.MAX_VALUE) ์ฌ์ด์ ์์ ๋ถ๋ ์์์ ๋ฟ๋ง ์๋๋ผ, -2-1074 ์ -21024 ์ฌ์ด์ ์์ ๋ถ๋ ์์์ ์ซ์๋ ์ ์ฅํ ์ ์์ง๋ง, -(253 โ 1) (Number.MIN_SAFE_INTEGER) ์ 253 โ 1 (Number.MAX_SAFE_INTEGER) ๋ฒ์์ ์ ์๋ง ์์ ํ๊ฒ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด, JavaScript๋ ๋ ์ด์ ์ ์๋ฅผ ์์ ํ๊ฒ ํ์ํ ์ ์์ต๋๋ค. ๋์ ๋ฐฐ์ ๋ฐ๋ ๋ถ๋ ์์์ ๊ทผ์ฌ๊ฐ์ผ๋ก ํ์๋ฉ๋๋ค. Number.isSafeInteger()๋ฅผ ์ฌ์ฉํ์ฌ ์ซ์๊ฐ ์์ ํ ์ ์ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
ยฑ(2-1074 to 21024) ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฐ์ ์๋์ผ๋ก ๋ณํ๋ฉ๋๋ค.
Number.MAX_VALUE๋ณด๋ค ํฐ ์์๊ฐ์+Infinity๋ก ๋ณํ๋ฉ๋๋ค.Number.MIN_VALUE๋ณด๋ค ์์ ์์๊ฐ์+0์ผ๋ก ๋ณํ๋ฉ๋๋ค.Number.MAX_VALUE๋ณด๋ค ์์ ์์๊ฐ์-Infinity๋ก ๋ณํ๋ฉ๋๋ค.Number.MIN_VALUE๋ณด๋ค ํฐ ์์๊ฐ์-0์ผ๋ก ๋ณํ๋ฉ๋๋ค.
+Infinity ๋ฐ -Infinity๋ ์ํ์์์ ๋ฌดํ๋์ ์ ์ฌํ๊ฒ ์๋ํ์ง๋ง, ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Number.POSITIVE_INFINITY ๋ฐ Number.NEGATIVE_INFINITY๋ฅผ ์ฐธ๊ณ ํ์ธ์.
Number ํ์
์๋ ์ฌ๋ฌ ํํ์ด ์๋ ํ๋์ ๊ฐ๋ง ์์ต๋๋ค. 0์ -0๊ณผ +0 ๋ ๋ค๋ก ํํ๋ฉ๋๋ค(์ฌ๊ธฐ์ 0์ +0์ ๋ณ์นญ์
๋๋ค). ์ค์ ๋ก๋, ์๋ก ๋ค๋ฅธ ํํ ๊ฐ์ ๊ฑฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, +0 === -0์ true์
๋๋ค. ๊ทธ๋ฌ๋, 0์ผ๋ก ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์์ต๋๋ค.
console.log(42 / +0); // Infinity
console.log(42 / -0); // -Infinity
NaN ("Not a Number")๋ ์ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ซ์๋ก ํํํ ์ ์์ ๋, ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ํน๋ณํ ์ข
๋ฅ์ ์ซ์ ๊ฐ์
๋๋ค. ๋ํ, "NaN" ์๊ธฐ ์์ ๊ณผ ๊ฐ์ง ์์ JavaScript์ ์ ์ผํ ๊ฐ์ด๊ธฐ๋ ํฉ๋๋ค.
์ซ์๋ ๊ฐ๋ ์ ์ผ๋ก "์ํ์ ์ธ ๊ฐ"์ด๊ณ ํญ์ ์์์ ์ผ๋ก ๋ถ๋ ์์์ ์ผ๋ก ์ธ์ฝ๋ฉ๋์ง๋ง, JavaScript๋ ๋นํธ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋นํธ ์ฐ์ฐ์๋ฅผ ์ ์ฉํ ๋ ์ซ์๋ ๋จผ์ 32๋นํธ ์ ์๋ก ๋ณํ๋ฉ๋๋ค.
์ฐธ๊ณ : ๋นํธ ๋ง์คํน์ ์ฌ์ฉํด์ ํ๋์ ์ซ์ ์์ ๋ค์์ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ํ๋ผ ๋ ๋นํธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธด ํ์ง๋ง ์ด๊ฑด ๋ณดํต ๋์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ฒจ์ง๋๋ค. JavaScript๋ ์ผ๋ จ์ ๋ถ๋ฆฌ์ธ ๊ฐ๋ค์ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ (๋ฐฐ์ด์ด๋ ๋ถ๋ฆฌ์ธ ์์ฑ ๊ฐ์ ํ ๋นํ ๊ฐ์ฒด๋ก) ์ ๊ณตํฉ๋๋ค. ๋นํธ ๋ง์คํน์ ์ฝ๋๋ฅผ ์ฝ๊ณ , ์ดํดํ๊ณ , ์ ์งํ๊ธฐ ํ๋ค๊ฒ ๋ง๋ญ๋๋ค.
๋ค๋ง ๋ก์ปฌ ์ ์ฅ์์ ํ์ ๋ ๊ณต๊ฐ์ ํ์ฉํด์ผ ํ๋ค๊ฑฐ๋, ๋คํธ์ํฌ์ ๋นํธ ํ๋ํ๋๊ฐ ์์คํ ๊ทนํ ์ํฉ์ฒ๋ผ ์ ํ๋ ํ๊ฒฝ์์๋ ์ด๋ฐ ๊ธฐ์ ์ด ํ์ํ ์๋ ์์ต๋๋ค. ๋นํธ ๋ง์คํน์ ์ฉ๋ ์ต์ ํ์ ๋ง์ง๋ง ์๋จ์ผ๋ก๋ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
BigInt ํ์
BigInt ํ์
์ ์์ ์ ๋ฐ๋๋ก ์ ์๋ฅผ ๋ํ๋ผ ์ ์๋ JavaScript ์ซ์ ์์ ๊ฐ์
๋๋ค. BigInt๋ก Number์ ์์ ํ ์ ์ ์ ํ(Number.MAX_SAFE_INTEGER)์ ๋์ด์๋ ํฐ ์ ์๋ ์์ ํ๊ฒ ์ ์ฅํ๊ณ ์ฐ์ฐํ ์ ์์ต๋๋ค.
BigInt๋ ์ ์ ๋์ n์ ์ถ๊ฐํ๊ฑฐ๋ BigInt() ํจ์๋ฅผ ํธ์ถํด ์์ฑํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ Number.MAX_SAFE_INTEGER๋ฅผ ์ฆ๊ฐ์ํค๋ฉด, ์์๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
// BigInt
const x = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
x + 1n === x + 2n; // 9007199254740992n๋ 9007199254740993n๊ณผ ๊ฐ์ง ์์ false์
๋๋ค.
// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // ๋ ๋ค 9007199254740992 ์ด๊ธฐ ๋๋ฌธ์ true์
๋๋ค.
+, *, -, **, % ์ฐ์ฐ์๋ฅผ BigInt์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธ์ง๋ ์ฐ์ฐ์๋ >>>๋ฟ ์
๋๋ค. BigInt๋ Number์ ์๊ฒฉํ๊ฒ ๊ฐ์ง๋ ์์ง๋ง ๋์จํ๊ฒ ์ ์ฌํฉ๋๋ค.
BigInt๋ ์์๋ฅผ ๋ํ๋ผ ์ ์์ง๋ง, ํฐ ์ ์๋ฅผ ๋ ์ ํํ๊ฒ ๋ํ๋ผ ์ ์๊ธฐ ๋๋ฌธ์, BigInt ๊ฐ์ ์ซ์๋ณด๋ค ํญ์ ๋ ์ ํํ๊ฑฐ๋ ๋ ์ ํํ์ง ์์ต๋๋ค. ์ด๋ค ํ์
๋ ๋ค๋ฅธ ํ์
์ ์๋ฐํ์ง ์์ผ๋ฉฐ, ์๋ก ๋์ฒดํ ์ ์์ต๋๋ค. TypeError๋ BigInt ๊ฐ์ด ์ฐ์ ํํ์์ ์ผ๋ฐ ์ซ์์ ํผํฉ๋๊ฑฐ๋ ์๋ก ์์์ ์ผ๋ก ๋ณํ๋๋ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
String ํ์
String ํ์
์ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ฉฐ, UTF-16 ์ฝ๋ ๋จ์ ์๋ฅผ ๋ํ๋ด๋ 16๋นํธ ๋ถํธ ์๋ ์ ์ ๊ฐ์ ๋์ด๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. String์ ๊ฐ ์์๋ String ๋ด๋ถ์ ์์น๋ฅผ ์ฐจ์งํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์์๋ ์ธ๋ฑ์ค 0์, ๋ค์ ์์๋ ์ธ๋ฑ์ค 1์ ์์ต๋๋ค. String์ ๊ธธ์ด๋ UTF-16 ์ฝ๋ ๋จ์์ ์์ด๋ฉฐ, ์ค์ ์ ๋์ฝ๋ ๋ฌธ์ ์์ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ String ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ธ์.
JavaScript String์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ฆ, String์ด ์์ฑ๋๋ฉด ์์ ํ ์ ์์ต๋๋ค. String ๋ฉ์๋๋ ํ์ฌ String์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ String์ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
substring()์ ์ฌ์ฉํด ์๋ String์ ํ์ String์ ๋ง๋ค ์ ์์ต๋๋ค.- ์ฐ๊ฒฐ ์ฐ์ฐ์(
+) ๋๋concat()๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฌธ์์ด์ ์ฐ๊ฒฐํฉ๋๋ค.
"๋ฌธ์์ด์ ํ์ ํ"๋ฅผ ์กฐ์ฌํ๋ผ
๋ฌธ์์ด์ ์ฌ์ฉํด ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๊ฒ์ด ๋งค๋ ฅ์ ์ผ๋ก ๋ณด์ผ์ง๋ ๋ชจ๋ฅด๊ณ , ๋จ๊ธฐ์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
- ์ฐ๊ฒฐ ์ฐ์ฐ์๋ฅผ ํตํด ๋ณต์กํ ๋ฌธ์์ด์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ฌธ์์ด์ ๋๋ฒ๊น ์ด ์ฝ์ต๋๋ค. (์ถ๋ ฅ ๋ด์ฉ์ด ํญ์ ๋ฌธ์์ด์ ๊ฐ๊ณผ ๋์ผ)
- ๋ฌธ์์ด์ ๋ง์ API(์
๋ ฅ ์นธ, ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๊ฐ,
responseText์ ํจ๊ป ์ฌ์ฉํ๋XMLHttpRequest๋ฑ๋ฑ)์ ๊ณตํต ๋ถ๋ชจ์ด๋ฉฐ ๋ฌธ์์ด๋ก๋ง ์์ ํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
๊ท์น์ ํตํด, ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ผ๋ ๋ฌธ์์ด๋ก ํํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ ์ข์ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ๊ตฌ๋ถ์๋ฅผ ์ฌ์ฉํ๋ฉด (๋ฌผ๋ก JavaScript ๋ฐฐ์ด์ด ๋ ์ ํฉํ๊ฒ ์ง๋ง) ๋ฌธ์์ด๋ก ๋ฆฌ์คํธ๋ฅผ ํ๋ด๋ผ ์๋ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ๋ถ์๋ฅผ ๋ฆฌ์คํธ์ ์์๋ก ์ฌ์ฉํ๋ ์๊ฐ ๋ฆฌ์คํธ๊ฐ ๋ง๊ฐ์ง๊ณ ๋ง๋๋ค. ์ด์ ๊ตฌ๋ถ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ด์ค์ผ์ดํ ๋ฌธ์๋ฅผ ์ ํํ๊ณ , ๋ฑ๋ฑ... ์ด ๋ชจ๋ ๊ฒ์ด ๊ฐ์์ ๊ท์น์ ํ์๋ก ํ๊ณ ๋ถํ์ํ ์ ์ง๋ณด์ ๋ถ๋ด์ด ๋ฐ์ํฉ๋๋ค.
๋ฌธ์์ด์ ํ ์คํธ ๋ฐ์ดํฐ์๋ง ์ฌ์ฉํ์ธ์. ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ํํํด์ผ ํ ๋ ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ ํฉํ ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ธ์.
Symbol ํ์
Symbol์ ๊ณ ์ ํ๊ณ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์์ ๊ฐ์ด๋ฉฐ ๊ฐ์ฒด์ ์์ฑ(์๋๋ฅผ ์ฐธ๊ณ ํ์ธ์) ํค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์์ "์์"๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค. ๊ธฐํธ์ ๋ชฉ์ ์ ๋ค๋ฅธ ์ฝ๋์ ํค์ ์ถฉ๋ํ์ง ์๋๋ก ๋ณด์ฅ๋๋ ๊ณ ์ ํ ์์ฑ ํค๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค.
๊ฐ์ฒด
์ปดํจํฐ ๊ณผํ์์์ ๊ฐ์ฒด๋ ์๋ณ์๋ก ์ฐธ์กฐํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ฐ์ ๋งํฉ๋๋ค. JavaScript์์ ๊ฐ์ฒด๋ ์ ์ผํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ ๋๋ค. Functions๋ ์ฌ์ค callable ์ด๋ผ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๋ ๊ฐ์ฒด์ด๊ธฐ๋ ํฉ๋๋ค.
์์ฑ
JavaScript์์์ ๊ฐ์ฒด๋ ์์ฑ์ ์ปฌ๋ ์ ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค. ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํด ์ ํ์ ์ผ๋ก ์์ฑ์ ์ด๊ธฐํํ ์์ ์๊ณ , ๊ทธ ํ์ ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค. ๊ฐ์ฒด ์์ฑ์ ํค-๊ฐ ์๊ณผ ๋์ผํฉ๋๋ค. ์์ฑ ํค๋ stringsํ์ ๋๋ symbolsํ์ ์ด ๋ ์ ์์ต๋๋ค. ์์ฑ ๊ฐ์ผ๋ก๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํฌํจํด ๋ชจ๋ ํ์ ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ณต์กํ ์๋ฃ๊ตฌ์กฐ์ ๊ตฌ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ์ฒด ์์ฑ์๋ ๋ฐ์ดํฐ ์์ฑ๊ณผ ์ ๊ทผ์ ์์ฑ ๋ ์ข
๋ฅ๊ฐ ์์ต๋๋ค. ๊ฐ๊ฐ์ ์์ฑ์๋ ๋ค์ 'ํน์ฑ'(attribute)๋ค์ด ์กด์ฌํฉ๋๋ค. ํน์ฑ์ JavaScript ์์ง ๋ด๋ถ์์๋ ์ ๊ทผ๋์ง๋ง, Object.defineProperty()๋ฅผ ํตํด ์ค์ ํ๊ฑฐ๋, Object.getOwnPropertyDescriptor() ๋ฅผ ํตํด ์ฝ์ ์ ์์ต๋๋ค.
Object.defineProperty()์์ ๋ ์์๋ณด์ธ์.
๋ฐ์ดํฐ ์์ฑ
๋ฐ์ดํฐ ์์ฑ์ ํค๋ฅผ ๊ฐ๊ณผ ์ฐ๊ฒฐํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง๋๋ค.
value-
์์ฑ์ get ์ ๊ทผ์ผ๋ก ๊ฒ์๋ ๊ฐ์ ๋๋ค. ๋ชจ๋ JavaScript์ ๊ฐ์ด ๋ณผ ์ ์์ต๋๋ค.
writable-
ํ ๋น์ผ๋ก ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค.
enumerable-
A boolean value indicating if the property can be enumerated by a
for...inloop. See also Enumerability and ownership of properties for how enumerability interacts with other functions and syntaxes. -
์์ฑ์
for...in๋ฃจํ๋ก ์ด๊ฑฐํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค. ์ด๊ฑฐ ๊ฐ๋ฅ์ฑ์ด ๋ค๋ฅธ ํจ์ ๋ฐ ๊ตฌ๋ฌธ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋ํด์๋ ์์ฑ ์ด๊ฑฐ ๊ฐ๋ฅ์ฑ ๋ฐ ์์ ๊ถ์ ์ฐธ์กฐํ์ธ์. configurable-
์์ฑ์ ์ญ์ ํ ์ ์๋์ง, ์ ๊ทผ์ ์์ฑ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋์ง, ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋์ง๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค.
์ ๊ทผ์ ์์ฑ
์ ๊ทผ์ ์์ฑ์ ํค๋ฅผ ๋ ๊ฐ์ ์ ๊ทผ์ ํจ์(get, set) ์ค ํ๋์ ์ฐ๊ฒฐํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ์ฅํฉ๋๋ค.
์ฐธ๊ณ : ์ ๊ทผ์ '๋ฉ์๋'๊ฐ ์๋๋ผ ์ ๊ทผ์ '์์ฑ'์์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํจ์๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํ์ฌ JavaScript ๊ฐ์ฒด์ ํด๋์ค์ฒ๋ผ ์ ๊ทผ์๋ฅผ ๋ถ์ฌํ ์ ์์ง๋ง, ๊ทธ๋ ๋ค๊ณ ๊ทธ ๊ฐ์ฒด๊ฐ ํด๋์ค๋ก ๋ฐ๋๋ ๊ฒ์ ์๋๋๋ค.
์ ๊ทผ์ ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง๋๋ค.
get-
๊ฐ์ ๋ํ get ์ ๊ทผ์ด ์ํ๋ ๋๋ง๋ค ์์ฑ ๊ฐ์ ๊ฒ์ํ๊ธฐ ์ํด ๋น์ด ์๋ ์ธ์ ๋ชฉ๋ก์ผ๋ก ํธ์ถ๋๋ ํจ์์ ๋๋ค. getters๋ฅผ ์ฐธ๊ณ ํ์ธ์.
undefined์ผ ์ ์์ต๋๋ค. set-
ํ ๋น๋ ๊ฐ์ ํฌํจํ๋ ์ธ์๋ก ํธ์ถ๋๋ ํจ์์ ๋๋ค. ์ง์ ๋ ์์ฑ์ ๋ณ๊ฒฝํ๋ ค๊ณ ์๋ํ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. setters๋ ์ฐธ๊ณ ํ์ธ์.
undefined์ผ ์ ์์ต๋๋ค. enumerable-
์์ฑ์
for...in๋ฃจํ๋ก ์ด๊ฑฐํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค. ์ด๊ฑฐ ๊ฐ๋ฅ์ฑ์ด ๋ค๋ฅธ ํจ์ ๋ฐ ๊ตฌ๋ฌธ๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋ํด์๋ ์์ฑ ์ด๊ฑฐ ๊ฐ๋ฅ์ฑ ๋ฐ ์์ ๊ถ์ ์ฐธ์กฐํ์ธ์. configurable-
์์ฑ์ ์ญ์ ํ ์ ์๋์ง, ๋ฐ์ดํฐ ์์ฑ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋์ง, ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋์ง๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค.
๊ฐ์ฒด์ prototype์ ๋ค๋ฅธ ๊ฐ์ฒด ๋๋ null์ ๊ฐ๋ฆฌํต๋๋ค. ์ด๋ ๊ฐ๋
์ ์ผ๋ก ๊ฐ์ฒด์ ์จ๊ฒจ์ง ์์ฑ์ด๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก [[Prototype]]์ผ๋ก ํ์๋ฉ๋๋ค. ๊ฐ์ฒด์ [[Prototype]]์์ฑ์ ๊ฐ์ฒด ์์ฒด์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
๊ฐ์ฒด๋ ์์ ํค-๊ฐ ์์ด๋ฏ๋ก, ์ข
์ข
๋งต์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ฒด ๊ณตํ, ๋ณด์ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๋์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด, Map์ ์ฌ์ฉํ์ธ์. Map ์ฐธ์กฐ์๋ ํค-๊ฐ ์ฐ๊ฒฐ์ ์ ์ฅํ๊ธฐ ์ํ ์ผ๋ฐ ๊ฐ์ฒด์ Map ๊ฐ์ ์ฅ๋จ์ ์ ๋ํ ์์ธํ ์ค๋ช
์ด ํฌํจ๋์ด ์์ต๋๋ค.
๋ ์ง
๋ ์ง์ ์๊ฐ์ ๋ํ๋ผ ๋์ ๊ฐ์ฅ ์ข์ ์ ํ์ JavaScript ๋ด์ฅ Date ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ธ๋ฑ์ค ์ปฌ๋ ์ : ๋ฐฐ์ด๊ณผ ํ์ํ ๋ฐฐ์ด
๋ฐฐ์ด์ ์ ์ ํค๋ฅผ ๊ฐ์ง ์์ฑ๊ณผ length ์์ฑ ์ฌ์ด์ ํน๋ณํ ์ฐ๊ด์ ์ง์ด๋์ ์ผ๋ฐ ๊ฐ์ฒด์
๋๋ค.
์ด์ ๋ํด, ๋ฐฐ์ด์ ๋ฐฐ์ด์ ์กฐ์ํ ์ ์๋ ๋ช ๊ฐ์ง ํธ๋ฆฌํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ Array.prototype์์ ์์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, indexOf()๋ ๋ฐฐ์ด์์ ๊ฐ์ ํ์ํ๊ณ , push()๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ ์ ๋ ฌ๋ ๋ชฉ๋ก์ ๋ํ๋ด๋ ์๋ฒฝํ ํ๋ณด๊ฐ ๋ฉ๋๋ค.
ํ์ํ ๋ฐฐ์ด(Typed Arrays)์ ์์ชฝ์ ์ด์ง ๋ฐ์ดํฐ ๋ฒํผ์ ๋ํด ๋ฐฐ์ด๊ณผ ๊ฐ์ ๋ทฐ๋ฅผ ์ ๊ณตํ๊ณ , ๋ฐฐ์ด๊ณผ ์๋ฏธ ์ฒด๊ณ๊ฐ ์ ์ฌํ ๋ง์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. "(ํ์ํ ๋ฐฐ์ด)Typed Array"์ Int8Array, Float32Array ๋ฑ์ ๋น๋กฏํ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ๊ด์ ์ธ ์ฉ์ด์
๋๋ค. ์์ธํ ๋ด์ฉ์ typed array์ ์ฐธ๊ณ ํ์ธ์. Typed Array๋ ์ข
์ข
ArrayBuffer ๋ฐ DataView์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
ํค ์ปฌ๋ ์ : Maps, Sets, WeakMaps, WeakSets
ํค ์ปฌ๋ ์
์๋ฃ๊ตฌ์กฐ๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํค๋ก ๊ฐ์ง๋๋ค. Set๊ณผ WeakSet์ ๊ณ ์ ํ ๊ฐ์ ๋ชจ์์ ๋ํ๋ด๊ณ , Map๊ณผ WeakMap์ ๊ฐ์ฒด์ ๊ฐ์ ์ฐ๊ฒฐ ์ง๋ ์๋ค์ ๋ชจ์์ ๋ํ๋
๋๋ค.
Map๊ณผ Set์ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ๋น๊ต(<, '์์' ๋น๊ต์ ๊ฐ์ด)ํ ๋ฐฉ๋ฒ์ ์๊ณ , ์์ง๋ ๊ฐ์ฒด์ ๋ํ ํด์ ํจ์๋ฅผ ๋
ธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์, ์กฐํ ์ฑ๋ฅ์ด ํ์ฐ์ ์ผ๋ก ์ ํ์
๋๋ค. (WeakMap์ ํฌํจํด) ๋ค์ดํฐ๋ธ ๊ตฌํ์ ์์ ์๊ฐ์ ๋ํ ๋ก๊ทธํจ์์ ์กฐํ ์ฑ๋ฅ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๋ณดํต DOM ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ ๋ ํด๋น ๊ฐ์ฒด์ ์ง์ ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ data-* ํน์ฑ์ ์ฌ์ฉํ๊ฒ ์ง๋ง, ๋์ผํ ์ปจํ
์คํธ์์ ์ด๋ ๊ฒ ์ถ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์คํฌ๋ฆฝํธ์์ ๋ค ์ฌ์ฉํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Map๊ณผ WeakMap์ ์ฌ์ฉํ๋ฉด ๋น๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด์ ์ฝ๊ฒ ๋ฐ์ธ๋ฉ ํ ์ ์์ต๋๋ค.
WeakMap ๋ฐ WeakSet์ ๊ฐ๋น์ง ์ปฌ๋ ์
์ด ๊ฐ๋ฅํ ๊ฐ์ฒด ๋๋ ๋ฑ๋ก๋์ง ์์ ๊ธฐํธ๋ง ํค๋ก ํ์ฉํ๋ฉฐ, ํค๊ฐ ์ปฌ๋ ์
์ ๋จ์์์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์
ํ ์ ์์ต๋๋ค. ํนํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ต์ ํ์ ์ฌ์ฉ๋ฉ๋๋ค.
๊ตฌ์กฐํ๋ ์๋ฃ: JSON
JSON(JavaScript Object Notation)์ ๊ฒฝ๋ ๋ฐ์ดํฐ ๊ตํ ํ์์ผ๋ก, JavaScript์์ ํ์๋์ง๋ง ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. JSON์ ๋ค์ํ ํ๊ฒฝ๊ณผ ์ธ์ด ๊ฐ์ ์ ์กํ ์ ์๋ ๋ฒ์ฉ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ JSON๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ ๋ง์ ๊ฐ์ฒด
JavaScript๋ ๋ด์ฅ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค. ๋ด์ฅ ๊ฐ์ฒด์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ์ฐธ๊ณ ์๋ฅผ ์ฝ์ด๋ณด์ธ์.
ํ์ ๊ฐ์ ๋ณํ
์์์ ์ธ๊ธํ๋ฏ์ด, JavaScript๋ ์ฝํ์ ์ธ์ด์ ๋๋ค. ์ฆ, ๋ค๋ฅธ ํ์ ์ด ์์๋๋ ํ๋์ ํ์ ์ ๊ฐ์ ์์ฃผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ธ์ด์์ ์ด๋ฅผ ์ ํฉํ ํ์ ์ผ๋ก ๋ณํํด์ค๋๋ค. ์ด๋ฅผ ์ํด, JavaScript๋ ๋ช ๊ฐ์ง ๊ฐ์ ๋ณํ ๊ท์น์ ์ ์ํฉ๋๋ค.
์์ ํ์ ๊ฐ์ ๋ณํ
์์ ํ์ ๊ฐ์ ๋ณํ ํ๋ก์ธ์ค๋ ์์ ๊ฐ์ด ์์๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋์ง๋ง, ์ค์ ํ์ ์ด ๋ฌด์์ด์ด์ผ ํ๋์ง์ ๋ํ ๊ฐ๋ ฅํ ์ ํธ๋๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก string, number ๋๋ BigInt์ด ๋๋ฑํ๊ฒ ํ์ฉ๋๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Date()์์ฑ์๋Date์ธ์คํด์ค๊ฐ ์๋ ํ๋์ ์ธ์๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ, String์ ๋ ์ง String์ ๋ํ๋ด๋ ๋ฐ๋ฉด, ์ซ์๋ ํ์์คํฌํ๋ฅผ ๋ํ๋ ๋๋ค.+์ฐ์ฐ์, ํ๋์ ํผ์ฐ์ฐ์๊ฐ String์ด๋ฉด String ์ฐ๊ฒฐ์ด ์ํ๋ฉ๋๋ค.==์ฐ์ฐ์, ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ์์ ํ์ ์ด๊ณ ๋ค๋ฅธ ํผ์ฐ์ฐ์๋ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, ๊ฐ์ฒด๋ ์ ํธ ํ์ ์ด ์๋ ์์ ๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์ด ์์
์ ๊ฐ์ด ์ด๋ฏธ ์์ ํ์
์ธ ๊ฒฝ์ฐ, ๋ณํ์ ์ํํ์ง ์์ต๋๋ค. ๊ฐ์ฒด๋ [@@toPrimitive]() (ํํธ๋ก "default" ์ฌ์ฉ), valueOf(), toString() ๋ฉ์๋๋ฅผ ์ฐจ๋ก๋ก ํธ์ถํ์ฌ ์์ ํ์
์ผ๋ก ๋ณํ๋ฉ๋๋ค. ์์ ํ์
๋ณํ์ toString() ์ด์ ์ valueOf()๋ฅผ ํธ์ถํ๋๋ฐ, ์ด๋ ์ซ์ ๊ฐ์ ๋ณํ์ ๋์๊ณผ ๋น์ทํ์ง๋ง, string ๊ฐ์ ๋ณํ๊ณผ๋ ๋ค๋ฆ
๋๋ค.
[@@toPrimitive]() ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ, ์์ ํ์
์ ๋ฐํํด์ผ ํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด TypeError๊ฐ ๋ฐ์ํฉ๋๋ค. valueOf() ๋ฐ toString()์ ๊ฒฝ์ฐ, ํ๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๋ฐํ ๊ฐ์ ๋ฌด์๋๊ณ ๋ค๋ฅธ ํ๋์ ๋ฐํ ๊ฐ์ด ๋์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ ๋ค ์กด์ฌํ์ง ์๊ฑฐ๋, ์์ ํ์
์ ๋ฐํํ์ง ์์ผ๋ฉด TypeError๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์๋ก ๋ค ์ ์์ต๋๋ค.
console.log({} + []); // "[object Object]"
{} ๋๋ []์๋ [@@toPrimitive]() ๋ฉ์๋๊ฐ ์์ต๋๋ค. {} ๋ฐ [] ๋ชจ๋ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ๋ Object.prototype.valueOf์์ valueOf()๋ฅผ ์์ํฉ๋๋ค. ๋ฐํ ๊ฐ์ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฌด์๋ฉ๋๋ค. ๋ฐ๋ผ์ toString()์ด ๋์ ํธ์ถ๋ฉ๋๋ค. {}.toString()์ "[object Object]"๋ฅผ ๋ฐํํ๋ ๋ฐ๋ฉด, [].toString()๋ ""๋ฅผ ๋ฐํํ๋ฏ๋ก, ๊ฒฐ๊ณผ๋ ์ฐ๊ฒฐ๋ ๊ฐ์ธ "[object Object]"์
๋๋ค.
[@@toPrimitive]() ๋ฉ์๋๋ ์์ ํ์
์ผ๋ก ๋ณํํ ๋ ํญ์ ์ฐ์ ํฉ๋๋ค. ์์ ํ์
๋ณํ์ ์ผ๋ฐ์ ์ผ๋ก valueOf()๊ฐ ์ฐ์ ์ ์ผ๋ก ํธ์ถ๋๊ธฐ ๋๋ฌธ์, ์ซ์ ๊ฐ์ ๋ณํ๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ฉ์ ์ง์ [@@toPrimitive]() ๋ฉ์๋๊ฐ ์๋ ๊ฐ์ฒด๋ ๋ชจ๋ ์์ ํ์
์ ๋ฐํํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. Date ๋ฐ Symbol ๊ฐ์ฒด๋ [@@toPrimitive]() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ์ ์ผํ ๋ด์ฅ ๊ฐ์ฒด์
๋๋ค. Date.prototype[@@toPrimitive]()๋ "default" ํํธ๋ฅผ "string"์ธ ๊ฒ์ฒ๋ผ ์ทจ๊ธํ๋ ๋ฐ๋ฉด, Symbol.prototype[@@toPrimitive]()๋ ํํธ๋ฅผ ๋ฌด์ํ๊ณ ํญ์ ๊ธฐํธ(symbol)์ ๋ฐํํฉ๋๋ค.
์ซ์ ๊ฐ์ ๋ณํ
Number ๋ฐ BigInt์ ๋ ๊ฐ์ง ์ซ์ ํ์
์ด ์์ต๋๋ค. ๋๋๋ก ์ธ์ด๋ ํน๋ณํ ์ซ์ ๋๋ BigInt(์: ์ธ๋ฑ์ค๊ฐ ์ซ์์ฌ์ผ ํ๋ Array.prototype.slice())๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ์๋, ๋ ์ค ํ๋๋ฅผ ํ์ฉํ๊ณ ํผ์ฐ์ฐ์์ ํ์
์ ๋ฐ๋ผ ๋ค๋ฅธ ์์
์ ์ํํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ํ์
์ ์์์ ๋ณํ์ ํ์ฉํ์ง ์๋ ์๊ฒฉํ ๊ฐ์ ๋ณํ ํ๋ก์ธ์ค๋ ์ซ์ ๊ฐ์ ๋ณํ ๋ฐ BigInt ๊ฐ์ ๋ณํ์ ์ฐธ์กฐํ์ธ์.
์ซ์ ๊ฐ์ ๋ณํ์ BigInt๊ฐ TypeError๋ฅผ ๋ฐ์์ํค๋ ๋์ ์๋ ๊ทธ๋๋ก ๋ฐํ๋๋ค๋ ์ ์ ์ ์ธํ๋ฉด ์ ๊ฐ์ ๋ณํ(number coercion)ํ๊ณ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ์ซ์ ๊ฐ์ ๋ณํ์ Number์ BigInt ๋ชจ๋์ ๋ํด ์ค๋ฒ๋ก๋ฉ๋๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์ฐ์ ์ฐ์ฐ์์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ผํ ์์ธ๋ ํญ์ ์ซ์ ๊ฐ์ ๋ณํ์ ์ํํ๋ ๋จํญ ๋ํ๊ธฐ์
๋๋ค.
๊ธฐํ ๊ฐ์ ๋ณํ
Null, Undefined ๋ฐ Symbol์ ์ ์ธํ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ ์๋ ๊ฐ๊ฐ์ ๊ฐ์ ๋ณํ ํ๋ก์ธ์ค๊ฐ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ string ๊ฐ์ ๋ณํ, ๋ถ๋ฆฌ์ธ(boolean) ๊ฐ์ ๋ณํ ๋ฐ ๊ฐ์ฒด ๊ฐ์ ๋ณํ์์ ํ์ธํ์ธ์.
๋์น์ฑ์ จ๊ฒ ์ง๋ง, ๊ฐ์ฒด๋ฅผ ์์ ํ์ ์ผ๋ก ๋ณํํ ์ ์๋ ์ธ ๊ฐ์ง ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค.
- ์์ ํ์
๊ฐ์ ๋ณํ:
[@@toPrimitive]("default")โvalueOf()โtoString() - ์ซ์ ๊ฐ์ ๋ณํ, number coercion, BigInt coercion:
[@@toPrimitive]("number")โvalueOf()โtoString() - ๋ฌธ์์ด ๊ฐ์ ๋ณํ:
[@@toPrimitive]("string")โtoString()โvalueOf()
๋ชจ๋ ๊ฒฝ์ฐ์, [@@toPrimitive]()์ด ์์ผ๋ฉด ํธ์ถ ๊ฐ๋ฅํ๊ณ , ์์ ํ์
์ ๋ฐํํด์ผ ํ๋ฉฐ, valueOf ๋๋ toString์ ํธ์ถ ๊ฐ๋ฅํ์ง ์๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ๋ฌด์๋ฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ ๋๋๊ณ , ์ฑ๊ณตํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์์ ํ์
์์ ๋ณด์ฅํฉ๋๋ค. ๊ฒฐ๊ณผ ์์ ํ์
์ ์ปจํ
์คํธ์ ๋ฐ๋ผ ์ถ๊ฐ ๊ฐ์ ์ ์ฉ์ ๋ฐ์ต๋๋ค.
๊ฐ์ด ๋ณด๊ธฐ
- Oleksii Trekhleb์ JavaScript ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ
- Nicholas Zakas์ JavaScript ๊ณตํต ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ชจ์