Record What I Didn't Know About Javascript
Javascript
async/defer
๊ธฐ์กด๋ฐฉ์
html์ฝ๋๋ฅผ parsing htmlํ๋ค๊ฐ script์ฝ๋๋ฅผ fetchingํด์ผํ๋ฉด ์ ์ parsing html๋ฅผ block์์ผ script๋ฅผ fetching, executingํ parsing html์ ์ฌ๊ฐ ํ๋ค. ์ด๋ฐ ๋ฐฉ์์ script ์ฉ๋์ด ๋๋ฌด ํฌ๊ฑฐ๋, fetching ํ js๊ฐ ๋ง์ ๊ฒฝ์ฐ page loading์ ์ฌ์ฉ์๊ฐ ํ์ผ์์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๋๋ฐโฆ
async
<script async src="index.js"></script>
parsing html์ ํ๋์ค์ script๋ฅผ fetching ํ ๋, script fetchingํ๋ฉด์ parsing html์ ๋์์ ์ํํ๊ฒ ๋๋ค. parsing html์ด ์ ๋ถ ๋๋ฌ์ ๊ฒฝ์ฐ, executing์ ์ํํ๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ๋๋ ์ฅ์ ์ด ์์ง๋ง, html์ด js์ ์์กดํ๊ฒ ๋ ๊ฒฝ์ฐ ํ์ด์ง๊ฐ ์ ์์๋ํ์ง ์์ ์ ์๋ค.
defer
<script defer src="index.js"></script>
parsing html์ ํ๋์ค script๋ฅผ fetchingํด์ผํ๋ ๊ฒฝ์ฐ parsing html๊ณผ fetching js๋ฅผ ๋์์ ํ๋ฉด์ executing์ ์์ ์๊ฐ ๋ช ์ํ ์์๋๋ก ์์ ์ ํ๊ฒ ๋๋ค. ๊ฐ์ฅ ์ด์์ ์ด๋ฉฐ header์์์ fetching js๋ฅผ ํ๊ฒ ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ์ด์์ ์ด๋ค.
use strict
js์์ค ๊ฐ์ฅ ์์
'use strict';
์ ๋ ฅํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ ์ ์ด์ฐฝ๊ธฐ flexibleํ ์ธ์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋ง๋ค์ด์ง javascript์ ์ํ์ฑ์ ๋ณด๋ค ์์ ํ๊ฒ ์์ฑํ ์ ์๋ค.
์๋ฅผ ๋ค์ด
variable = 6;
console.log(variable);
์ ์ธ๋ ํ์ง ์์ ๋ณ์์ ๊ฐ์ ํ ๋นํ๊ณ ์ถ๋ ฅ๊น์ง ํด๋ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ์ ์์๋ํ๋ ๋ง๋ ์๋๋ ์ผ์ ์ผ์ด๋์ง ์๋๋ค.
NaN/null/undefined
์ ๊ฐ๋ค์ ์ผํ๋ณด๋ฉด ๊ฐ๋ค๊ณ ์๊ฐ์ด ๋ค์ง๋ง ์ ๋ถ ๋ค๋ฅธ ๊ฐ์ด๋ค.
NaN
Not a Number์ ์ฝ์๋ก ์ฌ์ฉ์๊ฐ number type์ ๊ฐ์ ๊ธฐ๋ํ๊ณ ์ฌ์ฉํ ๋ number type์ธ์ ๊ฐ์ด ๋ฐํ๋๋ฉด return ๋๋ ๊ฐ์ด๋ค.
> 18 - "String";
< NaN
null
์ ์ธ, ํ ๋น์ ๋์์ง๋ง, ์๋ฌด๋ฐ ๊ฐ๋ ๊ฐ์ง์ง ์์ ๋ณ์๊ฐ ์ด๋ค.
undefined
์ ์ธ์ ๋์์ง๋ง, ํ ๋น์ด ์ ๋ ๋ณ์๋ฅผ ์ฌ์ฉ ํ ๋ ๋ฐํ๋๋ ๊ฐ์ด๋ค.
==/===
const coercionaryVariable = true + 4;
console.log(coercionaryVariable);
<5
์์ ๊ฐ์ด javascript๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ์ ์ผ๋ก ํ์ ์ ๋ฐ๊พผ๋ค.
==
๋ฌด์ธ๊ฐ๋ฅผ ๋น๊ต ํ ๋ ์ฌ์ฉํ๋ == ์ฐ์ฐ์๋ ํ์ ๋ณํ์ ๊ฐ์ ์ฑ์ ๋ ์ฐ๊ณ ์๋ค.
===
==์ ๋ฐ๋๋๋ ์ฑ๊ฒฉ์ผ๋ก type์ด ๊ฐ์์ง ๋น๊ต๋ฅผ ํ ๋ ๊ฐ์ฅ ์ด์์ ์ธ ์ ํ์ด๋ค.
typeof/instanceof
๋ณ์์ ์๋ฃํ์ ์๊ณ ์ถ๋ค๋ฉด ์ฌ์ฉํ๋ ๋ช ๋ น์ด
typeof
const num = 123;
typeof num
< number
์ด๋ ํ ์๋ฃํ์ด๋ ์ฌ์ฉ๊ฐ๋ฅ ํ์ง๋ง null์ Objectํ์ผ๋ก ๊ฐ์ด ๋ฐํ ๋๋ ์ด์ํ ์ค๋ฅ๊ฐ ์๋ค.
instanceof
const myCellPhone = {
brand:'Samsung',
version:'note20',
color:'black'
};
console.log(myCellPhone instanceof Object);
< true
์ผ์ชฝ์ ์ธ์คํด์ค๊ฐ ์ค๋ฅธ์ชฝ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ ๋ช ๋ น์ด
null instanceof Obejct;๋ false๋ฅผ ๋ฐํ
parameter
default parameter
function profile(name, age=24) {
console.log(name, age)
}
profile(์ต์์ฑ);
ํ๋ผ๋ฏธํฐ์ ๊ฐ์ default๋ก ์ง์ ํด๋ฒ๋ ค์ undefined๊ฐ ๋ฐํ๋์ง ์๋๋ก ๋ฐฉ์ง
rest parameter
function skillStacks(...args) {
for(let i = 0; i < args.length; i++) {
console.log(args[i]);
}
}
skillStacks("Spring", "React.js", "Javascript", "java", "node.js", "React Native");
parameter๊ฐ์ ๋ฐฐ์ด๋ก ๋ฐ๋๋ค๋ ๊ฒ์ ๋ช ์ํ๋ค.
for
args.forEach((arg) => console.log(arg));
๋ฐฐ์ด์ ๊ฐ์ ํ๋์ฉ ๋ฝ์์ด
for(cosnt arg of args) {
console.log(arg);
}
์ ๊ธฐ๋ฅ๊ณผ ๋์ผ
hoisting
์๋ฐ์คํฌ๋ฆฝํธ๋ hoisting์ด๋ผ๋ ๊ฐ๋ ์ ์ง์ํ๋ค.
log();
const log = function () {
console.log("writing...");
}
varํ์ ๋ณ์, function์ ์ ์ธ, ํ ๋น ์ ์ ํธ์ถํด๋ ์คํ์ด ๊ฐ๋ฅํ๋ฐ javascript๊ฐ ์์์ ๋งํ ๋๊ฐ์ง๋ฅผ ๊ฐ์ฅ ์์ ์๋์ผ๋ก ์ฌ๋ ค์ค๋ค.
callback function
console.log(1);
setTimeout(() => console.log(2), 1000);
console.log(3);
javascript๋ stack์์ ํจ์๋ฅผ ํธ์ถํ๋ค. ๋ง์ฝ setTimeout๊ฐ์ API๋ฅผ ํธ์ถ ํ ๊ฒฝ์ฐ webAPI์ ๋ฌด์กฐ๊ฑด ๊ฐ๊ฒ ๋์ด์ Message Queue๋ฅผ ๊ฑฐ์ฒ stack์ ๋ค์ ๊ฐ๊ฒ ๋๋๋ฐ stack์ด ๋น์ด์์ด์ผ ์ถ๋ ฅ์ ํ ์ ์๋ค.
๊ทธ๋์ ์ถ๋ ฅ์์๋ 1,3,2์ด๋ค.
??/|| ์ฐ์ฐ์
??
function printMessage(text) {
console.log(text ?? "Nothing to display");
}
printMessage("text");
printMessage(null);
printMessage(undefined);
< text
<"Nothing to display"
<"Nothing to display"
Nullish coalescing ์ฐ์ฐ์๋ ์ฐ์ฐ์ ๊ธฐ์ค ์ผ์ชฝ์ ๋ฌธ์์ด์ด null, undefined์ผ ๊ฒฝ์ฐ ์ผ์ชฝ์ ๋ฌธ์์ด์ ๋์ ๋ฐํ
||
Logical Or ์ฐ์ฐ์๋ ์ฐ์ฐ์ ๊ธฐ์ค ์ผ์ชฝ์ ๋ฌธ์์ด์ด NaN, -1, 0, false, undefined, null๊ฐ ์ผ๊ฒฝ์ฐ์ ์ค๋ฅธ์ชฝ ๋ฌธ์์ด์ ๋ฐํ
default parameter์ ๋ค๋ฅธ์ ์ undefined์ผ ๊ฒฝ์ฐ์๋ง ์ ๋ ฅํด๋ ผ default๊ฐ์ด ์ถ๋ ฅ๋จ