Jieunny์ ๋ธ๋ก๊ทธ
Unit 9. [์ค์ต]JavaScript Koans ๋ฌธ์ ํด๊ฒฐ ๋ณธ๋ฌธ
๐ฃ Jest : ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์๋ ํ ์คํธ ํด
ํ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฌ๋ฌ๊ฐ์ง ์ํฉ๋ค์ ์ค์ ํ๊ณ , ๊ทธ ์ํฉ์ ๋ง๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ์๋์ผ๋ก ํ ์คํธ ํ๋ค.
๐ฃ JavaScript Koans ์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ผ.
โ๏ธ expect
โฐ expect(n).toBe(๊ธฐ๋๊ฐ) : n === ๊ธฐ๋๊ฐ์ธ์ง ํ์ธํ๋ค.
โฐ expect(n).toBeTruthy() : n === true ์ธ์ง ํ์ธํ๋ค.
โฐ expect(n).toEqual(๊ธฐ๋๊ฐ) : n === ๊ธฐ๋๊ฐ์ธ์ง ํ์ธํ๋ค.
๐จ toBe() ์ toEqual() ์ ์ฐจ์ด์
โฐ toBe() ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋์ง ํ์ธํ๋ค. -> ๊ฐ์ฒด์ ๋ด์ฉ์ด ๊ฐ๋๋ผ๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฉด False
โฐ toEqual() ์ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๊ฐ์์ง ํ์ธํ๋ค.
โ๏ธ type
โฐ ๋์จํ ๋์น์ฐ์ฐ์('==') ๋ง๊ณ ์๊ฒฉํ ๋์น์ฐ์ฐ์('===') ๋ฅผ ์ฌ์ฉํด๋ผ.
โฐ ์ต๋ํ ๊ฐ์ ํ์ ๋ผ๋ฆฌ ์ฐ์ฐํด๋ผ.
โฐ ์กฐ๊ฑด๋ฌธ์ ๋น๊ต ์ฐ์ฐ์ ๋ช ์ํด๋ผ.
โ๏ธ const
โฐ const ๋ณ์์๋ ์ฌํ ๋น์ด ๊ธ์ง๋๋ค.
โฐ const๋ก ์ ์ธ๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ, ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
โฐ const๋ก ์ ์ธ๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ, ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
๐จ ๊ทธ๋ผ์๋ const๋ฅผ ์ฌ์ฉํ๋ ์ด์
โฐ ์๋์น ์์ ์ฌํ ๋น์ ๋ง์ ์ ์์ด ์์ ํ๋ค.
โ๏ธ scope
โฐ ํธ์ด์คํ
์ฝ๋๊ฐ ์คํํ๊ธฐ ์ ๋ณ์์ ์ธ/ํจ์์ ์ธ์ด ํด๋น ์ค์ฝํ์ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง ๊ฒ ๊ฐ์ ํ์
์ ์ธ์ด ์ฝ๋ ์คํ๋ณด๋ค ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๊ณผ์ ์ผ๋ก ์ธํ ํ์
-> ์ฝ๋ ์คํ ์ ์ด๋ฏธ ์ ์ธ์ด ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ธ๋ฌธ๋ณด๋ค ์ฐธ์กฐ/ํธ์ถ์ด ๋จผ์ ๋์๋ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค.
โฐ ํจ์ ์ ์ธ๋ฌธ์๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง๋ง, ํจ์ ํํ์์๋ ํธ์ด์คํ ์ด ์ผ์ด๋์ง ์๋๋ค.
let funcExpressed = 'to be a function';
expect(typeof funcDeclared).to.equal('function');
expect(typeof funcExpressed).to.equal('string');
// ํจ์ ํํ์์ ํธ์ด์คํ
์ด ์ผ์ด๋์ง ์์ ๋ฐ์ ์ ์ธ๋ ํจ์๊ฐ ์๋ ์์ ์ ์ธ๋ ๋ฌธ์์ด์ด ์ธ์๋๋ค.
function funcDeclared() {
return 'this is a function declaration';
}
funcExpressed = function () {
return 'this is a function expression';
};
const funcContainer = { func: funcExpressed };
expect(funcContainer.func()).to.equal('this is a function expression');
// func ์๋ funcExpressed๊ฐ ๋ค์ด์๊ณ .func()์์ funcExpressed ํจ์๊ฐ ์คํ๋์ ๋ฆฌํด๊ฐ์ธ ๋ฌธ์์ด์ด ๋์จ๋ค.
funcContainer.func = funcDeclared;
expect(funcContainer.func()).to.equal('this is a function declaration');
โฐ lexical scope (static scope๋ผ๊ณ ๋ ํจ)
'ํจ์๋ฅผ ์ด๋์ ํธ์ถํ์๋๊ฐ'๊ฐ ์๋ 'ํจ์๋ฅผ ์ด๋์ ์ ์ธํ์๋๊ฐ' ์ ๋ฐ๋ผ scope๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ
ํจ์ foo๊ฐ bar์ ํธ์ถํ๋ค๊ณ bar์ ์์ ์ค์ฝํ๊ฐ foo๊ฐ ์๋๋ค.
-> bar์ ์ ์ธ๋ ์์น๋ฅผ ๋ณด๋ฉด bar์ ์์ ์ค์ฝํ๊ฐ ์ ์ญ์์ ์ ์ ์๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ๋ ํ์ ์ค์ฝํ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ์ง ์๊ธฐ ๋๋ฌธ์ foo ํจ์์ ์ ์ธ๋ ๋ณ์ x๋ bar ํจ์์ ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ค.
var x = 'global x'
function foo() {
var x = 'local x'
bar()
}
function bar() {
console.log(x)
}
foo() // global x
bar() // global x
โฐ lexical scope + closure
let age = 27;
let name = 'jin';
let height = 179;
function outerFn() {
let age = 24;
name = 'jimin';
let height = 178;
function innerFn() {
age = 26;
let name = 'suga';
return height;
}
innerFn();
console.log(age); // 26
console.log(name); // jimin
return innerFn;
}
const innerFn = outerFn();
console.log(age); // 27
console.log(name); // jimin
console.log(innerFn()); // 178
์์ ์ Scope -> ์์ ์ ํฌํจํ๋ ์ธ๋ถ ํจ์ Scope -> ์ ์ญ Scope ์์ผ๋ก ๋ณ์๋ฅผ ์ฐพ๋๋ค.
์ ์ญ์๋ ์์ผ๋ฉด ์๋ฌ๋ฅผ ์์ฑํ๋ค.
ํด๋ก์ ๋ ํจ์๋ฅผ ๋ ์์ปฌ ์ค์ฝํ ๋ฐ์์ ํธ์ถํด๋ ํจ์๋ ์์ ์ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๊ธฐ์ตํ๊ณ ์ ๊ทผํ ์ ์๋ ํน์ฑ์ด ์๋ค.
โฐ default parameter
ํ๋ผ๋ฏธํฐ๋ฅผ ์ฃผ์ง ์์์ ๊ฒฝ์ฐ default parameter๋ก ์๋์ผ๋ก ์ ์ธ ๋๋ค.
โฐ ํ์ดํ ํจ์
const add = (x, y) => {
return x + y
}
add(10, 20) // 30
const subtract = (x, y) => x - y
subtract(50, 30) // 20
const adder = x => {
return y => {
return x + y
}
}
// ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ ํด๋ก์
adder(50)(10) // 60
โฐ ์์ ์๋ฃํ
ํจ์์ ์ ๋ฌ์ธ์๋ ๋ณ์์ data๋ฅผ ํ ๋นํ๋ ๊ฒ
ํจ์๋ฅผ ํธ์ถํ๋ฉด์ ๋๊ธด ์ ๋ฌ์ธ์๋ ํธ์ถ๋ ํจ์์ ์ง์ญ๋ณ์ -> ํธ์ถ ์๋ง๋ค ์๋กญ๊ฒ ์ ์ธ๋๋ค. (๋ณธ๋์ ๊ฐ์ ๋ณํ์ง ์์)
โฐ ์ฐธ์กฐ ์๋ฃํ
1๏ธโฃ ๋ฐฐ์ด
const ages = [22, 23, 27];
allowedToDrink = ages;
allowedToDrink === ages; // true
allowedToDrink === [22, 23, 27]; // false
๋ฐฐ์ด์ ๋น๊ต๋ ๊ฐ์ด ์๋๋ผ ์ฃผ์๋ฅผ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ด false ๊ฐ ๋์จ๋ค.
[22, 23, 27] ์ด๋ผ๋ ๋ฐ์ดํฐ๊ฐ heap์ ์ ์ฅ๋๊ณ ages์๋ ๊ทธ ์ฃผ์๊ฐ ์ ์ฅ๋๋ค.
2๏ธโฃ ๊ฐ์ฒด
const person = {
son: {
age: 9,
},
};
const boy = person.son;
// boy : { age: 9 };
boy.age = 20;
person.son.age // 20 ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ด์ boy๋ฅผ ๋ฐ๊พธ๋ฉด person๋ ๋ฐ๋๋ค.
person.son === boy // true ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ.
person.son === { age: 9 } // false age:20
person.son === { age: 20 } // false ๊ฐ์ด ์๋๋ผ ์ฃผ์๋ฅผ ๋น๊ตํ๋๊ฑฐ์!!
const megalomaniac = {
mastermind: 'Joker',
henchwoman: 'Harley',
getMembers: function () {
return [this.mastermind, this.henchwoman];
},
relations: ['Anarky', 'Duela Dent', 'Lucy'],
twins: {
'Jared Leto': 'Suicide Squad',
'Joaquin Phoenix': 'Joker',
'Heath Ledger': 'The Dark Knight',
'Jack Nicholson': 'Tim Burton Batman',
},
};
megalomaniac.length; // undefined
๊ฐ์ฒด ๊ธธ์ด๋ฅผ ๊ตฌํ ๋๋ ๊ฐ์ฒด.length๊ฐ ์๋๋ผ Object.keys(๊ฐ์ฒด).length ์ฌ์ฉ
๐จ ๊ฐ์ฒด.length ํ๋ฉด undefined ๋์จ๋ค. ๊ฐ์ฒด์ length๋ ํค๊ฐ ์๊ธฐ ๋๋ฌธ.
'this'๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์์ ์ ๊ฒฐ์ ๋๋ค.
Object.assign() ์ ํตํ ๋ณต์ฌ๋ ์ฃผ์๋ง ๋ณต์ฌ๋๋ค. -> ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฑด ์๋!
const obj = {
mastermind: 'Joker',
henchwoman: 'Harley',
relations: ['Anarky', 'Duela Dent', 'Lucy'],
twins: {
'Jared Leto': 'Suicide Squad',
'Joaquin Phoenix': 'Joker',
'Heath Ledger': 'The Dark Knight',
'Jack Nicholson': 'Tim Burton Batman',
},
};
function passedByReference(refObj) {
refObj.henchwoman = 'Adam West';
}
passedByReference(obj);
obj.henchwoman // 'Adam West'
const assignedObj = obj;
assignedObj['relations'] = [1, 2, 3];
obj['relations']) // [1, 2, 3]
const copiedObj = Object.assign({}, obj);
copiedObj.mastermind = 'James Wood';
obj.mastermind // 'Joker'
obj.henchwoman = 'Harley';
copiedObj.henchwoman // 'Adam West'
delete obj.twins['Jared Leto'];
'Jared Leto' in copiedObj.twins // false
์์ ๋ณต์ฌ : ๊ฐ์ฒด ๋ด๋ถ์ ๊ธฐ๋ณธํ ๋ฐ์ดํฐ๋ ๋ณต์ฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ๊ฐ์ฒด ๋ด๋ถ์ ๋ ๋ค๋ฅธ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ ๋ณต์ฌ๊ฐ ์๋ ํ ๋น์ ํ๋ ๊ฒ
assign, spread
์์ ๋ฐ์ดํฐ๋ ๋ฐ๊พผ ๊ฐ์ฒด๋ง ๋ฐ๋์ง๋ง, ์ฐธ์กฐ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๊ฒ๋ ๋ฐ๋๋ค.
mastermind์ henchwoman์ string ๋ฐ์ดํฐ๋ผ์ ์ง์ ๋ฐ๊พผ ๊ฐ์ฒด์ ๊ฐ๋ง ๋ฐ๋์ง๋ง twins๋ object ๋ฐ์ดํฐ๋ผ์ ํ๋๋ง ๋ฐ๊ฟ๋ ๋๋จธ์ง๋ ๋ฐ๋๋ค.
โฐ Spread & Rest
...์ ์ด๋์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ ๋ฐ๋ผ spread syntax ๊ฐ ๋ ์๋ ์๊ณ rest syntax๊ฐ ๋ ์๋ ์๋ค.
1๏ธโฃ Spread
์์๋ฅผ ๋ชจ๋ ํ๋์ฉ ์ ๊ฐ์ํฌ ๋
2๏ธโฃ Rest
๋๋จธ์ง ์์๋ฅผ ๋ฌถ์ ๋
ํจ์์ ํ๋ผ๋ฏธํฐ์ ์ฐ์ฌ์ ๋ค์ ๋จ๋ ์์๋ค์ ๋ฐฐ์ด๋ก ๋ฐ์์ค๋ค.
๊ทธ๋์ Rest ํ๋ผ๋ฏธํฐ๋ ํจ์์ ๋งค๊ฐ๋ณ์์ ๋ง์ง๋ง์๋ง ์ฌ ์ ์๋ค.
3๏ธโฃ spread ๋์ ์ ๊ฐ์ฒด๋ก ํจ์ ์ ๋ฌ์ธ์ ๋ค๋ฃจ๊ธฐ
function getAllParamsByArgumentsObj() {
return arguments;
}
const argumentsObj = getAllParamsByArgumentsObj('first', 'second', 'third');
Object.keys(argumentsObj) // ['0', '1', '2']
Object.values(argumentsObj) // ['first', 'second', 'third']
'CodeStates > Training' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Unit 11. [์ค์ต] ๋๋ง์ ์๊ณ ๋ผ ์คํ ์ด์ธ ๋ง๋ค๊ธฐ (0) | 2023.01.10 |
---|---|
Unit 10. [์ค์ต] ํ์๊ฐ์ ํ์ด์ง ์ ํจ์ฑ ๊ฒ์ฌ (0) | 2023.01.10 |
Unit6. [์ค์ต] ๊ณ์ฐ๊ธฐ ๊ตฌํํ๊ธฐ (0) | 2022.12.21 |
Unit5. [์ค์ต] ๊ณ์ฐ๊ธฐ ๋ชฉ์ (0) | 2022.12.19 |
Unit5. [์ค์ต] Flexbox ์ฌ์ฉ (0) | 2022.12.19 |