๐ค JavaScript์ ์๋ฃํ๊ณผ JavaScript๋ง์ ํน์ฑ์ ๋ฌด์์ผ๊น ?
๋์จํ ํ์ (loosely typed)์ ๋์ (dynamic) ์ธ์ด (Javascript์ ๋ณ์๋ ์ด๋ค ํน์ ํ์ ๊ณผ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ ๋ชจ๋ ํ์ ์ ๊ฐ์ผ๋ก ํ ๋น ๋ฐ ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค)
JavaScript ํ๋ณํ
Javascript๋ ํ์
์ด ๋งค์ฐ ์ ์ฐํ ์ธ์ด.
==, ===
=
: ๋์
์ฐ์ฐ์var a = 1;
let b = 3;
const c = '5';
==
: ๋๋ฑ ์ฐ์ฐ์(coercive). ๊ฐ์ ํ ๋ณํ ํ ๊ฐ์ ๋น๊ตํ๋ค.var a = 3;
var b = '3'; //๋ฌธ์์ด
let c = 3;
a == b //true
a == c //true
b == c //true
===
: ์ผ์น ์ฐ์ฐ์(strict equality). ๊ฐ์ ํ๋ณํ ๊ณผ์ ์๋ ์๊ฒฉํ ๋น๊ตvar a = 3;
var b = '3'; //๋ฌธ์์ด
let c = 3;
a == b //false
a == c //true
b == c //false
๊ทธ๋ผ '=='๋ง ์ฌ์ฉํ๋ฉด ๋๋ ๊ฒ ์๋๊ฐ?
=> ์ํ์ง ์๋ ๊ฐ ์ฒดํฌ๊ฐ ๋ฐ์ํด๋ ํ๋ณํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ํ์คํ ๋น๊ต๊ฐ ๋ณด์ฅ๋๋ '==='๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข๋ค.
๋์จํ ํ์
(loosely typed)์ ๋์ (dynamic) ์ธ์ด์ ๋ฌธ์ ์ ์ ๋ฌด์์ด๊ณ ๋ณด์ํ ์ ์๋ ๋ฐฉ๋ฒ์๋ ๋ฌด์์ด ์์์ง ์๊ฐํด๋ณด์ธ์.
๋์จํ ํ์
์ ํ์
์์ด ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ด๋ค.
/* JavaScript Example (loose typing) */
var a = 13; // Number ์ ์ธ
var b = "thirteen"; // String ์ ์ธ
/* Java Example (strong typing) */
int a = 13; // int ์ ์ธ
String b = "thirteen"; // String ์ ์ธ
java
๋ ์ซ์๋ฉด int๋ก ์ ์ธํ๊ณ ๋ฌธ์๋ฉด string์ผ๋ก ์ ์ธํด์ผ ํ๋๋ฐ javascript
๋ ๋์จํด์ ํธํ๊ตฌ๋~๐
๋ฌธ์ ์ ์ ๋ํ ํ๋ก์ ํธ๋ ํ์
์ ํ์
์ด ์ฌ๋ฐ๋ฅธ์ง ์ฒดํฌํ๋ ๊ฒ์ด ๋งค์ฐ ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ ์ ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๊ณ ํ๋ค.
๋ณด์ -> Javascript์ ๋จ์ ์ ๋ณด์ํ์ฌ ์ ์ ํ์
์ฒดํฌ์ ๊ฐ๋ ฅํ ๋ฌธ๋ฒ์ ์ถ๊ฐํ TypeScript
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํจ.
๐ํ์
์คํฌ๋ฆฝํธ ๋ฐฐ์์ผ๊ฒ ๋ค? ใ
ใ
...
undefined์ null์ ๋ฏธ์ธํ ์ฐจ์ด๋ค์ ๋น๊ตํด๋ณด์ธ์
undefined
: '์๋ฌด ๊ฐ๋ ํ ๋น๋ฐ์ง ์์ ์ํ'
var๋ก ์ ์ธํ ๋ณ์๋ ์๋ฌต์ ์ผ๋ก undefined๋ก ์ด๊ธฐํ๋๋ค.
๋ณ์๋ฅผ ์ฐธ์กฐํ์ ๋ undefined๊ฐ ๋ฐํ๋๋ค๋ฉด ์ ์ธ ์ดํ ๊ฐ์ด ํ ๋น๋์ง ์์ ๊ฒ.
๊ทธ๋ผ ๋ณ์์ ๊ฐ์ด ์๋ค๋ ๊ฑธ ๋ํ๋ด๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํ ๊น? => null
์ ํ ๋นํ๋ฉด ๋๋ค!
null
: '๋น์ด ์๋, ์กด์ฌํ์ง ์๋ ๊ฐ' (๊ฐ์ ๋ถ์ฌ)๋ฅผ ์๋ฏธ
๋ณ์์ null์ ํ ๋นํ๋ ๊ฒ์ ์ด์ ์ ํ ๋น๋์ด ์๋ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ.
๐ค JavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด๋ ?
๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ
Primative Type(๊ธฐ๋ณธํ ๋ฐ์ดํฐ / ์์๊ฐ)
๊ฐ์ฒด๊ฐ ์๋ ๋ฐ์ดํฐ ์ ํ์ ๋งํ๋ค.
๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ ๊ฐ์ ๊ทธ๋๋ก ํ ๋นํ๋ค.
๋ฉ๋ชจ๋ฆฌ์์ ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ์ ์ฅ๋๋ฉฐ ์์ ๋ฐ์ดํฐ ๊ฐ ์์ฒด๋ฅผ ๋ณด๊ดํ๋ฏ๋ก, ๋ถ๋ณ์ ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ๋ฐ์ดํฐ๋ ํ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.(์ฌ์ฌ์ฉ)
Reference Type
์ฐธ์กฐ ํ์
์ ๋ณ์์ ํ ๋นํ ๋ ๊ฐ์ด ์๋ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
JavaScript ํ๋ณํ
?
๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
๋ถ๋ณ ๊ฐ์ฒด
๋?const
const๋ ๋ณ์๋ฅผ ์์๋ก ์ ์ธํ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์๋ก ์ ์ธ๋ ๋ณ์๋ ๊ฐ์ ๋ฐ๊พธ์ง ๋ชปํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์. (์ฌํ ๋น ๋ถ๊ฐ๋ฅ)
Object.freeze()
Javascript์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ฉ์๋. "๊ฐ์ฒด๋ฅผ ๋๊ฒฐํ๊ธฐ ์ํ ๋ฉ์๋"
let test = {
name : 'kim'
}
Object.freeze(test);
test.name = 'Jung';
console.log(test) // {name: 'kim'} 'Jung'์ผ๋ก ๋ฐ๋์ง ์์.
but, Object.freeze()๋ ๊ฐ์ฒด์ ์ฌํ ๋น์ ๊ฐ๋ฅ!
test = {
age : 15
};
console.log(test); // {age: 15} <- ์ฌํ ๋น ๋จ.
๋ฐ๋ผ์ ๋ถ๋ณ ๊ฐ์ฒด๋ const์ Object.freeze()๋ฅผ ์กฐํฉํด์ ๋ง๋ค ์ ์์.
(const์ ์ฌํ ๋น๋ถ๊ฐ + Object.freeze()์ ๊ฐ์ฒด์์ฑ ๋ณ๊ฒฝ๋ถ๊ฐ)
const test = {
'name' : 'jung'
};
Object.freeze(test);
๋จผ์ constํค์๋๋ก ๋ฐ์ธ๋ฉ ๋ ๋ณ์๋ฅผ ์์ํ ์ํจ ๋ค์, Object.freeze()๋ก ํด๋น ๋ณ์๋ฅผ ๋๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด
๊ฐ์ฒด์ ์ฌํ ๋น๊ณผ ๊ฐ์ฒด์ ์์ฑ ๋ ๋ค ๋ณ๊ฒฝ๋ถ๊ฐ๋ฅํ ๋ถ๋ณ ๊ฐ์ฒด๊ฐ ๋๋ค.
์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ
์์๊ฐ์ ๊ฐ์ ๋ณต์ฌ ํ ๋ ๋ณต์ฌ๋ ๊ฐ์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ๊ณผ ๋ณต์ฌ๋ ๊ฐ์ด ์๋ก์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค
```js
const a = 1;
let b = a;
b = 2
console.log(a); //1
console.log(b); //2
```
์ฐธ์กฐ๊ฐ์ ๋ณ์๊ฐ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ๋ ๊ฐ(์ฃผ์)์ด ๊ฐ์ ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
```js
const a = {number: 1};
let b = a;
b.number = 2
console.log(a); // {number: 2}
console.log(b); // {number: 2}
```
์ด๋ฐํ ๊ฐ์ฒด์ ํน์ง ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋๊ฐ์ง๋ก ๋๋๋ค.
1. ``์์ ๋ณต์ฌ(Shallow Copy)``
</br>
๋ฐ๋ก ์๋ ๋จ๊ณ์ ๊ฐ๋ง ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
์์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ์์ ์์ ์ฒ๋ผ ์๋๊ฐ๊ณผ ๋ณต์ฌ๋ ๊ฐ์ด ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ ๋งํ๋ค.
๊ฐ์ฒด์์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ ํ๊ฐ์ ๊ฐ์ฒด๋ผ๋ ์๋ณธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด ์ด๋ฅผ ์์ ๋ณต์ฌ๋ผ๊ณ ํ๋ค.
2. ``๊น์ ๋ณต์ฌ(Deep Copy)``
</br>
๋ด๋ถ์ ๋ชจ๋ ๊ฐ๋ค์ ํ๋ํ๋ ์ฐพ์์ ์ ๋ถ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ ๊ฐ์ฒด์์ ๊ฐ์ฒด๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์๋ณธ๊ณผ์ ์ฐธ์กฐ๊ฐ ์์ ํ ๋์ด์ง ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์ค์ฝํ, ํธ์ด์คํ , TDZ
Scope
{}
๋ด์์๋ง ์ฐธ์กฐ(์ ๊ทผ) ๊ฐ๋ฅํ ๋ฒ์ ๋๋ถ๋ถ์ C๊ธฐ๋ฐ ์ธ์ด๋ค์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅธ๋ค.
ํ์ง๋ง Javascript๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅธ๋ค.
Scope์ ์ข
๋ฅ
์ ์ญ ์ค์ฝํ (Global scope)
์ ์ญ์ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ด๋์๋ ์ง ์ฐธ์กฐํ ์ ์๋ ์ ์ญ ์ค์ฝํ๋ฅผ ๊ฐ๋ ๋ณ์๊ฐ ๋๋ค.
์ง์ญ ์ค์ฝํ (Local scope / Function-level scope)
ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ผ๊ณ ๋ ํ ์ ์์.
ํจ์ ๋ด์์ ์ ์ธ๋ ๋งค๊ฐ๋ณ์์ ๋ณ์๋ ํจ์ ์ธ๋ถ์์๋ ์ ํจํ์ง ์์.
var global = 'global'; //์ด๋ ๊ฒ ์ ์ญ์ ์ ์ธํ๋ฉด
function foo() {
var local = 'local'; //์ง์ญ ์ค์ฝํ
console.log(global); //์ด๋์๋ ์ฐธ์กฐ๊ฐ ๋๊ณ
console.log(local);
}
foo();
console.log(global); //global
console.log(local); // Uncaught ReferenceError: local is not defined ์๋ฌ๊ฐ ๋๋ค.
hoisting
TDZ
ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์์ ํธ์ด์คํ ๋ฐฉ์์ ์ฐจ์ด
function sum(a,b) {
return a + b;
}
const sum = function(a,b) {
return a + b;
}
์คํ ์ปจํ ์คํธ์ ์ฝ ์คํ
- Call Stack์ ์ต๋ stack ์ฌ์ด์ฆ๊ฐ ์ ํด์ ธ์์ต๋๋ค.
Call Stack์ ์์ธ Context Stack์ด ์ต๋์น๋ฅผ ๋๊ฒ ๋ ๊ฒฝ์ฐ โRangeError: Maximum call stack size exceededโ๋ผ๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ์๋ฌ๋ Stack Overflow๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค.
1. ์ฝ๋์ ์ ์ญ ๋ฒ์๊ฐ ์คํ๋๋ฉฐ Global Execution Context๋ฅผ pushํฉ๋๋ค.
2. fn1์ด ์คํ๋ฉ๋๋ค.
3. fn1์ Functional Execution Context๊ฐ Call Stack์ push๋ฉ๋๋ค.
4. fn2์ด ์คํ๋ฉ๋๋ค.
5. fn2์ Functional Execution Context๊ฐ Call Stack์ push๋ฉ๋๋ค.
6. console.log๊ฐ ์คํ๋ฉ๋๋ค.
7. console.log์ Functional Execution Context๊ฐ Call Stack์ push ๋ฉ๋๋ค.
8. console.log์ ์คํ์ด ์๋ฃ๋๋ฉฐ console.log์ Functional Execution Context๊ฐ pop๋ฉ๋๋ค.
9. fn2์ ์คํ์ด ์๋ฃ๋๋ฉฐ fn2์ Functional Execution Context๊ฐ pop๋ฉ๋๋ค.
10. fn1์ ์คํ์ด ์๋ฃ๋๋ฉฐ fn1์ Functional Execution Context๊ฐ pop๋ฉ๋๋ค.
11. ์ฑ ์ข
๋ฃ ์ Global Execution Context๊ฐ pop๋ฉ๋๋ค.
์ค์ฝํ ์ฒด์ธ(Scope Chain)
์ค์ฝํ๋ ํจ์์ ์ค์ฒฉ์ ์ํด ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
๋ณ์๋ฅผ ์ฐธ์กฐํ ๋, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ค์ฝํ ์ฒด์ธ์ ํตํด ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ์ฝ๋์ ์ค์ฝํ์์ ์์ํ์ฌ ์์ ์ค์ฝํ๋ก ์ด๋ํ๋ฉด์ ์ ์ธ๋ ๋ณ์๋ฅผ ๊ฒ์ํ๋ค.
์ค์ฝํ ์ฒด์ธ์ outerEnvironmentReference์ ๋ฐ์ ํ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.
๐ก ์ค์ฝํ ์ฒด์ธ์ ์คํ ์ปจํ
์คํธ์ ๋ ์์ปฌ ํ๊ฒฝ์ '๋จ๋ฐฉํฅ'์ผ๋ก ์ฐ๊ฒฐํ ๋งํฌ๋ ๋ฆฌ์คํธ
๋ณ์ ์๋ํ (variable shadowing)
์ฌ๋ฌ ์ค์ฝํ์์ ๋์ผํ ์๋ณ์๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ, ๋ฌด์กฐ๊ฑด ์ค์ฝํ ์ฒด์ธ ์์์ ๊ฐ์ฅ ๋จผ์ ๊ฒ์๋ ์๋ณ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
(function s(){
let a = 'hi'
})() //a is not defined
์ฆ, ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด ์๋๋ ๋ณ์์ ๋ํ ์ ๊ทผ์ ๋ง๋๊ฒ์ด๋ค.
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๋ผ๋ ํด๋ก์ ๋ฅผ ์์ฑํ๋ฉด ํจ์ ๋ด๋ถ์ ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
```jsx
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b); //1,101
}
//console.log(a); //a๋ ์ง์ญ์ค์ฝํ๋ก function() ๋ด๋ถ์์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋จ. => ๋ณด์: ์ ์ญ ๋ณ์๋ก ์ ์ธํด์ฃผ์.
console.log(b); //1 b๋ ์ ์ญ๋ณ์๋ก let b = 1;๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์
hi();
console.log(b); //1 b๋ ์ ์ญ๋ณ์๋ก let b = 1;๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์