Javascript์ ์๋ฃํ๊ณผ Javascript๋ง์ ํน์ฑ
๐JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ
๐ฏ๋์จํ ํ์ (loosley typed)์ ๋์ (dynamic) ์ธ์ด
JavaScript๋ ๋์จํ ํ์
(loosely typed)์ ๋์ (dynamic) ์ธ์ด์
๋๋ค.
JavaScript์ ๋ณ์๋ ์ด๋ค ํน์ ํ์
๊ณผ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ,
๋ชจ๋ ํ์
์ ๊ฐ์ผ๋ก ํ ๋น ๋ฐ ์ฌํ ๋น ๊ฐ๋ฅํฉ๋๋ค.
๐ฏJavascript ํ๋ณํ
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์
์ด ๋งค์ฐ ์ ์ฐํ ์ธ์ด์ด๋ค.
๋๋ฌธ์ ๋๋ก๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์์ ๋ฐ๋ผ ‘์์์ ๋ณํ’ ์ ํน์ ๊ฐ๋ฐ์์ ์๋์ ๋ฐ๋ผ ‘๋ช
์์ ๋ณํ’ ์ ์คํํ๋ค.
์์์ ๋ณํ
์์์ ๋ณํ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ฐ์ดํฐํ์
์ ๋ณํ์ํค๋ ๊ฒ์ด๋ค.
๋ช
์์ ๋ณํ
๋ช
์์ ๋ณํ์ด๋ ๊ฐ๋ฐ์๊ฐ ์๋๋ฅผ ๊ฐ์ง๊ณ ๋ฐ์ดํฐํ์
์ ๋ณํ์ํค๋ ๊ฒ์ด๋ค.
๐ฏ'=='์ '==='์ ์ฐจ์ด์
์๋ฐ์คํฌ๋ฆฝํธ๋ ์๊ฒฉํ ๋น๊ต์ ์ ํ๋ณํ ๋น๊ต๋ฅผ ๋ชจ๋ ์ง์ํ๋ฏ๋ก, ์ด๋ค ์ฐ์ฐ์๊ฐ ์ด๋ค ๋น๊ต์กฐ๊ฑด์ ์ฌ์ฉ๋๋์ง๊ฐ ์ค์ํ๋ค.
์์ ๋งํ๋ฏ์ด, ===๋ ๋ณ์ ์ ํ์ ๊ณ ๋ คํ๋ ๋ฐ๋ฉด, ==๋ ๋ณ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํ์ ์์ ํ๋ค.
๐ฏ๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด์ ๋ฌธ์ ์ ์ ๋ฌด์์ด๊ณ ๋ณด์ํ ์ ์๋ ๋ฐฉ๋ฒ
์คํ ๋์ค์ ๋ณ์์ ์์์น ๋ชปํ ํ์
์ด ๋ค์ด์ ํ์
์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์
๋์ ํ์
์ธ์ด๋ ๋ฐํ์ ์ ํ์ธํ ์ ๋ฐ์ ์๊ธฐ ๋๋ฌธ์, ์ฝ๋๊ฐ ๊ธธ๊ณ ๋ณต์กํด์ง ๊ฒฝ์ฐ ํ์
์๋ฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์ ์ง๋๋ค.
์ด๋ฌํ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํด TypeScipt๋ Flow ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ฏundefined์ null์ ๋ฏธ์ธํ ์ฐจ์ด๋ค์ ๋น๊ตํด๋ณด์ธ์.
undefined์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ ํ ๋นํ์ง ์์ ์ํ, null์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ๋น ๊ฐ์ ํ ๋นํ ์ํ(๋น ๊ฐ์ฒด)์ด๋ค. ์ฆ, undefined๋ ์๋ฃํ์ด ์๋ ์ํ์ด๋ค.
๐JavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด๋?
๐ฏ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ
๐๊ธฐ๋ณธํ ํ์ (Primitive type)
์ข ๋ฅ: ๋ ผ๋ฆฌํ(boolean), ์ ์ํ(int), ์ค์ํ(double), ๋ฌธ์ํ(char)
๐์ฐธ์กฐํ ํ์ (Reference type)
์ข ๋ฅ: ๋ฐฐ์ด(Array), ํด๋์ค(Class), ์ธํฐํ์ด์ค(Interface)
๐ฏ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
'๋ถ๋ณ ๊ฐ์ฒด'๋ - '๋ณํ์ง ์๋ ๊ฐ์ฒด' ์ฆ ์ด๋ฏธ ํ ๋น๋ ๊ฐ์ฒด๊ฐ ๋ณํ์ง ์๋๋ค๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค.
// Object freeze แแ
ขแจแแ
ฆแ
แ
ณแฏ แแ
ฎแฏ๋ณแแ
กแแ
ฆ แแ
กแซแแ
ณแฏแแ
ต
let test = {
name : 'kim'
}
Object.freeze(test);
test.name = 'Jung';
console.log(test)
๐ฏ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ
๐์์ ๋ณต์ฌ(Shallow Copy)
๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋, ํด๋น ๊ฐ์ฒด๋ง ๋ณต์ฌํ์ฌ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
๋ณต์ฌ๋ ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์๋ ์๋ณธ ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ค.
๋ฐ๋ผ์, ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์๋ณธ ๊ฐ์ฒด ๋ฐ ๋ณต์ฌ ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์ ๊ฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
๐๊น์ ๋ณต์ฌ(Deep Copy)
๊ฐ์ฒด๋ฅผ ๋ณต์ฌ ํ ๋, ํด๋น ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์๊น์ง ๋ณต์ฌํ๋ ๋ฐฉ์.
์ ๋ถ๋ฅผ ๋ณต์ฌํ์ฌ ์ ์ฃผ์์ ๋ด๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ์ง ์๋๋ค.
๐ํธ์ด์คํ
๊ณผ TDZ๋ ๋ฌด์์ผ๊น?
๋ณ์, ํธ์ด์คํ
, TDZ(Temporal Dead Zone)
๐ฏ์ค์ฝํ, ํธ์ด์คํ
, TDZ
๐์ค์ฝํ: ๋ณ์, ํจ์, ํด๋์ค๊ฐ ์ ๊ทผํ ์ ์๋ ์ ํจ ๋ฒ์.
๐ํธ์ด์คํ
: ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ณ์์ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ธ ์ ์ ๋ฏธ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๐TDZ: ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ค๋ช
ํฉ๋๋ค.(์ฃผ์ ์ฐธ๊ณ !)๐๐
let age = 30;
function showAge() {
console.log(age) //์ฌ๊ธฐ์ ์์ age์ ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
}
showAge();
์์ ์ฝ๋์์ let age = 20;๋ฅผ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
let age = 30;
function showAge() {
console.log(age) //2) TDZ ์์ญ์ด ๋์ด์ ReferenceError ์๋ฌ๋ฅผ ๋ณผ์ ์์ต๋๋ค.
let age = 20; //1) ์ด๊ฒ์ ์ถ๊ฐํ๋ฉด
}
showAge();
๐ฏํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์์ ํธ์ด์คํ
๋ฐฉ์์ ์ฐจ์ด
ํจ์ ์ ์ธ์ (function declartion) ํจ์๋ช
์ด ์ ์๋์ด ์๊ณ , ๋ณ๋์ ํ ๋น ๋ช
๋ น์ด ์๋ ๊ฒํจ์ ์ ์ฒด๋ฅผ ํธ์ด์คํ
ํฉ๋๋ค. ์ ์๋ ๋ฒ์์ ๋งจ ์๋ก ํธ์ด์คํ
๋์ ํจ์
function sum(a,b) {
return a + b;
}
ํจ์ ํํ์ (function Expression)์ ์ํ function์ ๋ณ๋์ ๋ณ์์ ํ ๋นํ๋ ๊ฒ๋ณ๋์ ๋ณ์์ ํ ๋นํ๊ฒ ๋๋๋ฐ, ๋ณ์๋ ์ ์ธ๋ถ์ ํ ๋น๋ถ๋ฅผ ๋๋์ด ํธ์ด์คํ
ํ๊ฒ ๋ฉ๋๋ค.
const sum = function(a,b) {
return a + b;
}
ํจ์ ์ ์ธ์์ผ๋ก ์์ฑํ ํจ์๋, ํจ์ ์ ์ฒด๊ฐ ํธ์ด์คํ
๋๋ค๊ณ ํ์๋๋ฐ, ์ ์ญ์ ์ผ๋ก ์ ์ธํ๊ฒ ๋๋ฉด, ์ค๋ณต์ ์ผ๋ก ๋๋ช
์ ํจ์๋ฅผ ์ฐ๊ฒ ๋์์๋, ์์น ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํจ์ ํํ์์ผ๋ก ์์ฑํ๋ฉด ๋ฉ๋๋ค.
๐ฏlet, const, var, function ์ด ์ด๋ค ์๋ฆฌ
var : ๋ณ์ ์ฌ์ ์ธ ๊ฐ๋ฅconst, let : ๋ณ์ ์ฌ์ ์ธ ๋ถ๊ฐ๋ฅ
const : ๋ณ์ ์ฌํ ๋น ๋ถ๊ฐ๋ฅ (์์)let : ๋ณ์ ์ฌํ ๋น ๊ฐ๋ฅ
var : functional-scope ๋ก ํธ์ด์คํ
๋จconst, let : block-scope ๋ก ํธ์ด์คํ
๋จ
๐ฏ์คํ ์ปจํ
์คํธ์ ์ฝ ์คํ
์ฝ ์คํ
๋๋ณด๊ธฐ
call์ ํธ์ถ์ ๋ปํ๋ค. stack์ ์ถ์
๊ตฌ๊ฐ ํ๋๋ฟ์ธ ๊น์ ์ฐ๋ฌผ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค.
๋ฐ๋ผ์ callstack์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํจ์ ํธ์ถ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ฐ๋ฌผ ํํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ค.
ํญ์ ๋งจ ์์ ๋์ธ ํจ์๋ฅผ ์ฐ์ ์ผ๋ก ์คํ๋๋ค. ์ด๋ฐ ์์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฐ์ฅ ์์ ์์ฌ์๋ context์ ๊ด๋ จ ์๋ ์ฝ๋๋ค์ ์คํํ๋ ์์ผ๋ก ์ ์ฒด ์ฝ๋์ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅํ๋ค.
์คํ ์ปจํ
์คํธ
๋๋ณด๊ธฐ
Execution Context ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ ๊ฐ๋
์ผ๋ก, ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ํ ํ๊ฒฝ์ด๋ค. ๋ ์์ธํ ๋งํ์๋ฉด, ์คํํ ์ฝ๋์ ์ ๊ณตํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์๋์ ๊ฐ์ฒด์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์ธ์ด๋ก์์ ์ฑ๊ฒฉ์ ๊ฐ์ฅ ์ ํ์
ํ ์ ์๋ ๊ฐ๋
.
๋ชจ๋ ์ฝ๋๋ ํน์ ํ ์คํ ์ปจํ
์คํธ ์์์ ์คํ๋๋ค. javascript๋ ์ด๋ค execution context๊ฐ ํ์ฑํ๋๋ ์์ ์ ์ ์ธ๋ ๋ณ์๋ค์ ์๋ก ๋์ด์ฌ๋ฆฌ๊ณ (hoisting), ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด๋ฅผ ๊ตฌ์ฑํ๊ณ , this๊ฐ์ ์ค์ ํ๋ ๋ฑ์ ๋์์ ์ํํ๋๋ฐ, ์ด๋ก ์ธํด ๋ค๋ฅธ ์ธ์ด์์๋ ๋ฐ์ํ ์ ์๋ ํน์ดํ ํ์๋ค์ด ๋ฐ์ํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ฃผ์ํ ์คํ ์ปจํ
์คํธ์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.Global Execution Context, Fuction Execution Context
๐ฏ์ค์ฝํ ์ฒด์ธ, ๋ณ์ ์๋ํ
์ค์ฝํ ์ฒด์ธ
์ค์ฝํ์ ์๋ณ์๊ฐ ์์ผ๋ฉด ์์ ์ค์ฝํ์์ ๋ค์ ์ฐพ์ ๋๊ฐ๋ค. ์ด ํ์์ ์ค์ฝํ ์ฒด์ธ ์ด๋ผ๊ณ ํ๋ฉฐ ์ค์ฝํ๊ฐ ์ค์ฒฉ๋์ด์๋ ๋ชจ๋ ์ํฉ์์ ๋ฐ์ํ๋ค.
๋ณ์ ์๋ํ
์ธ๋ถ ๊ฐ์ฒด๋ก๋ถํฐ '์์ฑ ๊ฐ(๋ฐ์ดํฐ, ๋ฉค๋ฒ ๋ณ์๊ฐ)'์ ๊ฐ์ถ๋ ํน์ฑ
๐์ค์ต ๊ณผ์
์ฝ์์ ์ฐํ b ๊ฐ์ ์์ํด๋ณด๊ณ , ์ด๋์์ ์ ์ธ๋ “b”๊ฐ ๋ช๋ฒ์งธ ๋ผ์ธ์์ ํธ์ถํ console.log์ ์ฐํ๋์ง, ์ ๊ทธ๋ฐ์ง ์ค๋ช
ํด๋ณด์ธ์. ์ฃผ์์ ํ์ด๋ณด๊ณ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด ์ ์ค๋ฅ๊ฐ ๋๋ ์ง ์ค๋ช
ํ๊ณ ์ค๋ฅ๋ฅผ ์์ ํด๋ณด์ธ์.
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b); //const,let๋ ๋ธ๋ญ ์ค์ฝํ์์ ์ ํจํ๊ธฐ ๋๋ฌธ์ ํจ์ ๋ด๋ถ์ ์๋ ๋ณ์๋ค์ ์ ๊ทผํด์ ์ถ๋ ฅ๋จ
}
console.log(a); // ์ฌ๊ธฐ์ ์ค๋ฅ๊ฐ ๋๋ ์ด์ ๋ ์ ์ญ์ ์ผ๋ก a๋ผ๋ ๋ณ์๊ฐ ์กด์ฌํ์ง ์์์ ์
๋๋ค.(์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ ์ญ์ ์ผ๋ก a ์ด๊ธฐ๊ฐ ๋ณ์๋ฅผ ํ ๋นํ๋ฉด ๋ฉ๋๋ค.)
console.log(b); //์ ์ญ b๋ณ์์ ์ ๊ทผํด์ ์ถ๋ ฅ
hi();
console.log(b); //์ ์ญ b๋ณ์์ ์ ๊ทผํด์ ์ถ๋ ฅ
window.ReactionButtonType = 'reaction';
window.ReactionApiUrl = '//triplexlab.tistory.com/reaction';
window.ReactionReqBody = {
entryId: 197 }
์ข์์6
๊ณต์ ํ๊ธฐ
ํ์ด์ค๋ถ์ผ๋ก ๊ณต์ ์นด์นด์คํก์ผ๋ก ๊ณต์ ์นด์นด์ค์คํ ๋ฆฌ๋ก ๊ณต์ ํธ์ํฐ๋ก ๊ณต์ URL ๋ณต์ฌ
๊ฒ์๊ธ ๊ด๋ฆฌ
์ถ์ฒ: https://triplexlab.tistory.com/197 [ํธ๋ฆฌํ์์ค๋ฉ | TriplexLab:ํฐ์คํ ๋ฆฌ]