[Javascript] ์์ธ์ ์ก(์์๋๋ฉด ์ธ๋ชจ์๋ ์ ๊ธฐํ ์ก์์คํฌ๋ฆฝํธ) - 1
๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ ๊ณผ ๊ธ์ ๋ณด๊ณ ๋ค์ํ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ๋ฉด์ ์์ํ๊ฒ ๋๋ ๋ถ๋ถ๋ค์ ์ ๋ฆฌํด๋ ผ ๊ธ ์ ๋๋ค. (๋ชฉ์ฐจ๋ฅผ ๋ณด๊ณ ๊ด์ฌ์๋ ๋ถ๋ถ๋ง ์ฝ์ด๋ ์ข์ต๋๋ค.)
๋จ์ํ ์ ์ฃผ๊ด์ผ๋ก ํ๋จํ๊ณ ์์ฑํ๋ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด๋๊ฐ ๋ ์๋ ์์ผ๋ ์ฃผ์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค ๐
1. REPL(Read Eval Print Loop)
๊ธฐ๋ณธ์ ์ผ๋ก Javascript๋ ์ปดํจํฐ๊ฐ ํ์ค ์ฉ ์ฝ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ธ์ด์ ๋๋ค.
์ด Javascript๋ ๋ธ๋ผ์ฐ์ ์ ์ฝ์์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋, ๋ธ๋ผ์ฐ์ ์ ์ฝ์์์ ํ ์ค์ฉ ์ ๋ ฅ(Read)๋ฐ๊ณ ๋ฐ์ ์ ๋ ฅ์ ํ๊ฐ(Eval)ํ ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ(Print)ํฉ๋๋ค. ๊ทธ ํ ๋ค์ ํ๋กฌํํธ๊ฐ ๋ํ๋ ์๋ก์ด ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.(Loop)
์ด ๊ณผ์ ์ REPL(Read-Eval-Print-Loop)๋ผ๊ณ ํฉ๋๋ค.
2. Number์ parseInt/parseFloat์ ์ฐจ์ด
์๋์ ์์์ ๊ฐ์ด Number๋ ์์ ๋ค์ด์๋ ๊ฐ์ด ์ ๋ถ ์ซ์๊ฐ ์๋๋ผ๋ฉด Nan(Not a Number)๋ฅผ ๋ฐํํ๊ณ parseInt/parseFloat์ Int์ Float์ผ๋ก ์ธ์ํ ์ ์๋ ์์น๊น์ง ์ฝ์ด ํด๋น ํ์ ์ผ๋ก ๋ฐํํฉ๋๋ค.
Number('234์ค์ค์คํ
์คํธ324'); // Nan(Not a Number)
โ
parseInt('234์ค์ค์คํ
์คํธ324'); // 234
parseInt('234.23423์ค์ค์คํ
์คํธ324'); //234
โ
parseFloat('234์ค์ค์คํ
์คํธ324'); // 234
parseFloat('234.23423์ค์ค์คํ
์คํธ324'); // 234.23423
์ฐธ๊ณ ๋ก Nan์ typeof๋ก ์ฒดํฌํด๋ณด๋ฉด ์ซ์๋ผ๊ณ ๋์ต๋๋ค.
3. ๋นผ๊ธฐ(-) ์ฐ์ฐ์
1 + '0' ์ฒ๋ผ ๋ํ๊ธฐ ์ฐ์ฐ์๋ ์ซ์๊ฐ ๋ฌธ์์ด๋ก ๋ณํ ํ, ๋ํ๊ธฐ ์ฐ์ฐ์ ์งํํ๋๊ฒ์ ๋๋ถ๋ถ์ด ๋ค ์๋ ์ฌ์ค์ผ ๊ฒ๋๋ค.
ํ์ง๋ง, ๋นผ๊ธฐ ์ฐ์ฐ์๋ ๋ฌธ์์ด์ด ์ซ์๋ก ๋ฐ๋ ํ ์ฐ์ฐํฉ๋๋ค. ๋๋ฌธ์ ๋ฌธ์์ด์ ์ซ์๊ฐ ์๋ ๋ค๋ฅธ ๋ฌธ์๊ฐ ๋ค์ด์ฌ ๊ฒฝ์ฐ Nan์ ๋ฐํํฉ๋๋ค.
์ฆ, ์์์ ๋งํ ๊ฒ ์ฒ๋ผ ๋ฌธ์์ด์ด parseInt๋ณด๋ค๋ Number๊ฐ ์ ์ฉ๋๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
4. NaN๋ผ๋ฆฌ ๋น๊ตํ๊ธฐ
๊ฐ ์ค์์ NaN์ ๋น๊ตํ ๋ ๋ ํนํ ์ฑ์ง์ ๊ฐ์ง๋๋ค. ๋ฐ๋ก NaN๋ผ๋ฆฌ ๋น๊ตํ ๋ false ๊ฐ์ ๊ฐ์ง๋ค๋ ๊ฒ์ ๋๋ค.
> NaN == NaN;
< false
5. ๋ฌธ์์ด ์ฝ๋ ๋ณด๊ธฐ
charCodeAt()์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๋ฌธ์๊ฐ ์ด๋ค ์ฝ๋ ๋ฒํธ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ ์ ์์ต๋๋ค.'
> '&'.charCodeAt();
< 65286
> 'a'.charCodeAt();
< 97
> 'b'.charCodeAt();
< 98
6. ๋ฌธ์์ ์ซ์ ๋น๊ต
Javascript์์ ๋ฌธ์์ ์ซ์๋ฅผ ๋น๊ตํ ๋, ๋ฌธ์๋ฅผ ์ซ์๋ก ๋ณํ ํ ๋น๊ตํ๊ฒ ๋ฉ๋๋ค. ์ด ๋, ์ซ์๋ก ๋ณํํ ์ ์๋ ๋ฌธ์๋ NaN์ด ๋ฉ๋๋ค.
> '1' < 5
< true
> 'abc' < 5
< false
7. !!์ฐ์ฐ์
!๊ฐ true๋ฅผ false๋ก false๋ฅผ true๋ก ๋ฐ๊ฟ์ฃผ๋ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์ !!๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์ฐ์ฐ์๋ฅผ ๋ถ์ธ ์ฝ๋๊ฐ true์ธ์ง false์ธ์ง๋ฅผ ํ๋จํ ์ ์๋ค.
> !!false // false -> true -> false
< false
โ
> !!'' // false(''์ false) -> true -> false
< false
โ
> !!0 // false(0์ false) -> true -> false
< false
โ
> !!NaN // false(NaN์ false) -> true -> false
< false
โ
> !!undefined // false(undefined์ false) -> true -> false
< false
โ
> !!null // false(null์ false) -> true -> false
< false
โ
> !!document.all // false(document.all์ false, ์ ์ฌ์ฉํ์ง ์์) -> true -> false
false
์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋๋ถ๋ถ์ด true์ด๊ธฐ ๋๋ฌธ์ !!๋ฅผ ์ด์ฉํด์ ํด๋น ์ฝ๋๊ฐ ์๋์ง ์๋์ง๋ฅผ ํ๋จํ ์ ์์ต๋๋ค.
8. typeof null
typeof null์ ์๋ null์ด ๋์์ผ ํ์ง๋ง ๊ฒฐ๊ณผ๊ฐ์ object๊ฐ ๋์ต๋๋ค. ์ด ํ์์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ๋ช ํ ๋ฒ๊ทธ์ ๋๋ค. ์ธ์ด๊ฐ ๋ง๋ค์ด์ง ์ด์ฐฝ๊ธฐ์ object๊ฐ ๋์๋๋ฐ, ๊ธฐ์กด์ typeof null์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ณณ์ ์ํฅ์ ๋ผ์น๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ๋ฅผ ์์ ํ ์๊ฐ ์์๋ค๊ณ ํฉ๋๋ค.
์ด ๋ฒ๊ทธ๋ฅผ ๋ณด๊ณ ์ด๋ฐ ์ค๊ณ์ ์ค์์ฑ์ ๋ํด ์๊ฐํด๋ณผ ์ ์์ต๋๋ค.
9. let let = '1' ์ ์ธํ์ ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ค๋ฅธ ์ด์
var var = 3; ์ฒ๋ผ ์์ฝ์ด๋ฅผ ๋ณ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ์ ๋, Unexpected token 'var'๋ผ๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋์ต๋๋ค.
ํ์ง๋ง let let = '1'๋ก ์ ์ธํ๊ฒ ๋๋ค๋ฉด let is disallowed as a lexically bound name๋ผ๋ ์๋ฌ๋ฉ์์ง๊ฐ ๋์ต๋๋ค.
๊ทธ ์ด์ ๋ ES2015 ํ์ค ์ด์ ์๋ let ์ ์ธ์ด ์์์ผ๋ฏ๋ก let์ ๋ณ์ ์ด๋ฆ์ผ๋ก ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์์ต๋๋ค. ๋ณ์ ์ด๋ฆ ํ์ฉ์ ์ค์งํ๋๋ก ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ๋ฉด let์ด ์๋ฒฝํ ๋ณ์ ์ด๋ฆ์ด์๋ ES2015 ์ด์ ์ ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ์ ์์ต๋๋ค. (1995๋ ๋ถํฐ 2015๋ ๊น์ง 20๋ ๋์!)
let์ ES2015์ ์๋ก์ด ๊ธฐ๋ฅ์ด์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋์ ์ ์์์ต๋๋ค. ๋๋ฌธ์ let์ ์ฌ์ฉํ ๋, let์ ๋ณ์ ์ด๋ฆ์ผ๋ก ํ์ฉํ์ง ์์์ผ๋ก์จ ์ ์ฌ์ ์ธ ๊ตฌ๋ฌธ ํผ๋์ ์์ธ์ ํผํ ์ ์์์ต๋๋ค.
๋๋ฌธ์ ES2015์ ์ ์ฌ์ฉํ๋ var๋ฅผ var let = 3; ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ๋ฌธ๋ฒ์ด ๋ฉ๋๋ค.
10. ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฐํ๊ฐ์ด undefined๊ฐ ์๋๋ค?!
> let test = 1; // ์ฒ์ test๋ฅผ ์ด๊ธฐํํ ๋๋ undefined๋ฅผ ๋ฐํํ์ง๋ง
< undefined
> test = 2; // ํด๋น ๋ณ์์ ๊ฐ์ ๋ฐ๊พผ๋ค๋ฉด, ๋ฐ๊พผ ๊ฐ์ ๋ฐํํฉ๋๋ค.
< 2
11. ๋น ๊ฐ์ ๋ฃ์ ๋๋ null์ ์ฌ์ฉํ์!
undefined๋ ๋น ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํน์ ๋ณ์์ ๋น ๊ฐ์ ๋ฃ์ ๋๋ null์ ์ฌ์ฉํจ์ผ๋ก์จ, ์๋์ ์ผ๋ก null์ ๋ฃ์๋ค๋ ๊ฒ์ ํํํด์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ง์ฝ, undefined๋ฅผ ๋ฃ์๋ค๋ฉด, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ ๋ด๊ฐ ์ถํ์ ๋ค์ ํด๋น ๋ณ์๋ฅผ ์ฌ์ฉํด์ผํ ๋, ๊ธฐ๋ณธ๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ฌ ์์ํ์ง ์๊ณ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
12. ํจ์์ ์ด๋ฆ์ ๋ถ์ด๋ ๋ฐฉ๋ฒ 3๊ฐ์ง
- ํจ์ ์ ์ธ๋ฌธ(function declaration statement) : function์์ฝ์ด ๋ค์์ ์ด๋ฆ์ ๋ถ์ด๋ ๋ฐฉ๋ฒ โก๏ธ function a() {}
- ํจ์ ํํ์(function expression) : ๋ณ์๋ฅผ ๋ง๋ค์ด ํจ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ โก๏ธconst a = function() {}
- ํ์ดํ ํจ์(์ต๋ช ํจ์) : ๋ณ์๋ฅผ ๋ง๋ค์ด ํจ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ(ํ์ดํ ํจ์๋ ํด๋น ๋ฐฉ์๋ง ๊ฐ๋ฅ) โก๏ธ const a = () => {}
13. ํจ์์ parameter์ argument
๊ฐ๋ parameter์ argument๋ฅผ ํท๊ฐ๋ฆฌ๊ณค ํ๋๋ฐ, ์ ํํ ์ ์ํ์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- parameter : ํจ์๋ฅผ ์ ์ธํ ๋ ๋ฐ๋ ๋งค๊ฐ๋ณ์
- argument : ํจ์๋ฅผ ํธ์ถํ ๋ ๋ฃ์ด์ฃผ๋ ์ธ์
๋ง์ฝ ํจ์์ parameter(๋งค๊ฐ๋ณ์)์ argument(์ธ์)๊ฐ ์ผ์นํ์ง ์๋๋ค๋ฉด, ์ง์ง์ด์ง์ง ์์ ๋งค๊ฐ๋ณ์๋ undefined๊ฐ ๋๊ณ ์ง์ง์ด์ง์ง ์์ ์ธ์๋ ๋ฌด์๋ฉ๋๋ค.
14. ๊ฐ์ฒด ์์ฑ์ ์ ๊ทผ๋ฐฉ๋ฒ
const obj = {
bc : 'hello',
ab : 'hi',
dc : 'world',
// ์๋๋ ํน์ํ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ(๋ฌธ์์ด๋ก ๋ฌถ์ด์ฃผ์ด์ผ ํจ)
'2bc' : 'unique',
'a b' : 'space',
}
์์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ ๋, ์๋ฐ์คํฌ๋ฆฝํธ์์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์จ์ ์ผ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ โก๏ธ obj.bc
- ๋๊ดํธ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ(์ด ๋, ์์ฑ๋ช ์ ๋ฌธ์์ด๋ก ๋ฌถ์ด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ ์ ์) โก๏ธ obj['bc']
์ด๋ ๊ฒ ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ด ๋๋์ด์ ธ ์๋ ์ด์ ๋ '2bc', 'a b'์ ๊ฐ์ ํน์ํ ๊ฒฝ์ฐ ๋๋ฌธ์ ๋๋ค.
์์ฑ๋ช ์์ ์ซ์๊ฐ ์ค๊ฑฐ๋ ๊ณต๋ฐฑ์ด ์๋ ๊ฒฝ์ฐ๋ obj.2bc ์ฒ๋ผ ์จ์ ์ผ๋ก ๊ตฌ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๊ดํธ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ ๋๋ค.
15. ๋ฐฐ์ด๊ณผ ํจ์๋ ๊ฐ์ฒด๋ค?!
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐฐ์ด๊ณผ ํจ์๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ๊ฐ์ด ์์ฑ์ ์ ์ํ ์ ์์ต๋๋ค.
function hello() {}
hello.a = 'really?';
โ
const array = [];
array.b = 'wow';
โ
console.log(hello.a);
console.log(array.b);
์ฆ, ๋ฐฐ์ด๊ณผ ํจ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ๋ฐฐ์ด๊ณผ ํจ์๋ชจ์์ผ๋ก ๋ง๋ค์ด ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง, ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
16. call(), apply(), bind()
call, apply, bind๋ ํจ์ ํธ์ถ๊ณผ ๊ด๋ จ๋ ๋ฉ์๋ ์ ๋๋ค. ํด๋น ๋ด์ฉ์ ๋ํ ์ค๋ช ์ ์๋์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
17. ๋ฌธ์์ด์ split ๊ตฌ๋ถ์๋ฅผ ๋ฐฐ์ด์ ํฌํจ์ํค๋ ๋ฐฉ๋ฒ
๋ฌธ์์ด์ ํน์ ๊ตฌ๋ถ์๋ก ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ถ๋ฆฌํ ๋, split์ ์ฌ์ฉํฉ๋๋ค.
์ด ๋, ์ ๊ท ํํ์์ ์ฌ์ฉํ๋ฉด ๊ตฌ๋ถ์๋ฅผ ๋ฐฐ์ด์ ํฌํจํ์ฌ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
const content = 'ํด์ํ๊ทธ๋ฅผ ๋ฝ์ ๋ด
์๋ค. #ํด์ํ๊ทธ #ํ
์คํธ#๋ถ์ด์๋ํด์';
const result = content.split(/(#[^ #]+)/); // ๋ฐฐ์ด์ ํฌํจ์ํฌ ์ ๊ทํํ์์ ๊ดํธ()๋ก ๊ฐ์ธ์ค๋๋ค.
// ['ํด์ํ๊ทธ๋ฅผ ๋ฝ์ ๋ด
์๋ค. ', '#ํด์ํ๊ทธ', ' ', '#ํ
์คํธ', '', '#๋ถ์ด์๋ํด์', '']
console.log(result);
18. API ํธ์ถ ์ ์ด๋ฅผ ์ํ ์ฐ๋กํ๋ง(throttling)๊ณผ ๋๋ฐ์ด์ฑ(debouncing)
์ฐ๋กํ๋ง๊ณผ ๋๋ฐ์ด์ค๋ ์ฑ๋ฅ ์ต์ ํ๋ API ํธ์ถ ์ ์ด๋ฅผ ์ํ์ฌ ์ฌ์ฉํ๊ณค ํฉ๋๋ค.
- ์ฐ๋กํ๋ง : ๋ง์ง๋ง ํจ์๊ฐ ํธ์ถ๋ ํ ์ผ์ ์๊ฐ์ด ์ง๋๊ธฐ ์ ์ ๋ค์ ํธ์ถ๋์ง ์๋๋ก ํ๋ ๊ฒ
- ๋๋ฐ์ด์ฑ : ์ฐ์ด์ด ํธ์ถ๋๋ ํจ์๋ค ์ค ๋ง์ง๋ง ํจ์(๋๋ ์ ์ผ ์ฒ์)๋ง ํธ์ถํ๋๋ก ํ๋ ๊ฒ
์ฐ๋กํ๋ง, ๋๋ฐ์ด์ฑ์ ๊ดํ ์์ธํ ์ค๋ช ์ ์ ์ค๋ช ๋์ด ์๋ ์๋ ๋งํฌ๋ฅผ ์ฒจ๋ถํ๊ฒ ์ต๋๋ค.
์ฐธ๊ณ ๋งํฌ