๐ค JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ์ ๋ฌด์์ผ๊น ?
JavaScript๋ง์ ํน์ฑ
- ์๋ฐ์คํฌ๋ฆฝํธ(JavaScript)๋ ๊ฐ์ฒด(object) ๊ธฐ๋ฐ์ ์คํฌ๋ฆฝํธ ์ธ์ด์ ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ ์น์ ๋์์ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฃผ๋ก ์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ๋๋, Node.js์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ ์ธก ํ๋ก๊ทธ๋๋ฐ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ์ด๋ฉฐ, ํ์
์ ๋ช
์ํ ํ์๊ฐ ์๋ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์
๋๋ค.
: ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ํ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์๋๋ ๋น ๋ฅด์ง๋ง ํ์ ์์ ์ฑ์ด ๋ณด์ฅ๋์ง ์์ต๋๋ค.
: ํ์ ์คํฌ๋ฆฝํธ๋ ์ ์ ํ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ฆฌ์ง๋ง, ์์ ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค. - ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด ์งํฅํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ ํํํ ์ ์์ต๋๋ค.
๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด
๋์จํ ํ์ ์ ํ์ ์์ด ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ ํญ์ ๋ฌธ์์ด์ด๋ ์ซ์ํ ๊ฐ์ ํน์ ํ ์๋ฃํ์ ์ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณ์๋ ์๋ฃํ์ ๊ด๊ณ์์ด ๋ชจ๋ ๋ฐ์ดํฐ์ผ ์ ์๋ค.
๋ฐ๋ผ์ ๋ณ์๋ ์ด๋ค ์๊ฐ์ ๋ฌธ์์ด์ผ ์ ์๊ณ ๋ค๋ฅธ ์๊ฐ์ ์ซ์๊ฐ ๋ ์๋ ์๋ค.
-> JavaScript์ ๋ณ์๋ ์ด๋ค ํน์ ํ์
๊ณผ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ,
๋ชจ๋ ํ์
์ ๊ฐ์ผ๋ก ํ ๋น (๋ฐ ์ฌํ ๋น) ๊ฐ๋ฅํ๋ค.
- ์ด์ฒ๋ผ ์๋ฃ์ ํ์
์ ์์ง๋ง ๋ณ์์ ์ ์ฅ๋๋ ๊ฐ์ ํ์
์ ์ธ์ ๋ ์ง ๋ฐ๊ฟ ์ ์๋ ์ธ์ด๋ฅผ
‘๋์ ํ์ (dynamically typed)’ ์ธ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
==, ===
JavaScript์์ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ํด == ์ฐ์ฐ์์ === ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ ์ฐ์ฐ์๋ ๊ฐ์ด ์ผ์นํ๋ฉด true๋ฅผ ๋ฐํํ๋ฉฐ, ๊ฐ์ด ์ผ์นํ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
== ์ฐ์ฐ์
JavaScript๋ ํ์ ๋ณํ์ ๋ํด ์ ์ฐํ๊ฒ ๋์ํฉ๋๋ค.
== ์ฐ์ฐ์๋ ๋ ํผ์ฐ์ฐ์์ ๊ฐ์ ํ์ ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ผ๋ถ ํผ์ฐ์ฐ์์ ํ์ ์ ๋ณํ ํ ๊ฐ์ ๋น๊ตํฉ๋๋ค.
ํ์ ์ ๋น๊ตํ์ง ์์ผ๋ฏ๋ก === ์ฐ์ฐ์์ ๋นํด ๋์จํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
=== ์ฐ์ฐ์
== ์ฐ์ฐ์๋ ๊ฐ์ ๋น๊ตํ๊ธฐ ์ ์ ํ์ ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ํ์ ์ ๋ณํ ํ ๊ฐ์ ๋น๊ตํ์์ต๋๋ค.
ํ์ง๋ง, === ์ฐ์ฐ์๋ ํ์ ์ ๋ณํํ์ง ์์ผ๋ฏ๋ก == ์ฐ์ฐ์์ ๋นํด ๋น๊ตํ๋ ๋ฐฉ์์ด ์๊ฒฉํฉ๋๋ค.
์ฆ, === ์ฐ์ฐ์๋ ํ์ ์ด ๋ค๋ฅด๋ฉด, false๋ฅผ ๋ฐํํฉ๋๋ค.
=== ์ฐ์ฐ์์ ํน์ง
- NaN ๊ฐ์ ์๊ธฐ ์์ ์ ํฌํจํ์ฌ ์ด๋ ํ ๊ฐ๊ณผ๋ ์ผ์นํ์ง ์์ต๋๋ค. ์ฆ, === ์ฐ์ฐ์์ NaN ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ํญ์ false์ ๋๋ค.
- ์ ํํ ๋ฌธ์์ด์ ๋น๊ตํ๊ธฐ ์ํด์๋ localeCompare ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฌธ์์ด์ ๋์ผ๋ก ๋ณด์์ ๋, ๋์ผํ๋๋ผ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด ๋ค๋ฅด๊ฒ ๋์ด์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ถ์ฒ: https://developer-talk.tistory.com/184 [ํ๋ฒํ ์ง์ฅ์ธ์ ๊ณต๋ถ ์ ๋ฆฌ:ํฐ์คํ ๋ฆฌ]
๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด์ ๋ฌธ์ ์ ์ ๋ฌด์์ด๊ณ ๋ณด์ํ ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ฌด์์ด ์์์ง ์๊ฐํด๋ณด์ธ์.
type์ ์๋ชป ์์ฑํ ์๋ฌ ์ฐพ๋๋ฐ ์ด๋ ค์์ด ์์
: ์๋ฐ์คํฌ๋ฆฝํธ๋ผ๋ ์ธ์ด๋ ํด์ํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋
ธ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ํ๋ค๋ ๊ณ ์ ํ ํน์์ฑ ๋๋ฌธ์, ์ธํฐํ๋ฆฌํฐ ์ธ์ด๋ก ์ฌ๊ฒจ์ง๊ธฐ๋ ํฉ๋๋ค. ์ค์ ๋ก ์ฌ์ํ ์คํ ์๋ฌ๋ ๋ธ๋ผ์ฐ์ ๋ ๋
ธ๋์ ๋์์์ผ ํ์ธ ๊ฐ๋ฅํจ
: ์ง์ ๋ธ๋ผ์ฐ์ ์ ํผ์ณ๋ณด๊ณ ์ง์ ๋ ๋๋ง์ด ๋ ํ์ ์ฝ์๋ก ์ค๋ฅ๋ฅผ ํ์ธํด์ผ ํจ
๋์ ํ์ ์ธ์ด๋ ๋ฐํ์ ์ ํ์ธํ ์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์, ์ฝ๋๊ฐ ๊ธธ๊ณ ๋ณต์กํด์ง ๊ฒฝ์ฐ ํ์ ์๋ฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
์ด๋ฌํ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํด ํ์ ์คํฌ๋ฆฝํธ๋ Folw๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
[์ถ์ฒ] JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ์ ๋ฌด์์ผ๊น ?|์์ฑ์ ์๋ฅ์ด
undefined์ null์ ๋ฏธ์ธํ ์ฐจ์ด๋ค์ ๋น๊ตํด๋ณด์ธ์.
undefined์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ ํ ๋นํ์ง ์์ ์ํ, null์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๋น ๊ฐ์ ํ ๋นํ ์ํ(๋น ๊ฐ์ฒด)์ด๋ค. ์ฆ, undefined๋ ์๋ฃํ์ด ์๋ ์ํ์ด๋ค.
๋ฐ๋ผ์ typeof๋ฅผ ํตํด ์๋ฃํ์ ํ์ธํด๋ณด๋ฉด null์ object๋ก, undefined๋ undefined๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
typeof null // 'object'
typeof undefined // 'undefined'
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true
#undefined
undefined๋ ์์๊ฐ(Primitive Type)์ผ๋ก, ์ ์ธํ ํ์ ๊ฐ์ ํ ๋นํ์ง ์์ ๋ณ์๋ ๊ฐ์ด ์ฃผ์ด์ง์ง ์์ ์ธ์์ ์๋์ผ๋ก ํ ๋น๋๋ค. ์ด ๊ฐ์ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ ์ค ํ๋๋ก, ์ ์ญ ์ค์ฝํ์์์ ๋ณ์์ด๊ธฐ๋ ํ๋ค. ๋ฐ๋ผ์ undefined ๋ณ์์ ์ด๊ธฐ ๊ฐ์ undefined ์์ ๊ฐ์ด๋ค.
cf) undefined๋ ์์ฝ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์, ์ ์ญ ๋ฒ์ ์ธ์์ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ ์ง๋ณด์์ ๋๋ฒ๊น ์ ์ด๋ ค์์ ๊ฒช์ ์ ์์ผ๋ฏ๋ก ํผํ๋ ๊ฒ์ด ์ข๋ค.
์๋์ ๊ฒฝ์ฐ์ ๋ณ์๊ฐ undefined๋ฅผ ๋ฐํํ๋ค.
- ๊ฐ์ ํ ๋นํ์ง ์์ ๋ณ์
- ๋ฉ์๋์ ์ ์ธ์์ ๋ณ์๊ฐ ํ ๋น๋ฐ์ง ์์ ๊ฒฝ์ฐ
- ํจ์๊ฐ ๊ฐ์ return ํ์ง ์์์ ๋
#null
null์ ์์๊ฐ(Primitive Type) ์ค ํ๋๋ก, ์ด๋ค ๊ฐ์ด ์๋์ ์ผ๋ก ๋น์ด์์์ ํํํ๋ค. undefined๋ ๊ฐ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ์ง๋ง, null์ ๊ฒฝ์ฐ์๋ ํด๋น ๋ณ์๊ฐ ์ด๋ค ๊ฐ์ฒด๋ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
cf) null์ undefined์ฒ๋ผ ์ ์ญ ๊ฐ์ฒด์ ์์ฑ ์ค ํ๋๊ฐ ์๋๋ผ ๋ฆฌํฐ๋ด ๊ฐ์ด๋ค
๐ค JavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด๋ ?
javascript์ ์์ ํ์
(primitive data type)์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable value)์ด๋ค.
- Boolean
- null
- undefined
- Number
- String
- Symbol (New in ECMAScript 6)
์์ ํ์ ์ด์ธ์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด(Object) ํ์ ์ด๋ฉฐ ๊ฐ์ฒด ํ์ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ(mutable value)์ด๋ค. ์ฆ, ๊ฐ์ฒด๋ ์๋ก์ด ๊ฐ์ ๋ค์ ๋ง๋ค ํ์์์ด ์ง์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ์ดํด๋ณด์. C ์ธ์ด์๋ ๋ค๋ฅด๊ฒ Javascript์ ๋ฌธ์์ด์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable value) ์ด๋ค. ์ด๋ฐ ๊ฐ์ “primitive values” ๋ผ ํ๋ค. (๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ป์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค. ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค)
์๋์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
var str = 'Hello';
str = 'world';
์ฒซ๋ฒ์งธ ๊ตฌ๋ฌธ์ด ์คํ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๋ฌธ์์ด ‘Hello’๊ฐ ์์ฑ๋๊ณ ์๋ณ์ str์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋ ๋ฌธ์์ด ‘Hello’์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๊ตฌ๋ฌธ์ด ์คํ๋๋ฉด ์ด์ ์ ์์ฑ๋ ๋ฌธ์์ด ‘Hello’์ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๋ฌธ์์ด ‘world’๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ๊ณ ์๋ณ์ str์ ์ด๊ฒ์ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ ๋ฌธ์์ด ‘Hello’์ ‘world’๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๊ณ ์๋ค. ๋ณ์ str์ ๋ฌธ์์ด ‘Hello’๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค๊ฐ ๋ฌธ์์ด ‘world’๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝ๋์์ ๋ฟ์ด๋ค.
๋ค๋ฅธ ์๋ฅผ ์์๋ณด์.
var user = {
name: 'Lee',
address: {
city: 'Seoul'
}
};
var myName = user.name; // ๋ณ์ myName์ string ํ์
์ด๋ค.
user.name = 'Kim';
console.log(myName); // Lee
myName = user.name; // ์ฌํ ๋น
console.log(myName); // Kim
user.name์ ๊ฐ์ ๋ณ๊ฒฝํ์ง๋ง ๋ณ์ myName์ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์๋ค. ์ด๋ ๋ณ์ myName์ user.name์ ํ ๋นํ์ ๋ user.name์ ์ฐธ์กฐ๋ฅผ ํ ๋นํ๋ ๊ฒ์ด ์๋๋ผ immutableํ ๊ฐ ‘Lee’๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์๋ก ์์ฑ๋๊ณ myName์ ์ด๊ฒ์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ user.name์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค ํ๋๋ผ๋ ๋ณ์ myName์ด ์ฐธ์กฐํ๊ณ ์๋ ‘Lee’๋ ๋ณํจ์ด ์๋ค.
var user1 = {
name: 'Lee',
address: {
city: 'Seoul'
}
};
var user2 = user1; // ๋ณ์ user2๋ ๊ฐ์ฒด ํ์
์ด๋ค.
user2.name = 'Kim';
console.log(user1.name); // Kim
console.log(user2.name); // Kim
์์ ๊ฒฝ์ฐ ๊ฐ์ฒด user2์ name ํ๋กํผํฐ์ ์๋ก์ด ๊ฐ์ ํ ๋นํ๋ฉด ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ด ์๋๋ฏ๋ก ๊ฐ์ฒด user2๋ ๋ณ๊ฒฝ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ณ๊ฒฝํ์ง๋ ์์ ๊ฐ์ฒด user1๋ ๋์์ ๋ณ๊ฒฝ๋๋ค. ์ด๋ user1๊ณผ user2๊ฐ ๊ฐ์ ์ด๋๋ ์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
- ๋ถ๋ณ( immutability )์ด๋ ๋ญ๊น? ๋จ์ด์์ ์ ์ถํด๋ณผ ์ ์๋ค์ํผ '๋ณํ์ง ์๋ ๋ป'์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ๊ทธ๋ผ '๋ถ๋ณ ๊ฐ์ฒด'๋? '๋ณํ์ง ์๋ ๊ฐ์ฒด' ์ฆ ์ด๋ฏธ ํ ๋น๋ ๊ฐ์ฒด๊ฐ ๋ณํ์ง ์๋๋ค๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง ์ธ๋ฐ const์ Object.freeze()๋ฅผ ์ฌ์ฉํ๋ ๊ป์ด๋ค.
โ
โ
[ const ]
์๋ฐ์คํฌ๋ฆฝํธ ํค์๋ ์ค ํ๋์ธ const์ด๋ค.
ES6 ๋ฌธ๋ฒ๋ถํฐ let ๊ณผ const๋ฅผ ์ง์ํ๋ค.
โ
constํค์๋๋ ๋ณ์๋ฅผ ์์๋ก ์ ์ธํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์๋ก ์ ์ธ๋ ๋ณ์๋ ๊ฐ์ ๋ฐ๊พธ์ง ๋ชปํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์์๋ก ์ ์ธํ ๊ฐ์ฒด๋ ๋ถ๋ณ ๊ฐ์ฒด์ผ๊น?
const test = {}; test.name = "apple" console.log(test); // {"apple"}
ES6์์์ const๋ ํ ๋น๋ ๊ฐ์ด ์์๊ฐ ๋๋ ๊ฒ์ด ์๋ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ด ์์๊ฐ ๋๋, ์ฆ test๋ณ์๊ฐ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์ const ํค์๋๋ก ์ ์ธ๋ test ๋ณ์์๋ ๊ฐ์ฒด ์ฌํ ๋น์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
โ
์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅ ํ ์ด์ ๋ ๋ณ์์ ๊ฐ(๊ฐ์ฒด) ์ฌ์ด์ ๋ฐ์ธ๋ฉ ์์ฒด๊ฐ ๋ณ๊ฒฝ์ด ๋๊ธฐ ๋๋ฌธ์ ์์์ธ test๋ณ์๋ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅ ํ ๊ฒ์ด๊ณ
๊ฐ์ฒด์ ์์์ด ๋ณ๊ฒฝ๊ฐ๋ฅ ํ ์ด์ ๋ ์ค์ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ์ ๋์ง๋ง ({} -> name: "apple") ๊ฐ์ฒด์ ๋ณ์ (test)์ฌ์ด์ ๋ฐ์ธ๋ฉ์ ๋ณ๊ฒฝ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
โ
๋๋ฌธ์ ๋น๋ก ์ฌํ ๋น์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํจ์ผ๋ก ์ธํด ๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฐ์ฒด์ ๋ด์ฉ๊น์ง ๋ณ๊ฒฝ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ๊ฐ์ฒด๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค๋ค.
๋ฐ๋ผ์ Object.freeze()๋ผ๋ JS๋ด์ฅ ๋ฉ์๋๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
โ
โ
[Object.freeze()]
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ฉ์๋์ธ Object.freeze() ๋ฉ์๋์ด๋ค. ๊ณต์ ๋ฌธ์์์๋ "๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๊ธฐ ์ํ ๋ฉ์๋"๋ผ๋ ์ ํ ์๋ค.
โ
๊ทธ๋ ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์๊น? ๋จผ์ ์ด ๋ฉ์๋์ ์ฌ์ฉ๋ฒ๋ถํฐ ์์๋ณด๋ฉด,
let test = { name : 'kim' } Object.freeze(test);
์ฌ์ฉ๋ฒ์ ๊ฐ๋จํ๋ค. test๋ณ์์ key value๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ ํ Object.freeze(test)๋ฅผ ์ฌ์ฉํด ๋ฐ์ธ๋ฉ๋ ๋ณ์๋ฅผ ๋๊ฒฐ ๊ฐ์ฒด๋ก ๋ง๋ค์๋ค.๋๋ฌธ์ test๊ฐ์ฒด๋ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ์๋๋ ๋ถ๊ฐ๋ฅ ํ๋ค.
โ
test.name = 'Jung'; console.log(test) //{name: 'kim'}
์์ ๊ฐ์ด ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ์๋๋ ๋ฌด์๋๋ค.
๊ทธ๋ฌ๋ Object.freeze()๋ ๋๊ฒฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง๋ง ๊ฐ์ฒด์ ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค.
โ
test = { age : 15 }; console.log(test); // {age: 15}
์์ ๊ฐ์ด ๊ฐ์ฒด์ ์ฌํ ๋น์ ๊ฐ๋ฅํ๋ค.
๋๋ฌธ์ Object.freeze()๋ ๋ถ๋ณ ๊ฐ์ฒด๋ผ๊ณ ํ ์ ๋ ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ผ ๊ฒฐ๊ตญ ๋ถ๋ณ ๊ฐ์ฒด๋ ์ด๋ป๊ฒ ๋ง๋ค ์ ์๋๋ฉด
โ
const์ Object.freeze()๋ฅผ ์กฐํฉํ์ฌ ๋ง๋ค ์ ์๋ค.
(const์ ์ฌํ ๋น๋ถ๊ฐ + Object.freeze()์ ๊ฐ์ฒด ์์ฑ ๋ณ๊ฒฝ ๋ถ๊ฐ)
โ
๊ทธ๋ ๋ค๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
const test = { 'name' : 'jung' }; Object.freeze(test);
๋จผ์ const ํค์๋๋ก ๋ฐ์ธ๋ฉ ๋ ๋ณ์๋ฅผ ์์ํ ์ํจ ๋ค์, Object.freeze()๋ก ํด๋น ๋ณ์๋ฅผ ๋๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๊ฐ์ฒด์ ์ฌํ ๋น๊ณผ ๊ฐ์ฒด์ ์์ฑ ๋ ๋ค ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋๋ค.
๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ด
Primitive Type (๊ธฐ๋ณธํ ํ์ ) / Reference Type (์ฐธ์กฐํ ํ์ ) โโ์ด ์๋ค.
โ
โ
[ Primitive Type ]
๊ธฐ๋ณธํ์ ๊ฐ์ ๊ทธ๋๋ก ํ ๋นํ๋ค.
- Number (์ซ์)
- String (๋ฌธ์)
- Boolean(๋ถ๋ฆฌ์ธ)
- null
- undefined
- Symbol(ES6์ ์ถ๊ฐ, ๊ฐ์ฒด ์์ฑ์ ๋ง๋๋ ๋ฐ์ดํฐ ํ์ )
โ
[ Reference Type ]
๊ฐ์ด ์ ์ฅ ๋ ์ฃผ์๊ฐ์ ํ ๋น
- Object (๊ฐ์ฒด)
- Array (๋ฐฐ์ด)
- Function (ํจ์)
- Date (๋ ์ง)
- RegExp(์ ๊ทํํ์) ๋ฑ
โ
+ ES6์์ Map, WeakMap, Set, WeakSet ๋ฑ ์ถ๊ฐ๋จ.
๊ฐ์ฒด์ ํ์ ๋ถ๋ฅ์ ์ํ๋ค.
โ
โ
[ ๊ธฐ๋ณธํ VS ์ฐธ์กฐํ ]
- ๊ธฐ๋ณธํ์ ๋ถ๋ณ์ฑ์ ๋ด๋ค.
- ๊ธฐ๋ณธํ์ ๊ฐ์ด ๋ด๊ธด ์ฃผ์๊ฐ์ ๋ฐํธ ๋ณต์
- ์ฐธ์กฐํ์ ๊ฐ์ด ๋ด์ ์ฃผ์๊ฐ๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฌถ์์ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ์ ๋ณต์
โ
[ ๋ฐ์ดํฐ ํ์ ์ด ์ ํ์ํ ๊น? ]
- ๊ฐ์ ์ง์ ํ ๋ ํ๋ณดํด์ผ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด
- ๊ฐ์ ์ฐธ์กฐํ ๋ ํ ๋ฒ์ ์ฝ์ด ๋ค์ฌ์ผ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด
- ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด ๋ค์ธ 2์ง์๋ฅผ ์ด๋ป๊ฒ ํด์ํ ์ง ๊ฒฐ์ ํ๊ธฐ ์ํด
JavaScript ํ๋ณํ
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์
์ด ๋งค์ฐ ์ ์ฐํ ์ธ์ด๋ก (Dynamic typing: dynamically type language - Runtime์์ type์ด ์ ํด์ง)
ํ์์ ๋ฐ๋ผ โ ์์์ ๋ณํ ๋๋ โก ๋ช
์์ ๋ณํ (๊ฐ๋ฐ์์ ์๋์ ๋ฐ๋ผ) ์งํํ๋ค.
1. ์์์ ๋ณํ
- ์ฐ์ ์ฐ์ฐ์๋ฅผ ํตํด ์์์ ๋ณํ์ด ๊ฐ๋ฅํ๋ค.
: ๋ํ๊ธฐ(+) ์ฐ์ฐ์๋ ์ซ์๋ณด๋ค ๋ฌธ์์ด์ด ์ฐ์ ์ ๋๊ธฐ๋๋ฌธ์, ์ซ์ํ์ด ๋ฌธ์ํ์ ๋ง๋๋ฉด ๋ฌธ์ํ์ผ๋ก ๋ณํํ์ฌ ์ฐ์ฐ๋๋ค. (๋ฌธ์ > ์ซ์)
number + number // number
number + string // string
string + string // string
string + boolean // string
number + boolean // number
50 + 50; //100
100 + “์ ”; //”100์ ”
“100” + “์ ”; //”100์ ”
“10” + false; //”100"
99 + true; //100
2. ๋ช ์์ ๋ณํ
ํ์ ์ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ Object(), Number(), String(), Boolean() ์ ๊ฐ์ ํจ์๋ฅผ ์ด์ฉํ๋ค.
1) A Type → Number Type : ๋ค๋ฅธ ์๋ฃํ์ ์ซ์ํ์ ์ผ๋ก
- Number()๋ ์ ์ํ๊ณผ ์ค์ํ์ ์ซ์๋ก ๋ณํํ๋ค.
Number(“12345”); //12345
Number(“2”*2); //4
- parseInt()๋ ์ ์ํ์ ์ซ์๋ก ๋ณํํ๋ค.
parseInt(“27”) //27
parseInt(0033); //27
parseInt(0x1b); //27
parseInt(“ 2”); //2
parseInt(“ 2ใ
”); //2
parseInt(“ ใ
2”); //NaN
- parseFloat()๋ ๋ถ๋ ์์์ ์ ์ซ์๋ก ๋ณํํ๋ค.
parseInt()์๋ ๋ฌ๋ฆฌ parseFloat()๋ ํญ์ 10์ง์๋ฅผ ์ฌ์ฉํ๋ฉฐ parseFloat() ๋ํ ์๋ถ๋ถ ๋น ๊ณต๋ฐฑ์ ๋๊ณ ๋์ค๋ ๋ฌธ์๋ ๋ชจ๋ ๋ฌด์๋์ด NaN์ ๋ฐํํ๋ค.
parseFloat(“!123”); //NaN
parseFloat(“123.123456”); //123.123456
parseInt(“123.123456”); //123
parseFloat(“ 123.123456”); //123.123456
parseFloat(“ a123.123456”); //NaN
2) A Type → String Type : ๋ค๋ฅธ ์๋ฃํ์ ๋ฌธ์ ํ์ ์ผ๋ก
- String()
String(123); //”123"
String(123.456); //”123.456"
- toString()๋ ์ธ์๋ก ๊ธฐ์๋ฅผ ์ ํํ ์ ์๋ค. ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด 10์ง์๋ก ๋ณํํ๋ค.
var trans = 100;
trans.toString(); //”100"
trans.toString(2); //”1100100"
trans.toString(8); //”144"
- toFixed()์ ์ธ์๋ฅผ ๋ฃ์ผ๋ฉด ์ธ์๊ฐ๋งํผ ๋ฐ์ฌ๋ฆผํ์ฌ ์์์ ์ ํํํ๋ฉฐ ์์์ ์ ๋์น๋ ๊ฐ์ด ์ธ์๋ก ๋ค์ด์ค๋ฉด 0์ผ๋ก ๊ธธ์ด๋ฅผ ๋ง์ถ ๋ฌธ์์ด์ ๋ฐํํ๋ค.
var trans = 123.456789;
var roundOff = 99.987654;
trans.toFixed(); //”123"
trans.toFixed(0); //”123"
trans.toFixed(2); //”123.46"
trans.toFixed(8); //”123.45678900"
3) A Type → Boolean Type : ๋ค๋ฅธ ์๋ฃํ์ ๋ถ๋ฆฐ ํ์ ์ผ๋ก
Boolean(100); //true
Boolean(“1”); //true
Boolean(true); //true
Boolean(Object); //true
Boolean([]); //true
Boolean(0); //false
Boolean(NaN); //false
Boolean(null); //false
Boolean(undefined); //false
Boolean( ); //false
์ถ์ฒ: https://velog.io/@happyvirusoojin/JavaScript-%ED%8A%B9%EC%84%B1-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
์ถ์ฒ:https://bestalign.github.io/dev/understanding-loose-typing-in-javascript/
์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ
[ ์์ ๋ณต์ฌ (Shallow copy)]
์ฐ๋ฆฌ๊ฐ ํํ ์๊ณ ์๋ฏ์ด, ๊ฐ์ฒด๊ฐ ๋ด๊ฒจ ์๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด calll by reference(๋ฐ์ดํฐ ๋ณต์ฌ๊ฐ ์๋ ์ฐธ์กฐ)๊ฐ ์ผ์ด๋๊ฒ ๋์ด, ํ ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ๋ณ์์ ๋ฐ์ดํฐ๋ ํจ๊ป ๋ณ๊ฒฝ์ด ๋๋ค.
const personq1 = {name:'inyong'};
const person2 = person1;
person1.name = 'jung';
// result
person2.name // 'jung'
person1 === person2; // true - ๊ฐ์ ๋ฐ์ดํฐ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๋ ๋ณ์
๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ํ๋ ๋ ์์ฑ๋ ๊ฒ์ด ์๋ ํด๋น ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ฌํ๊ฒ ๋ผ์, ๊ฒฐ๊ตญ ํ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
โ
[ ๊น์ ๋ณต์ฌ (Depth copy) ]
ํ ๋ฐ์ดํฐ์ ๊ณต์ ๊ฐ ์๋, ๋๊ฐ์ ๊ตฌ์กฐ์ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ ์์ฑํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ๊ณ ์ ํ ๋๊ฐ ์๋ค.
โ
์ด๋ด ๋ ์ฐ๋ฆฌ๋ '๊น์ ๋ณต์ฌ'๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
โ
const person1 = { name : "inyong"};
const person2 = Object.assign({}, person1);
person1.name = "jung";
//result
person2.name // 'inyong' - ์ ํ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ฐ์ดํฐ์ด๋ฏ๋ก, person2์ ๊ฐ์ ๋ณํ์ง ์์.
person1 === person2 // false - ํํ๋ง ๊ฐ๊ณ , ๊ฐ์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ๋ค.โ
[์ถ์ฒ] JavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด๋ ?|์์ฑ์ ์๋ฅ์ด
๐ค ํธ์ด์คํ ๊ณผ TDZ๋ ๋ฌด์์ผ๊น ?
ํธ์ด์คํ
JavaScript์์ ํธ์ด์คํ (hoisting)์ด๋, ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ณ์์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ธ ์ ์ ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธ. var๋ก ์ ์ธํ ๋ณ์์ ๊ฒฝ์ฐ ํธ์ด์คํ ์ undefined๋ก ๋ณ์๋ฅผ ์ด๊ธฐํ. ๋ฐ๋ฉด let๊ณผ const๋ก ์ ์ธํ ๋ณ์์ ๊ฒฝ์ฐ ํธ์ด์คํ ์ ๋ณ์๋ฅผ ์ด๊ธฐํํ์ง ์์.
ํธ์ด์คํ ์ ์ค๋ช ํ ๋ ์ฃผ๋ก "๋ณ์์ ์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ๋ถ๋ฆฌํ ํ, ์ ์ธ๋ง ์ฝ๋์ ์ต์๋จ์ผ๋ก ์ฎ๊ธฐ๋" ๊ฒ์ผ๋ก ๋งํ๊ณค ํ๋ค. ๋ฐ๋ผ์ ๋ณ์๋ฅผ ์ ์ํ๋ ์ฝ๋๋ณด๋ค ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์์ ๋ฑ์ฅํ ์ ์๋ค. ๋ค๋ง ์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ํจ๊ป ์ํํ๋ ๊ฒฝ์ฐ, ์ ์ธ ์ฝ๋๊น์ง ์คํํด์ผ ๋ณ์๊ฐ ์ด๊ธฐํ๋ ์ํ๊ฐ ๋จ์ ์ฃผ์.
์ถ์ฒ:https://developer.mozilla.org/ko/docs/Glossary/Hoisting
ํธ์ด์คํ ์ ๋์
์๋ฐ์คํฌ๋ฆฝํธ๋ ES6์์ ๋์
๋ let, const๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์ ์ธ(var, let, const, function, function*, class)์ ํธ์ด์คํ
ํ๋ค.
let/const ๋ณ์ ์ ์ธ๊ณผ ํจ์ ํํ์ ์์๋ ํธ์ด์คํ
์ด ๋ฐ์ํ์ง ์์.
foo();
foo2();
function foo() { // ํจ์์ ์ธ๋ฌธ
console.log("hello");
}
var foo2 = function() { // ํจ์ํํ์
console.log("hello2");
}
ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์์ ํธ์ด์คํ
ํจ์ ์ ์ธ๋ฌธ์์์ ํธ์ด์คํ
ํจ์ ์ ์ธ๋ฌธ์ ์ฝ๋๋ฅผ ๊ตฌํํ ์์น์ ๊ด๊ณ์์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ง์ธ ํธ์ด์คํ ์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํด์ ํ ๋ ๋งจ์๋ก ๋์ด ์ฌ๋ ค์ง๋ค.
/* ์ ์ ์ถ๋ ฅ */
function printName(firstname) { // ํจ์์ ์ธ๋ฌธ
var result = inner(); // "์ ์ธ ๋ฐ ํ ๋น"
console.log(typeof inner); // > "function"
console.log("name is " + result); // > "name is inner value"
function inner() { // ํจ์์ ์ธ๋ฌธ
return "inner value";
}
}
printName(); // ํจ์ ํธ์ถ
ํจ์ ํํ์์์์ ํธ์ด์คํ
ํจ์ ํํ์์ ํจ์ ์ ์ธ๋ฌธ๊ณผ ๋ฌ๋ฆฌ ์ ์ธ๊ณผ ํธ์ถ ์์์ ๋ฐ๋ผ์ ์ ์์ ์ผ๋ก ํจ์๊ฐ ์คํ๋์ง ์์ ์ ์์.
- ํจ์ ํํ์์์๋ ์ ์ธ๊ณผ ํ ๋น์ ๋ถ๋ฆฌ๊ฐ ์๊ธด๋ค.
/* ์ค๋ฅ */
function printName(firstname) { // ํจ์์ ์ธ๋ฌธ
console.log(inner); // > "undefined": ์ ์ธ์ ๋์ด ์์ง๋ง ๊ฐ์ด ํ ๋น๋์ด์์ง ์์ ๊ฒฝ์ฐ
var result = inner(); // ERROR!!
console.log("name is " + result);
var inner = function() { // ํจ์ํํ์
return "inner value";
}
}
printName(); // > TypeError: inner is not a function
ํธ์ด์คํ ์ ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์์ ์๋ก ๋ค๋ฅด๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ค. ๋ณ์์ ํ ๋น๋ ํจ์ ํํ์์ ๋์ด ์ฌ๋ ค์ง์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋๋ ๋ณ์์ ์ค์ฝํ ๊ท์น์ ๊ทธ๋๋ก ๋ฐ๋ฅธ๋ค.
Q. printName์์ “inner is not defined” ์ด๋ผ๊ณ ์ค๋ฅ๊ฐ ๋์ค์ง ์๊ณ , “inner is not a function”์ด๋ผ๋ TypeError๊ฐ ๋์ค๋ ์ด์ ?
A. printName์ด ์คํ๋๋ ์๊ฐ (Hoisting์ ์ํด) inner๋ ‘undefined’์ผ๋ก ์ง์ ๋๊ธฐ ๋๋ฌธ
inner๊ฐ undefined๋ผ๋ ๊ฒ์ ์ฆ, ์์ง์ ํจ์๋ก ์ธ์์ด ๋์ง ์๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธ
ํจ์ ํํ์์ ์ ์ธ์ด ํธ์ถ๋ณด๋ค ์๋์ ์๋ ๊ฒฝ์ฐ
/* ์ค๋ฅ */
function printName(firstname) { // ํจ์์ ์ธ๋ฌธ
console.log(inner); // ERROR!!
let result = inner();
console.log("name is " + result);
let inner = function() { // ํจ์ํํ์
return "inner value";
}
}
printName(); // > ReferenceError: inner is not defined
console.log(inner);์์ inner์ ๋ํ ์ ์ธ์ด ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ inner is not defined ์ค๋ฅ๊ฐ ๋ฐ์
ํธ์ด์คํ ์ฌ์ฉ์ ์ฃผ์ํ ์
์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์๋ฅผ ์ํด ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋๋ก ํด์ผํจ.
- ํธ์ด์คํ
์ ์ ๋๋ก ๋ชจ๋ฅด๋๋ผ๋ ํจ์์ ๋ณ์๋ฅผ ๊ฐ๊ธ์ ์ฝ๋ ์๋จ๋ถ์์ ์ ์ธํ๋ฉด, ํธ์ด์คํ
์ผ๋ก ์ธํ ์ค์ฝํ ๊ผฌ์ ํ์์ ๋ฐฉ์งํ ์ ์๋ค.
var๋ฅผ ์ฐ๋ฉด ํผ๋์ค๋ฝ๊ณ ์ธ๋ชจ์๋ ์ฝ๋๊ฐ ์๊ธธ ์ ์๋ค. ๊ทธ๋ผ ์ var์ ํธ์ด์คํ ์ ์ดํดํด์ผ ํ ๊น? - ES6๋ฅผ ์ด๋์๋ ์ธ ์ ์์ผ๋ ค๋ฉด ์์ง ์๊ฐ์ด ๋ ํ์ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ES5๋ก ํธ๋์ค ์ปคํ์ผ์ ํด์ผํ๋ค.
์์ ์ด์ ๋ก ์์ง์ var๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๊ณ ์์ด์ผ ํ๋ค.
์ค์ฝํ
- ์ค์ฝํ(scope)๋ ์๋ณ์(ex. ๋ณ์๋ช , ํจ์๋ช , ํด๋์ค๋ช ๋ฑ)์ ์ ํจ๋ฒ์๋ฅผ ๋ปํ๋ฉฐ, ์ ์ธ๋ ์์น์ ๋ฐ๋ผ ์ ํจ ๋ฒ์๊ฐ ๋ฌ๋ผ์ง๋ค. ์ ์ญ์ ์ ์ธ๋ ๋ณ์๋ ์ ์ญ ์ค์ฝํ๋ฅผ, ์ง์ญ์ ์ ์ธ๋ ๋ณ์๋ ์ง์ญ ์ค์ฝํ๋ฅผ ๊ฐ๋๋ค.
- ์ ์ญ ๋ณ์๋ ์ด๋์์๋ ์ง ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ ๊ฐ์ด๋ค. ๋ฐ๋ฉด, ์ง์ญ ๋ณ์๋ ํจ์ ๋ชธ์ฒด ๋ด๋ถ๋ฅผ ๋งํ๋ค. ๋ฐ๋ผ์ ์ง์ญ ๋ณ์๋ ์์ ์ ์ง์ญ ์ค์ฝํ์ ๊ทธ ํ์ ์ง์ญ ์ค์ฝํ์์ ์ ํจํ๋ค.
- ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ์ฝ๋ ๋ธ๋ก(if, for, while, try/catch ๋ฑ)์ด ์ง์ญ ์ค์ฝํ๋ฅผ ๋ง๋ค๋ฉฐ, ์ด๋ฌํ ํน์ฑ์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ผ ํ๋ค. ํ์ง๋ง var ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ์ค๋ก์ง ํจ์์ ์ฝ๋ ๋ธ๋ก๋ง์ ์ง์ญ ์ค์ฝํ๋ก ์ธ์ ํ๋ค. ์ด๋ฅผ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ผ ํ๋ค.
var a = 1
if (true) {
var a = 5
}
console.log(a) // output: 5
ํจ์๊ฐ ์๋ ๊ณณ์์ var ํค์๋๋ฅผ ์ด์ฉํด a๋ฅผ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ ์ญ ๋ณ์๋ก ์ทจ๊ธํ๋ค. ๊ธฐ์กด์ ์๋ a ๋ณ์๊ฐ ์ค๋ณต ์ ์ธ๋๋ฉด์, ์ตํ๋จ์ console์์๋ ์ถ๋ ฅ ๊ฐ์ด 5๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํด๋น ์์ ๋ ์ฝ๋๊ฐ ์งง์์ ์ด๋์์ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ง ๋ฐ๋ก ์ ์ ์์์ง๋ง, ์ค๋ฌด์์๋ ๊ทธ๋ ์ง ์๋ค. ์ ์ญ ๋ณ์๋ก ์ธํด ์ฌํ ๋น์ด ๋ฐ์ํ๊ฑฐ๋, ์ ์ญ ์ค์ฝํ๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋๊ฐ์ ๋์ผํ ์ด๋ฆ์ด ์๋ค๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ์ํ์ด ์๋ค. ๋ฐ๋ผ์ ์ค๋ก์ง ํจ์ ์ฝ๋ ๋ธ๋ก๋ง์ ์ง์ญ ์ค์ฝํ๋ก ์ธ์ ํ๋ var ๋์ , ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ง์ํ๋ const์ let์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
์ค์ฝํ ์ฒด์ธ
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ์ญ ๋ณ์๋ ์ ์ญ ๊ฐ์ฒด์ ํ๋กํผํฐ์ด๋ค. (ECMAScript ๋ช ์ธ์ ์ ์๋์ด ์์)
์ง์ญ ๋ณ์๋ ๊ทธ๋ฐ ๊ท์ ์ด ์์ง๋ง, ๋ณ์๋ฅผ ๊ฐ ํจ์ ํธ์ถ๊ณผ ์ฐ๊ด๋ ๊ฐ์ฒด(call object)์ ํ๋กํผํฐ๋ก ์๊ฐํ ์ ์๋ค.
์ง์ญ ๋ณ์๋ฅผ ์ด๋ค ๊ฐ์ฒด์ ํ๋กํผํฐ๋ก ์๊ฐํ๋ค๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์ฝ๋๋ ์ค์ฝํ ์ฒด์ธ์ ๊ฐ๊ณ ์๋ค. ์ค์ฝํ ์ฒด์ธ์ ํด๋น ์ฝ๋์ ์ ํจ ๋ฒ์(in scope) ์์ ์๋ ๋ณ์๋ฅผ ์ ์ํ๋ ๊ฐ์ฒด์ ์ฒด์ธ, ๋ฆฌ์คํธ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ณ์ ๊ฐ์ ์ป์ผ๋ ค๊ณ ํ ๋(variable resolution, ๋ณ์ ํด์) ์ค์ฝํ ์ฒด์ธ์์ ๋ณ์๋ฅผ ์ฐพ๋๋ค. ์ค์ฝํ ์ฒด์ธ์ ์์์ ๋งํ๋ค์ํผ ๊ฐ์ฒด์ ๋ฆฌ์คํธ์ด๋ฏ๋ก, ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด์์ ํด๋น ๋ณ์๋ฅผ ์ฐพ๊ณ , ์์ผ๋ฉด ๊ทธ ๋ค์ ๊ฐ์ฒด์์ ํด๋น ๋ณ์๋ฅผ ์ฐพ๊ณ , ์ฌ๊ธฐ๋ ์์ผ๋ฉด ๊ทธ ๋ค์ ๊ฐ์ฒด์์ ์ฐพ๋ ์์ด๋ค. ๋ฆฌ์คํธ์ ๋๊น์ง ํ์ํ๋๋ฐ๋ ๊ทธ ๋ณ์๊ฐ ์๋ค๋ฉด reference error๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ต์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(์ด๋ ํ ํจ์์๋ ์ํ์ง ์๋ ์ฝ๋)์ ์ค์ฝํ ์ฒด์ธ์๋ ํ๋์ ๊ฐ์ฒด๋ง ์๊ณ , ๊ทธ๊ฒ์ด ์ ์ญ ๊ฐ์ฒด์ด๋ค. ์ค์ฒฉ๋์ง ์์ ํจ์์ ์ค์ฝํ ์ฒด์ธ์ 2๊ฐ์ ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ง๋ค. ํ๋๋ ํจ์์ ๋งค๊ฐ๋ณ์์ ์ง์ญ ๋ณ์๋ฅผ ์ ์ํ๋ ๊ฐ์ฒด๊ณ , ๋ค๋ฅธ ํ๋๋ ์ ์ญ ๊ฐ์ฒด๋ค.
ํจ์๊ฐ ์ ์๋ ๋, ํจ์๋ ์ค์ฝํ ์ฒด์ธ์ ์ ์ฅํ๋ค.
ํจ์๊ฐ ํธ์ถ๋ ๋, ํจ์๋ ์ง์ญ ๋ณ์๋ฅผ ๋ณด๊ดํ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ธฐ์กด์ ๋ง๋ค์ด๋ ์ค์ฝํ ์ฒด์ธ์ ์ถ๊ฐํ๋ค.
๋ณ์ ์๋ํ
(function () {
var a = 'a';
})();
console.log(a); // a is not defined
ํจ์ ์ธ๋ถ์์ a๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด, ์์ง ์ ์๋์ง ์์๋ค(a is not defined)๋ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๋ฌํ ๋ฐฉ์๊ณผ ๊ฐ์ด ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด ์ ๋๋ ๋ณ์์ ๋ํ ์ ๊ทผ์ ๋ง๋ ๊ฒ์ ์๋ํ๋ผ๊ณ ํ๋ค.
์ด๋ฌํ ์๋ํ๊ณผ์ ์ ํด๋ก์ ๋ฅผ ํตํด ์์ธํ ์์๋ณด๋๋ก ํ์.
ํด๋ก์ ๋ฅผ ํตํ ์๋ํ
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก prototype๋ฅผ ์ฌ์ฉํ๋๋ฐ ๊ฐ์ฒด ์์์ ์ฌ์ฉํ ์์ฑ์ ์์ฑํ ๋ this ํค์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
ํ์ง๋ง ์ด๋ฌํ Prototype์ ํตํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋์ ์ฃผ์ํ ๋ฌธ์ ๊ฐ ํ๋ ์์ต๋๋ค. ๋ฐ๋ก Private variables์ ๋ํ ์ ๊ทผ ๊ถํ ๋ฌธ์ ์ด๋ค.
์๋ ์ฝ๋๋ฅผ ์์๋ก ๋ณด๋๋ก ํ์.
function Hello(name) {
this._name = name;
}
Hello.prototype.say = function() {
console.log('Hello, ' + this._name);
}
let a = new Hello('์์');
let b = new Hello('์๋ฆ');
a.say() //Hello, ์์
b.say() //Hello, ์๋ฆ
a._name = 'anonymous'
a.say() // Hello, anonymous
ํ์ฌ Hello() ํจ์๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด๋ค์ ๋ชจ๋ _name์ด๋ผ๋ ๋ณ์๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ๋ณ์๋ช ์์ underscore(_)๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ JavaScript ๋ค์ด๋ฐ ์ปจ๋ฒค์ ์ ์๊ฐํด ๋ดค์๋ ์ด ๋ณ์๋ Private variable์ผ๋ก ์ฐ๊ณ ์ถ๋ค๋ ์๋๋ฅผ ์ ์ ์๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ ์ฌ์ ํ ์ธ๋ถ์์๋ ์ฝ๊ฒ ์ ๊ทผ๊ฐ๋ฅํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด ๊ฒฝ์ฐ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์์ ์ง์ ์ ์ผ๋ก ๋ณ์์ ์ ๊ทผํ ์ ์๋๋ก ์บก์ํ(์๋ํ)ํ ์ ์๋ค.
function hello(name) {
let _name = name;
return function () {
console.log('Hello, ' + _name);
};
}
let a = new hello('์์');
let b = new hello('์๋ฆ');
a() //Hello, ์์
b() //Hello, ์๋ฆ
์ด๋ ๊ฒ a์ b๋ผ๋ ํด๋ก์ ๋ฅผ ์์ฑํจ์ผ๋ก์จ ํจ์ ๋ด๋ถ์ ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ค ์ ์๋ค.
์ด๋ฒ์๋ ์กฐ๊ธ ๋ ๊ฐ๋จํ ์์ ๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
function a(){
let temp = 'a'
return temp;
}
// console.log(temp) error: temp is not defined
const result = a()
console.log(result); //a
ํ์ฌ ์ ํจ์ ๋ด๋ถ์ ์ผ๋ก ์ ์ธ๋ temp์๋ ์ง์ ์ ์ผ๋ก ์ ๊ทผ์ ํ ์ ์๋ค. ํจ์ a๋ฅผ ์คํ์์ผ ๊ทธ ๊ฐ์ result๋ผ๋ ๋ณ์์ ๋ด์ ํด๋ก์ ๋ฅผ ์์ฑํจ์ผ๋ก์จ temp์ ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ๊ฒ ํจ์ ์์ ๊ฐ์ ์จ๊ธฐ๊ณ ์ถ์ ๊ฒฝ์ฐ ํด๋ก์ ๋ฅผ ํ์ฉํด๋ณผ ์ ์๋ค.
Temporal Dead Zone(TDZ)
Temporal Dead Zone(TDZ)์ด๋?
์ ์ธ ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋น ํ์ฉํ๋ ๊ฐ๋
์์ ๊ณต๊ฐ์ด๋ค.
const ๋ณ์ ์ ์ธ ๋ถํฐ ์์ํด๋ณด์. ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ด๊ธฐํ ํ๋ฉด ๋ณ์์ ์ ๊ทผ ํ ์ ์๋ค.
const white = '#FFFFFF';
white; // => '#FFFFFF'
์ด๋ฒ์๋ ์ ์ธ ์ ์ white ๋ณ์์ ์ ๊ทผ
white; // throws `ReferenceError`
const white = '#FFFFFF';
white; // => '#FFFFFF'
const white ='#FFFFFF' ๊ตฌ๋ฌธ ์ ์ค ๊น์ง, white ๋ณ์๋ TDZ์ ์๋ค.
TDZ์ ์๋ white ๋ณ์์ ์ ๊ทผํ๊ฒ ๋๋ฉด, ReferenceError: Cannot access 'white' before initialization ์๋ฐ์คํฌ๋ฆฝํธ ์๋ฌ๊ฐ ๋ฐ์
TDZ์ ์ํฅ์ ๋ฐ๋ ๊ตฌ๋ฌธ
ํ์ฌ ์ค์ฝํ ์์์ TDZ ๋์
TDZ๋ ์ ์ธ๋ฌธ์ด ์กด์ฌํ๋ ์ค์ฝํ ๋ฒ์ ์์์ ๋ณ์์ ์ํฅ์ ์ค๋ค.
let, const, var, function ์๋ฆฌ
[ var ]
es6 ์ด์ ์ ๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ var๋ฅผ ์ด์ฉํ์ฌ ๋ณ์๋ฅผ ์ ์ธํ์๋ค.
โ
var์ ๊ฒฝ์ฐ์ function ๋จ์์ scope๋ฅผ ๊ฐ์ง๋ค. ์ด๋ ํจ์์์์๋ง ์ ์ธ ๋ ๊ฒฝ์ฐ์ scope๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์๋ฏธํ๋ค.
if๋ for๋ฌธ์์์ var๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ ํด๋น ๋ณ์๋ scope๋ฅผ if๋ for๊ฐ ์๋ ์์์ ํจ์(์์ผ๋ฉด ์ ์ญ)๋ฅผ scope๋ก ๊ฐ์ง๊ฒ ๋๋ค.
function func() { var a = 1; // func scope } console.log(a) // error for(var i =0; i<10;i++) { var b = 2; // ์ ์ญ scope } console.log(b) // 2
b๊ฐ scope๊ฐ ์ ์ญ์ผ๋ก ์ค์ ์ด ๋๋ฉด์ ๋ค์๊ณผ ๊ฐ์ด ์ด์ํ ์ฝ๋๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
โ
function scope์ ํธ์ด์คํ ๊ฐ๋ ์ด ๋ง๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฆฌ๋ก ๋์๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.(์ค์ ๋ก ์ด๋ ๊ฒ ๋์ํ์ง ์๋๋ค.
var b; function func() { var a; a = 1; } console.log(a) // error for(var i =0; i<10;i++) { b = 2; } console.log(b) // 2
โ
[ let, const ]
let๊ณผ const๋ es6 ์ดํ์ ์ ์ธ ๋์๋ค.
์์ ์ฒ๋ผ ์ด์ํ ์ฝ๋๊ฐ ์ค์ ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ์ ์ฅ์์๋ ํท๊ฐ๋ฆด ๋งํ ์์๊ฐ ๋ง์ block scope๋ก ์ค์ ๋์๋ค.
block scope๋ ์ค๊ดํธ ๋จ์๋ก ์ค์ฝํ๊ฐ ์ค์ ๋๋ ๊ฒ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค.
๊ทธ๋ก์ธํด for๋ฌธ๊ณผ if๋ฌธ์์์ ์ ์ธํ ๊ฒฝ์ฐ์๋ if๋ฌธ๊ณผ for๋ฌธ ์์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ ๋ณ์๋ก ์ค์ ์ด ๋๋ค.
โ
const b = 1; for(var i =0; i<10; i++) { coonsole.log(b) // error const b = 2; }const b = 1; for(var i =0; i<10; i++) { coonsole.log(b) // error const b = 2; }
[ let, const๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋์? ]
์ด๋ ๊ฒ ๋ณด๋ฉด, const, let ์์ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
ํ์ง๋ง ํธ์ด์คํ ์ด๋ ๊ฐ๋ ์ ๊ฒฐ๊ตญ ์คํ์ปจํ ์คํธ๋ก ์ธํด ๋ฐ์ํ๋ ๊ฒ์์ผ๋ก const, let, var ๋ชจ๋ ํธ์ด์คํ ์ด ๋ฐ์ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๊ฑธ๊น?
์ด๋ const์ let์ ๊ฐ ํ ๋น ์์ ์ด var์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
โ
์ผ๋ฐ์ ์ผ๋ก ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ด ์คํ๋๋ค.
๋ณ์ ์ ์ธ > ๋ณ์ ์ด๊ธฐํ > ๋ณ์ ๊ฐ ํ ๋น
โ
var ์ ๊ฒฝ์ฐ๋ ๋ณ์์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์ ์ผ์ด๋๋ค.
์ด๋ง์ธ ์ฆ ๋ณ์๊ฐ ์ด๊ธฐํ๊ฐ ๋๋๋ฐ ํ ๋น์ด ๋๊ธฐ ์ด์ ์ ์ํ๋ก undefiend์ํ๋ก ์กด์ฌํ๊ฒ ๋๋ค.
โ
๊ทธ๋ฌ๋ let๊ณผ const๋ ๋ณ์์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์ ์ผ์ด๋์ง ์๋๋ค.
๋ณ์์ ์ ์ธ๋ง ์ธ์ ๋์ด ์คํ ์ปจํ์คํธ์๋ ๋ด๊ธฐ๊ฒ ๋๋ (ํธ์ด์คํ ์ด ์ผ์ด๋๋ค.) ์ด๊ธฐํ๊ฐ ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ ๋๊ธฐ ์ด์ ์ console ๋ก ์คํ์ํค๊ฒ ๋๋ฉด error๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
โ
[ ๊ฒฐ๋ก ]
var
- function scope
- ํธ์ด์คํ ์ด ์ผ์ด๋๋ค
- ๋ณ์์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์ ์งํ
โ
let, const
- pblock scope
- ํธ์ด์คํ ์ด ์ผ์ด๋๋ค
- ๋ณ์์ ์ ์ธ๋ง ์ผ์ด๋๋ค. ๋ณ์์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์ ์ผ์ด๋์ง ์๋๋ค.
์คํ ์ปจํ ์คํธ์ ์ฝ ์คํ
[ ํจ์ ์คํ์ ๋ํ ์ดํด ]
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋์ ์ค๋ ๋๋ก ๋จ 1๊ฐ์ ๋์์ฑ๋ง ๋ค๋ฃจ๋ ์ธ์ด
- ํ๋ฒ์ 1๊ฐ์ ์์ ๋ง ๋ค๋ฃฐ ์ ์๋ค.
- JS์ Heap Queue Stack => ํฌ๋กฌ์ V8 ๋ด๋ถ์ ๊ตฌํ๋์ด ์๋ค.
โ
- ์ฝ์คํ CallStack
- ํจ์์ ํธ์ถ์ ๊ธฐ๋กํ๋ ์๋ฃ๊ตฌ์กฐ
- ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ ์์์ ์์นํ ๊ณณ
- ํจ์ ์คํ ์ ์คํ์ push ๋๋ค.
- ํจ์๋ก๋ถํฐ ๋ฐํ ๋ฐ์ ๋, ์คํ์์ pop๋๋ค.
โ
2. ํ Heap
- ์ค๋ธ์ ํธ(๊ฐ์ฒด)๋ค์ ํ ๋ด๋ถ์ ํ ๋น
- ๊ฑฐ์ ๊ตฌ์กฐํ๋์ง ์์ ์์ญ(unsteuctured)์ ๋ฉ๋ชจ๋ฆฌ
- ๋ณ์์ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ฌ๊ธฐ์ ์ผ์ด๋จ
โ
3. ํ Queue
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์ ๋ฉ์์ง ํ๋ฅผ ๊ฐ๊ณ ์๋ค.
- ๋ฉ์ธ์ง ํ
- ์คํ๋ ์ฝ๋ฐฑํจ์๋ ์คํ๋ ๋ฉ์ธ์ง๋ค์ ๋ํ ๋ฆฌ์คํธ
- ์คํ์ด ์ถฉ๋ถํ ๊ณต๊ฐ(capacity)๋ฅผ ๊ฐ๊ณ ์์ ๋, ๋ฉ์ธ์ง๋ ํ ๋ฐ์ผ๋ก ๋์ค๊ณ ๋ฉ์ธ์ง๊ฐ ๊ฐ์ง๊ณ ์๋ ํจ์ ๋ชฉ๋ก๋ค์ด ์คํ๋๋ค. -> ์ด๊ธฐ ์คํ ํ๋ ์
- ์คํ์ด ๋ค์ ๋น ๋ ๋ฉ์ธ์ง ์ํ๋ ๋๋๋ค.
- ์ด๋ฒคํธ๋ค์ ๋ํ ์ฝ๋ฐฑ ํจ์๊ฐ ์ ๊ณต๋์๋ค๋ฉด ๋ฉ์ธ์ง๋ค์ ์ธ๋ถ ๋น๋๊ธฐ ์ด๋ฒคํธ๋ค์ ๋ํ ์๋ต์ผ๋ก ํ์ ์์ธ๋ค.
- ์ธ๋ถ ๋น๋๊ธฐ ์ด๋ฒคํธ๋ค์ด๋ ๋ง์ฐ์ค ํด๋ฆญ, HTTP์์ฒญ ๋ฑ์ ๋งํฉ๋๋ค. ํ์ง๋ง ๋ง์ผ ํ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ ๋๋ฐ ์๋ฌด๋ฐ ์ฝ๋ฐฑํจ์๋ ๋ฑ๋ก๋์ด ์์ง ์๋ค๋ฉด ์ด๋ ํ ๋ฉ์์ง๋ ํ์ ๋ค์ด๊ฐ์ง ์์ ๊ฒ์ ๋๋ค.
- ๋ฉ์์ง๋ค์ ์น ๋ธ๋ผ์ฐ์ ์์ ์ธ์ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ถ๊ฐ ๋๋ค.
โ
โ
[ ์คํ ์ปจํ ์คํธ ]
- ์คํ ์ปจํ ์คํธ๋ scope, hoistiong, this, function, closure ๋ฑ์ ๋์์๋ฆฌ๋ฅผ ๋ด๊ณ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ์๋ฆฌ์ด๋ค.
- ESMAScript ์คํ์ ๋ฐ๋ฅด๋ฉด ์คํ ์ปจํ ์คํธ๋ฅผ ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ํ์ฑํํ๊ณ ๊ตฌ๋ถํ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ด๋ผ๊ณ ์ ์ํ๋ค.์ข ๋ ์ฝ๊ฒ ๋งํ์๋ฉด ์คํ ์ปจํ ์คํธ๋ ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ํด ํ์ํ ํ๊ฒฝ ์ด๋ผ๊ณ ๋งํ ์ ์๊ฒ ๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
- ์ ์ญ ์ฝ๋ : ์ ์ญ ์์ญ์ ์กด์ฌํ๋ ์ฝ๋
- Eval ์ฝ๋ : eval ํจ์๋ก ์คํ๋๋ ์ฝ๋
- ํจ์ ์ฝ๋ : ํจ์ ๋ด์ ์กด์ฌํ๋ ์ฝ๋
- ์ผ๋ฐ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ ์ ์ญ ์ฝ๋์ ํจ์ ๋ด ์ฝ๋์ด๋ค.
eval ํจ์ :
eval()์ ์ ์ญ ๊ฐ์ฒด์ ํจ์ ์์ฑ์ ๋๋ค.
eval()์ ์ธ์๋ ๋ฌธ์์ด์ ๋๋ค. ์ธ์๊ฐ ํํ์์ ๋ํ๋ธ๋ค๋ฉด eval()์ ํํ์์ ํ๊ฐํฉ๋๋ค. ์ธ์๊ฐ ํ๋ ์ด์์ JavaScript ๋ช ๋ น๋ฌธ์ ๋ํ๋ธ๋ค๋ฉด ๋ชจ๋ ์คํํฉ๋๋ค. ์ฐ์ฐ์์ ๊ณ์ฐํ๊ธฐ ์ํด eval()์ ํธ์ถํ์ง ๋ง์ธ์. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฐ์ฐ์์ ์์์ ๊ณ์ฐํฉ๋๋ค.
โ
โ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ์ฌ ์คํ์ ํ์ํ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค. ์คํ์ ํ์ํ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- ๋ณ์ : ์ ์ญ๋ณ์, ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ๊ฐ์ฒด์ ํ๋กํผํฐ
- ํจ์ ์ ์ธ
- ๋ณ์์ ์ ํจ๋ฒ์(Scope)
- this
์ด์ ๊ฐ์ด ์คํ์ ํ์ํ ์ ๋ณด๋ฅผ ํ์ํํ๊ณ ๊ตฌ๋ถํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ฌผ๋ฆฌ์ ๊ฐ์ฒด์ ํํ๋ก ๊ด๋ฆฌํ๋ค.
- ์ปจํธ๋กค์ด ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ก ์ด๋ํ๋ฉด ๋ ผ๋ฆฌ์ ์คํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ์๋ก์ด ์คํ ์ปจํ ์คํธ ์คํ์ด ์์ฑ๋๋ค. ์คํ์ LIFO(Last In First Out, ํ์ ์ ์ถ)์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ๋์ด ๊ตฌ์กฐ์ด๋ค.
- ์ ์ญ ์ฝ๋(Global code)๋ก ์ปจํธ๋กค์ด ์ง์ ํ๋ฉด ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ์คํ ์ปจํ ์คํธ ์คํ์ ์์ธ๋ค. ์ ์ญ ์คํ ์ปจํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋ ๋(์น ํ์ด์ง์์ ๋๊ฐ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์ ๋)๊น์ง ์ ์ง๋๋ค.
- ํจ์๋ฅผ ํธ์ถํ๋ฉด ํด๋น ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ฉฐ ์ง์ ์ ์คํ๋ ์ฝ๋ ๋ธ๋ก์ ์คํ ์ปจํ ์คํธ ์์ ์์ธ๋ค.
- ํจ์ ์คํ์ด ๋๋๋ฉด ํด๋น ํจ์์ ์คํ ์ปจํ ์คํธ๋ฅผ ํ๊ธฐํ๊ณ ์ง์ ์ ์คํ ์ปจํ ์คํธ์ ์ปจํธ๋กค์ ๋ฐํํ๋ค.
๋๋์
- ๋๋ฆ js๋ฅผ ์จ๋ดค๋ค๊ณ ์๊ฐํ๋๋ฐ ๋์์๋ฆฌ๋ ์ธ๋ถ์ ์ธ ์ค๋ฅ ๊ณผ์ ์ ์๊ฐํด๋ณธ์ ์ด ์์๋ค.
- js๋ฅผ ์ฐ๋ฉด์ ์ด๋ ํ ๋ถ๋ถ์์ ์ค๋ฅ๊ฐ ์๊ธฐ๋์ง ์กฐ๊ธ์ ๋ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๊ฒ ๋๋ค.
[์ถ์ฒ] ํธ์ด์คํ ๊ณผ TDZ๋ ๋ฌด์์ผ๊น ?|์์ฑ์ ์๋ฅ์ด
'์๊ฐ > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํผ๊ณต์ค ํผ๋ผ๋ฏธ๋ , ์ค๋ (1) | 2022.09.24 |
---|---|
์๊ณ ๋ฆฌ์ฆ ์ฐ์ต 21-28๋ฒ (1) | 2022.09.24 |
์๊ณ ๋ฆฌ์ฆ ์ฐ์ต 11-20๋ฒ (1) | 2022.09.24 |
์๊ณ ๋ฆฌ์ฆ ์ฐ์ต 1-10๋ฒ (1) | 2022.09.24 |
reduceํจ์ (0) | 2022.09.24 |