๐ช JavaScript w/ ์ฝ๋ฉ์๋ง (์ค๊ธ)
Preface
๐ ๊ฐ๋ฐ ๊ณต๋ถ 1๊ฐ์ ์ฐจ์ธ to-be ๊ฐ๋ฐ์์ ์์ต ๋ธ๋ก๊ทธ๐๏พ Aug 15 ~ 21, 2021
ํ์ฌ ์ํ
์ค๊ธ๋ ๋ฌด์ฌํ! ์ ๋ถํ๋๋ฆฝ๋๋ค!
โ afterthought
ํ ๋ฒ ๋ ๋ ธ๋ค๊ฐ ๋ค์ ์ ๋ ๊ฒ์ธ ๋งํผ ๋ด ๋จธ๋ฆฌ์ ๋ ์ ๋ค์ด์๊ธฐ ๋ฐ๋๋ค.
์์๊ฐ์, ์ฌ์ฐ๊ฐ์ ์ ๋
์
์ค๊ธ์ ๋ค๋ก ๊ฐ ์๋ก ์ด๋ ต๋ค. ํนํ 11๊ฐ๋ถํฐ ์์ํ๊ณ ์ด๋ ค์ ๋ค.
๋ฐ๋ณตํด์ ๋ด์ผ ํ๋ค. ๋ค๋ฅธ ์ฌ๋ ๊ฐ์๋ ๋ณด์!
JavaScript
1. variable, hoisting, TDZ
๋ณ์์ ์์ฑ ๊ณผ์
- ์ ์ธ ๋จ๊ณ (delcaration)
- ์ด๊ธฐํ ๋จ๊ณ (initialization): "undefined"๋ฅผ ํ ๋นํด ์ฃผ๋ ๋จ๊ณ
- ํ ๋น ๋จ๊ณ (assignment)
var, let, const
var
- ์์ฑ ๊ณผ์
- ์ ์ธ ๋จ๊ณ์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ๋์์ ์ด๋ฃจ์ด์ง
- ์ ์ธ์ ๋จผ์ ํ๊ณ ๋์ค์ ํ ๋นํ๋ ๊ฒ์ ํ์ฉํจ (๊ทธ๋์ ๋์ค์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ๊ฒ)
- ์ ์ธ
- ํ ๋ฒ ์ ์ธ๋ ๋ณ์๋ฅผ ๋ค์ ์ ์ธํ ์ ์์
- hoisting
- hoisting๋จ
- ์ ์ธ๋ฌธ์ด ์ต์์๋ก ๋์ฌ์ฌ๋ ค์ง ๊ฒ์ฒ๋ผ ๋์ํ๊ธฐ ๋๋ฌธ์ ์ ์ธํ๊ธฐ ์ ์ ์ฌ์ฉํ ์ ์์
- ๋จ, ์ ์ธ์ hoisting๋์ง๋ง ํ ๋น์ hoisting๋์ง ์์
- scope
- function-scoped์ : ์ ์ผํ๊ฒ ๋ฒ์ด๋ ์ ์๋ scope๊ฐ ํจ์
- ์์ฑ ๊ณผ์
let
- ์์ฑ ๊ณผ์
- ์ ์ธ ๋จ๊ณ๋ hoisting๋์ง๋ง ์ด๊ธฐํ ๋จ๊ณ๋ ์ค์ code์ ๋๋ฌํ์ ๋ ์ด๋ฃจ์ด์ง
- ์ ์ธ์ ๋จผ์ ํ๊ณ ๋์ค์ ํ ๋นํ๋ ๊ฒ์ ํ์ฉํจ (๊ทธ๋์ ๋์ค์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ ๊ฒ)
- ํ ๋ฒ ์ ์ธ๋ ๋ณ์๋ฅผ ๋ค์ ์ ์ธํ ์ ์์
- hoisting
- hoisting๋จ
- ํ์ง๋ง TDZ์ ์ํฅ์ ๋ฐ์ ํ ๋นํ๊ธฐ ์ ์ ์ฌ์ฉํ ์ ์์
- scope
- block-scoped์
e.g. ํจ์, if๋ฌธ, for๋ฌธ, while๋ฌธ, try/catch๋ฌธ ๋ฑ
- block-scoped์
- ์์ฑ ๊ณผ์
const
- ์์ฑ ๊ณผ์
- ์ ์ธ ๋จ๊ณ, ์ด๊ธฐํ ๋จ๊ณ, ํ ๋น ๋จ๊ณ๊ฐ ํ ๋ฒ์ ์ด๋ฃจ์ด์ ธ์ผ ํจ
- ์ ์ธ
- ํ ๋ฒ ์ ์ธ๋ ๋ณ์๋ฅผ ๋ค์ ์ ์ธํ ์ ์์
- hoisting
- hoisting
- ํ์ง๋ง TDZ์ ์ํฅ์ ๋ฐ์ ํ ๋นํ๊ธฐ ์ ์ ์ฌ์ฉํ ์ ์์
- scope
- block-scoped์
e.g. ํจ์, if๋ฌธ, for๋ฌธ, while๋ฌธ, try/catch๋ฌธ ๋ฑ
- block-scoped์
- ์์ฑ ๊ณผ์
hoisting
scope ๋ด๋ถ ์ด๋์๋ ๋ณ์ ์ ์ธ์ด ์ต์์์ ์ ์ธ๋ ๊ฒ์ฒ๋ผ ํ๋ํ๋ค.
๋ฌธ์ ๋ var
, let
, const
์ scope๊ฐ ๋ค๋ฅด๋ค๋ ์ ์ด๋ค.
TDZ (Temporal Dead Zone)
์ด ์์ญ์ ์ ์ธ๋ ๋ณ์๋ ์ฌ์ฉํ ์ ์๋ค.
ํ ๋นํ๊ธฐ ์ ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ code๊ฐ ์์ธก์ด ๊ฐ๋ฅํ๋ฉฐ, ์ ์ฌ์ ์ธ bug๋ฅผ ์ค์ผ ์ ์์ผ๋ฏ๋ก let
๊ณผ const
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
2. constructor function
ํจ์๋ช
์ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ๋ง๋ ๋ค.
new
์ฐ์ฐ์๋ก ํธ์ถํ๋ค.
์์ฑ์ ํจ์๋ ๋ถ์ด๋นต ํ๊ณผ ๊ฐ์ผ๋ ํ์ํ ์ฌ๋ฃ๋ฅผ ๊ฐ์ง๊ณ ์ฐ์ด๋ด๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์์ฑ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ์ผ์ด ๊ฐ์ฒด literal์ ๋ง๋ค์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
function User(name, age){
// this = {} : new ํจ์๋ช
();์ด ์คํ๋๋ฉด ์๋๋๋ code
this.name = name;
this.age = age;
// return this; : new ํจ์๋ช
();์ด ์คํ๋๋ฉด ์๋๋๋ code
}
new ํจ์๋ช
();
function User(name, age){
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this.name); // ์ฌ๊ธฐ์์ this๋ vip๋ฅผ ๊ฐ๋ฆฌํด
}
}
let vip = new User("Mai", 40);
vip.sayName(); // "Mai"
function Item(title, price) {
// this = {}
this.title = title;
this.price = price;
this.showPrice = function () {
console.log(`๊ฐ๊ฒฉ์ ${price}์์
๋๋ค :)`);
};
// return this;
};
const item1 = new Item("๊ณต์ฑ
", 3000);
const item2 = new Item("์ฐ์ฐ", 5000);
const item3 = new Item("๊ฐ๋ฐฉ", 7000);
console.log(item1, item2, item3);
// โฌ๏ธ Output
// Item {title: "๊ณต์ฑ
", price: 3000, showPrice: ๐}
// Item {title: "์ฐ์ฐ", price: 5000, showPrice: ๐}
// Item {title: "๊ฐ๋ฐฉ", price: 7000, showPrice: ๐}
item3.showPrice(); // "๊ฐ๊ฒฉ์ 7000์์
๋๋ค :)"
3. object methods, computed property
methods
Object.assign(A, B)
- A๊ฐ ๋น ๊ฐ์ด๋ผ๋ฉด ('{}') B ๊ฐ์ฒด๋ฅผ A ์ด๋ฆ์ผ๋ก ๋ณต์ (์ด method๋ฅผ ์ฐ์ง ์๊ณ ๋จ์ํ '='์ผ๋ก ๋ ๊ฐ๊ฐ ๊ฐ๋ค๊ณ ํ๋ ๊ฑด ๊ฐ์ฒด๊ฐ ๋ณต์ ๋ ๊ฒ ์๋๋ผ ๋ ๋ค ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ณด๊ณ ์๋ ๊ฒ)
- A๊ฐ ๋น ๊ฐ์ด ์๋๋ฉด์ A์ B์ property๊ฐ ๊ฒน์น์ง ์์ผ๋ฉด ๋ชจ๋ property๊ฐ ๋ณํฉ, ๊ฒน์น๋ฉด A์ property๋ ์ญ์ ๋๊ณ B์ property๋ก ๋ฎ์ด์ฐ๊ธฐ
// ๐ต
// (1)
const user = {
name : "Mai",
age : 30
}
const user2 = Object.assign({}, user); // user ๊ฐ์ฒด๊ฐ user2์ ์ด๋ฆ์ผ๋ก ๋ณต์ ๋จ
Object.assign({ gender : "female" }, user); // : user ๊ฐ์ฒด์ gender๋ผ๋ property๊ฐ ์๊น
// (2)
Object.assign({ name : "May", user }, user); // user ๊ฐ์ฒด์ name property๊ฐ ๋ฎ์ด์ฐ๊ธฐ ํจ (name : "Mai")
// (3)
Object.assign(user, info1, info2); // info1์ด ๋จผ์ user์ ๋ณํฉํ๊ณ , ์ด๊ฒ์ด info2์ ๋ณํฉ๋จ
Object.keys()
: ๊ฐ์ฒด์ key๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํObject.values()
: ๊ฐ์ฒด์ ๊ฐ์ ๋ฐฐ์ด๋ก ๋ฐํObject.entries()
: ๊ฐ์ฒด์ key์ ๊ฐ์ ๋ชจ๋ ๋ฐฐ์ด๋ก ๋ฐํObject.fromEntries()
: key์ ๊ฐ์ด ๋ฐฐ์ด๋ก ๋ฌถ์ธ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ๋ฐํ
// ๐ต ์ด๋ค ๊ฒ key๊ฐ ๋ ์ง ๋ชจ๋ฅด๋ ์ํฉ์์ ๊ฐ์ฒด ๋ง๋ค ๋ ์ ์ฉํ code
function makeObj(key, val) {
return {
[key]: val,
};
}
const obj = makeObj('๋์ด', 33);
console.log(obj); // { '๋์ด': 33 }
computed property
property์ ์ฐ์ฐ๋ ๊ฐ์ด ์ฌ์ฉ๋ ์ ์๋ค.
let a = "age"
const user = {
name : "Mike",
[a] : 30 // age : 30
}
const user = {
[4 + 7]: 'sum',
['Hi, ' + 'this is me']: 'Hello',
};
console.log(user); // { '11': 'sum', 'Hi, this is me': 'Hello' }
4. symbol
key๋ฅผ ์ซ์๋ boolean์ผ๋ก ์ ์ ์ ์์ผ๋, ๊ฒฐ๊ตญ ๋ฌธ์ํ์ผ๋ก ๋ฐํ๋๋ค.
๊ทธ๋์ ๋ฌธ์๋ก ํ์ฉํ๋ฉด ๋๋ค.
์ด ์ธ์ key๋ก Symbol()
์ ์ธ ์๋ ์๋ค.
Symbol()
- ๊ธฐ์กด๊ณผ ๋ฌ๋ฆฌ 'new'๋ฅผ ๋ถ์ด์ง ์์
Symbol()
์ ์ ์ผํ ์๋ณ์๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํจ
๊ทธ๋์ ์ด๋ฆ์ด ๊ฐ๋๋ผ๋ ์ผ์น์ฐ์ฐ์๋ ๋๋ฑ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ง ์๋ค๊ณ ๋์ด
์ ์ฒด code ์ค ๋ฑ ํ๋์ด๊ธฐ ๋๋ฌธ์ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋จ- ํน์ ๊ฐ์ฒด์ ์๋ณธ data๋ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์์ฑ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํจ (property๋ช ์ด ๊ฒน์น๋ฉด ์ ๋๋๊น)
- ๊ทธ๋ฌ๋ method๋ฅผ ์ฐ๋ฉด ๊ฐ์ผ๋ก ๋ฐํ๋์ง๋ ์์
// ๐ต
const a = Symbol();
const b = Symbol();
a === b; // false
a == b; // false
// ๐ต symbol์ ์ด๋ฆ์ด ๊ถ๊ธํ๋ฉด description ์ฌ์ฉ
const id = symbol("id์
๋๋ค.");
id.description; // "id์
๋๋ค."
Symbol.for()
: ์ ์ญ symbol- ํ๋์ symbol๋ง ๋ณด์ฅ๋ฐ์ ์ ์์. (์์ผ๋ฉด ๋ง๋ค๊ณ ์์ผ๋ฉด ๊ฐ์ ธ์ด)
Symbol()
์ ๋งค๋ฒ ๋ค๋ฅธSymbol()
์ ์์ฑํ์ง๋ง,Symbol.for()
๋ ํ๋๋ฅผ ์์ฑํ ๋ค key๋ฅผ ํตํด ๊ฐ์ symbol์ ๊ณต์ ํจ
- ํ๋์ symbol๋ง ๋ณด์ฅ๋ฐ์ ์ ์์. (์์ผ๋ฉด ๋ง๋ค๊ณ ์์ผ๋ฉด ๊ฐ์ ธ์ด)
// ๐ต
const id1 = Symbol.for("id");
const id2 = Symbol.for("id");
id1 === id2; /// true
// ๐ต symbol์ ์ด๋ฆ์ด ๊ถ๊ธํ๋ฉด keyfor ์ฌ์ฉ
Symbol.keyFor("id1") // "id"
// ๐ต ๋ฉ๋ฆฌ ๋จ์ด์ ธ์๋ ๊ฐ์ฒด์ showName์ด๋ผ๋ method๊ฐ ์๋์ง ๊ณ ๋ฏผํ์ง ์์๋ ๋๊ณ , ๋ค๋ฅธ ์ฌ๋์ด ๋ง๋ property๋ฅผ ๋ฎ์ด์ฐ๊ธฐํ ๊ฑฑ์ ๋ ํ ํ์ ์์ด ์์
ํ ์ ์๋ code
// ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ง๋ค์ด ๋์ ๊ฐ์ฒด
const user = {
name: 'Mai',
age: 30,
};
// ๋ด ์์
// user.showName = function () {}; ์ด๋ ๊ฒ ํ์ง ๋ง๊ณ
const showName = Symbol('show name');
user[showName] = function () {
console.log(this.name);
};
// ์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ๋ณด๋ message
for (let key in user) {
console.log(`Her ${key} is ${user[key]}.`);
}
// โฌ๏ธ Output
// "Her name is Mai."
// "Her age is 30."
// ๋ด๊ฐ ๊ถ๊ธํดํ๋ showName๋ ์ ์ด๋ณด๋ฉด
user[showName](); // "Mai"
5. numbers / math methods
toString()
()
์์ ์๋ฌด๊ฒ๋ ์ฐ์ง ์์ผ๋ฉด ์ซ์๋ฅผ ๋ฌธ์๋ก ๋ฐ๊พธ์ด ์ค
()
์์ 2๋ฅผ ์ฐ๋ฉด 2์ง๋ฒ์ผ๋ก, 8์ ์ฐ๋ฉด 8์ง๋ฒ์ผ๋ก, 16์ ์ฐ๋ฉด 16์ง๋ฒ์ผ๋ก ๋ฐ๊พธ์ด ์ค
Math.PI
: 3.141592653589793Math.ceil()
: ์ฌ๋ฆผMath.floor()
: ๋ด๋ฆผMath.round()
: ๋ฐ์ฌ๋ฆผ
โป ์์์ ์๋ฆฌ์ ๋๊ธฐ
// ๐ต ์๋์ ์ซ์๋ฅผ ์์์ ๋์งธ ์๋ฆฌ๊น์ง ํํํ๊ธฐ (์
์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ)
let userRate = 30.1234;
// (1) 100 ๊ณฑํ ๊ฐ์ Math.round method๋ฅผ ์ฐ๊ณ ๋ค์ 100์ผ๋ก ๋๋๊ธฐ
Math.round(userRate * 100) / 100 // 30.12
// (2) toFixed() ์ฌ์ฉ
userRate.toFixed(2); // "30.12"
Number(userRate.toFixed(2)) // 30.12
toFixed()
:()
์์ ์ด ์ซ์๊น์ง ํํ (๋จ, ๋ฌธ์๋ก ๋ฐํํ๋ฏ๋ก ์ฃผ์)
let userRate = 30.1234;
userRate.toFixed(0); // "30"
userRate.toFixed(6); // "30.123400"
isNaN()
: ์ซ์์ธ์ง ์๋์ง ํ๋จํ ๋ ์ฌ์ฉํจ (๊ทธ๋ฅ NaN์ด ์๋๋ผisNaN()
์ผ๋ก ์ฌ์ฉํด์ผ ํจ)
x == NaN // false
x === NaN // false
NaN == NaN // false
isNaN(x) // true
isNan(3) // false
parseInt()
- ๋ฌธ์์ด์ ์ซ์๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฑด
Number()
์ ๋์ผํ๋parseInt()
๋ ๋ฌธ์๋ ์ผ๋ถ ์ฒ๋ฆฌํจ (Number()
์ ๋ฌธ์๋ฅผ ๋ฃ์ผ๋ฉด 'NaN'์) (๋จ,parseInt()
๋ ์ซ์๋ก ์์ํ์ง ์์ผ๋ฉด 'NaN'์ ๋ฐํํจ) - ์์์ ์ ๋ฌด์ํจ
- comma ๋ค์ ๋ช ์ง์๋ก ๋ฐ๊ฟ์ง ์ ์ด์ฃผ๋ฉด ๋ฌธ์๋ก ์์ํด๋ 'NaN'๋ฅผ ๋ฐํํ์ง ์์
- ๋ฌธ์์ด์ ์ซ์๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฑด
let margin = "10px";
parseInt(margin); // 10
Number(margin); // NaN
let redColor = "f3";
parseInt(redColor); // NaN
parseInt(redColor, 16); // 243
parseInt(11, 2) // 3
parseFloat()
:parseInt()
์ ๊ฑฐ์ ๋์ผํ์ง๋ง ๋ถ๋ ์์์ ์๋ฆฌ๋ ๋ฐํํจ
let padding = "18.5%";
parseInt(padding); // 18
parseFloat(padding); // 18.5
Math.random()
: 0 ~ 1 ๋ฌด์์ ์ซ์ ์์ฑ
// ๐ต 1 ~ 100 ์ค ์์์ ์ซ์ ๋ฝ๊ธฐ
Math.floor(Math.random() * 100) + 1
// ๐ต ๋ฌด์์ ์ ๋ฝ๊ธฐ
// ๊ทธ ์์ 100 ๊ณฑํ๊ธฐ (1 ~ 50 ์ค ์์์ ์ซ์๋ฅผ ๋ฝ๊ณ ์ถ๋ค๋ฉด 50 ๊ณฑํ๊ธฐ)
// Math.floor๋ก ์์์ ์์ ๊ธฐ
// ์ด๋ 0์ด ๋์ฌ ์ ์์ผ๋ฏ๋ก 1 ๋ํ๊ธฐ
๐ง ๊ทธ๋ผ Math.ceil()
์ ์จ์ ๋์ '+1'์ด ์๋ '-1'์ ํด ์ค๋ ๋๋ ๊ฑฐ๊ฒ ์ง? ๐ง
Math.max()
: ์ต๋๊ฐMath.min()
: ์ต์๊ฐMath.abs()
: ์ ๋๊ฐMath.pow(n, m)
: ๊ฑฐ๋ญ์ ๊ณฑ
// ๐ต 2โด ๊ตฌํ๊ธฐ
Math.pow(2, 4); // 16
Math.sqrt(n, m)
: ์ ๊ณฑ๊ทผ
// ๐ต โ16 ๊ตฌํ๊ธฐ
Math.sqrt(16); // 4
6. string methods
1) ๋ฐ์ดํ
HTML์ class๋ช
๋ฑ ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ์ ธ์๋ ๋ด์ฉ์ด ์์ผ๋ฏ๋ก ์์๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ํธํ๋ค.
์์ด๋ก ๋ ๋ฌธ์ฅ์ apostrophe๊ฐ ์์ผ๋ฏ๋ก ํฐ ๋ฐ์ดํ๋ก ๊ฐ์ธ๋ ๊ฒ ํธํ๋ค.
2) backtick
backtick ์ฌ๋ฌ ์ค์ ์ธ ์ ์์ง๋ง ๋ฐ์ดํ๋ ํ ์ค๋ก๋ง ์จ์ผ ํ๋ค. (\n
์ฌ์ฉ)
3) methods
length
- ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ ์ ์์ (ํน์๋ฌธ์์ ๊ณต๋ฐฑ์ ํฌํจํจ)
- 0๋ถํฐ ์
let hi = "์๋
ํ์ธ์.";
hi.length // 6
- ๋ฐฐ์ด๊ณผ ๋์ผํ๊ฒ ๋๊ดํธ ์์ ์ซ์๋ฅผ ๋ฃ์ด ํน์ ์์น์ ์ ๊ทผํ ์ ์์ (๊ทธ๋ ๋ค๊ณ ๋ฌธ์๋ฅผ ๋ฐ๊ฟ ์ ์๋ ๊ฑด ์๋)
- 0๋ถํฐ ์
hi[2] // "ํ"
toUpperCase()
: alphabet์ ๋ชจ๋ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํจtoLowerCase()
: alphabet์ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝํจstr.indexOf(text)
- text๋ฅผ ๋ฌธ์๋ก ๋ฐ์ ๋ช ๋ฒ์งธ์ ์์นํ๋์ง ๋ฐํํจ (ํน์๋ฌธ์์ ๊ณต๋ฐฑ์ ํฌํจํจ)
- ์์ผ๋ฉด '-1'์ ๋ฐํํจ
- text๊ฐ ์ฌ๋ฌ ๊ฐ ํฌํจ๋์ด ์์ด๋ ์ฒซ ๋ฒ์งธ ์์น๋ง ๋ฐํํจ
- 0๋ถํฐ ์
(
if
๋ฌธ ์ธ ๋ ์ฃผ์)
let hi = "Hi, guys. Nice to meet you.";
if (hi.indexOf("Hi")) {
console.log("์ ๊ฒฐ๊ณผ๊ฐ 0์ด๊ณ , 0์ if๋ฌธ์์ false์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ฅ์ด ์ฐํ์ง ์์");
}
// โ
if (hi.indexOf("Hi")) > -1 {
console.log("์ ๊ฒฐ๊ณผ๊ฐ true์ฌ์ ์ด ๋ฌธ์ฅ์ ๋ณผ ์ ์์");
}
str.slice(n, m)
- n๋ถํฐ m๊น์ง์ ๋ฌธ์๋ฅผ ๋ฐํ
- n์ ์์์ , m์ ๋์ฐฉ์ ์ธ๋ฐ, m ๋ฒ์งธ๋ฅผ ํฌํจํ์ง๋ ์์ (๊ทธ ์ ๊น์ง ์ )
- m์ด ์์ผ๋ฉด ๋ฌธ์์ด ๋๊น์ง ๋ฐํ
- ์์๋ฉด ๋์์๋ถํฐ ์
let desc = "abcdefg";
desc.slice(2) // "cdefg"
desc.slice(0, 5) // "abcde"
desc.slice(2, -2) // "cde"
str.substring(n, m)
str.slice(n, m)
๊ณผ ๋น์ทํ์ง๋ง n๊ณผ m์ ๋ฐ๊ฟ๋ ๋์ํจ- ์์๋ ์ธ์ํ์ง ์์์ 0์ผ๋ก ๋ฐ์๋ค์
str.substr(n, m)
: n๋ถํฐ ์์ํด m๊ฐ๋ฅผ ๋ฐํํ๋ฉฐ m ๋ฒ์งธ๋ฅผ ํฌํจํ์ง๋ ์๊ณ ๊ทธ ์ ๊น์ง ์ )str.trim()
- ์ ๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐ
- ์ฌ์ฉ์๋ก๋ถํฐ ๊ฐ์ ์ ๋ ฅ๋ฐ์ ๋ ์์ฃผ ์ฌ์ฉ
str.repeat(n)
: ๋ฌธ์์ด์ n๋ฒ ๋ฐ๋ณตํจstr.slice(n, m)
str.includes()
: ์์์ ์๊ด ์์ด ๊ดํธ ์์ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธ
4) ๋ฌธ์์ด ๋น๊ต
ASCII ํ๋๋ก ๋น๊ตํ ์ ์๋ค.
a < z, ์๋ฌธ์ < ๋๋ฌธ์
"a" < "c" // true
"a".codePointAt(0); // 97
String.fromCodePoint(97) // "a"
๋ฌธ์์ด์ ์ธ ์ ์๋ methods๋ฅผ ์ด์ฉํด ํ์ด๋ณด๊ธฐ
// ๐ต list์์ ์ซ์๋ฅผ ์ ์ธํ๊ณ ๋ฌธ์๋ง newList์ ๋ฐํํ๊ธฐ
let list = [
"01. ๋ค์ด๊ฐ๋ฉฐ",
"02. JS์ ์ญ์ฌ",
"03. ์๋ฃํ",
"04. ํจ์",
"05. ๋ฐฐ์ด"
];
let newList = [];
for (let i = 0 ; i < list.length ; i++) {
newList.push(list[i].slice(4));
}
console.log(newList); // ["๋ค์ด๊ฐ๋ฉฐ","JS์ ์ญ์ฌ","์๋ฃํ","ํจ์","๋ฐฐ์ด"]
// ๐ต hasCola์ ๋งค๊ฐ ๋ณ์์ ๊ธ์น์ด์ธ '์ฝ๋ผ'๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํ๊ธฐ
// (1)
function hasCola(str) {
if (str.indexOf("์ฝ๋ผ")) {
console.log("๊ธ์น์ด ์์");
} else {
console.log("ํต๊ณผ");
}
}
hasCola("์ฌ์ด๋ค๊ฐ ์งฑ์ด์ง"); // if๋ฌธ์์ -1์ true์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ "๊ธ์น์ด ์์"
hasCola("์ฌ์ด๋ค ์ง์ง ์ฝ๋ผ ์งฑ"); //
hasCola("์ฝ๋ผ"); // if๋ฌธ์์ 0์ false์ด๊ธฐ ๋๋ฌธ์ if์ ๋ชป ๋ค์ด๊ฐ๊ณ else๋ก ๋๊ฐ์ ธ์ "ํต๊ณผ"
// โ ๋ฐ๊ฟ์ฃผ๋ฉด
// (2)
function hasCola(str) {
if (str.indexOf("์ฝ๋ผ") > -1) {
console.log("๊ธ์น์ด ์์");
} else {
console.log("ํต๊ณผ");
}
}
hasCola("์ฌ์ด๋ค๊ฐ ์งฑ์ด์ง"); // "ํต๊ณผ"
hasCola("์ฌ์ด๋ค ์ง์ง ์ฝ๋ผ ์งฑ"); // "ํต๊ณผ"
hasCola("์ฝ๋ผ"); // "๊ธ์น์ด ์์"
// (3)
function hasCola(str) {
if (str.includes("์ฝ๋ผ")) {
console.log("๊ธ์น์ด ์์")
} else {
console.log("ํต๊ณผ");
}
}
hasCola("์ฌ์ด๋ค๊ฐ ์งฑ์ด์ง"); // "ํต๊ณผ"
hasCola("์ฌ์ด๋ค ์ง์ง ์ฝ๋ผ ์งฑ"); // "๊ธ์น์ด ์์"
hasCola("์ฝ๋ผ"); // "๊ธ์น์ด ์์"
7. array methods 01
1) ๋ณต์ต
push()
๋ค์ ์ฝ์ ,pop()
๋ค๋ฅผ ์ญ์ ,unshift()
์์ ์ญ์ ,shift()
์์ ์ญ์
2) ๊ทธ ์ธ methods
arr.splice(n, m)
: n ~ m์ ์์๋ฅผ ์ง์ (m ๋ฒ์งธ๋ฅผ ํฌํจํ์ง๋ ์์ (๊ทธ ์ ๊น์ง ์ ))arr.splice(n, m, x)
: n ~ m์ ์์๋ฅผ ์ง์ฐ๊ณ x๋ฅผ ์ถ๊ฐํจ
// ๐ต
// (1)
let arr = [1, 2, 3, 4, 5];
arr.splice(1, 3, 100, 200); // index 1๋ถํฐ 3๊น์ง๋ ์ง์ฐ๊ณ ๊ทธ ์๋ฆฌ์ 100๊ณผ 200์ ์ฝ์
console.log(arr); // [1, 100, 200, 5]
// (2) ๋ ๋ฒ์งธ ์ธ์์ 0์ ๋ฃ์ผ๋ฉด ์๋ฌด๊ฒ๋ ์ญ์ ๋์ง ์๊ณ ์ถ๊ฐ๋๊ธฐ๋ง ํจ
let arr = ["๋๋", "์ด๊ตญ์ข
", "์
๋๋ค."];
arr.splice(1, 0, "๋ํ๋ฏผ๊ตญ", "์์ฌ");
console.log(arr); // ["๋๋","๋ํ๋ฏผ๊ตญ","์์ฌ","์ด๊ตญ์ข
","์
๋๋ค."]
arr.splice()
: ์ญ์ ๋ ์์๋ฅผ ๋ฐํํจ
let arr = [1, 2, 3, 4, 5];
let result = arr.splice(1, 2);
console.log(arr); // [1, 4, 5]
console.log(result); // [2, 3]
arr.slice(n, m)
- n ~ m์ ์์๋ฅผ ๋ฐํ (m ๋ฒ์งธ๋ฅผ ํฌํจํ์ง๋ ์์ (๊ทธ ์ ๊น์ง ์ ))
- m์ ์ฐ์ง ์์ผ๋ฉด ๋ฐฐ์ด ๋๊น์ง ๋ฐํํจ
- ๊ดํธ ์์ ์๋ฌด๊ฒ๋ ์ ์ง ์์ผ๋ฉด ๋ฐฐ์ด์ด ๋ณต์ฌ๋จ
let arr = [1, 2, 3, 4, 5];
arr.slice(1, 4); // 2, 3, 4
arr.concat(arr2, arr3 ...)
: ์ธ์๋ก ์ฃผ์ด์ง ๋ฐฐ์ด์ด๋ ๊ฐ์ ํฉ์ณ์ ์ ๋ฐฐ์ด๋ก ๋ฐํํจ
let arr = [1, 2];
arr.contact([3, 4]); // [1, 2, 3, 4]
arr.contact([3, 4], [5, 6]); // [1, 2, 3, 4, 5, 6]
arr.contact([3, 4], 5, 6); // [1, 2, 3, 4, 5, 6]
arr.forEach(๐)
for
๋ฌธ์ด๋for ... of
๋ฌธ ์ธ์forEach
๋ก๋ ๋ฐ๋ณตํ ์ ์์- ๐์ ์ธ ๊ฐ์ ๋งค๊ฐ๋ณ์๊ฐ ์์
โ ํด๋น ์์
โก ํด๋น ์์์ index
โข ํด๋น ๋ฐฐ์ด ์์ฒด (์ฌ์ฉ ๋น๋ ๋ฎ์)
let arr = ["Ian", "Mai", "H & C"];
arr.forEach((name, index) => { // index๋ ์๋ตํด๋ ๋จ
console.log(`${index + 1}. ${name}`);
});
arr.indexOf
- ์ฒซ ๋ฒ์งธ๋ก ๋ฐ๊ฒฌํ ๋ฌธ์์ด์ index๋ฅผ ๋ฐํํจ (์์ผ๋ฉด '-1'์ ๋ฐํํจ)
- ์ธ์๊ฐ ๋ ๊ฐ์ผ ๋ ๋ ๋ฒ์งธ ์ธ์๋ ์ฐพ๊ธฐ ์์ํ๋ ์์น์ (index๊ฐ ๊ฑฐ๊ธฐ์๋ถํฐ๋ผ๋ ๋ง์ ์๋)
let arr = [1, 2, 3, 4, 5, 1, 2, 3];
arr.indexOf(3); // 2
arr.indexOf(3, 3) // 7
arr.lastIndexOf(3) // 7
arr.lastIndexOf()
: ๋ง์ง๋ง์ผ๋ก ๋ฐ๊ฒฌํ ๋ฌธ์์ด์ index๋ฅผ ๋ฐํํจ (์์ผ๋ฉด '-1'์ ๋ฐํํจ)arr.includes()
: index ์์ด ํฌํจํ๋์ง๋ง ํ์ธํ๊ณ ์ถ์ ๋ ์ฌ์ฉ (true or false)arr.find(๐)
- ์ฐพ๋๋ค๋ ์๋ฏธ๋ ๋์ผํ์ง๋ง ์กฐ๊ธ ๋ ๋ณต์กํ ์ฐ์ฐ์ ํ ์ ์์
- ์ฒซ ๋ฒ์งธ true๋ง ๋ฐํํ๊ณ ๋๋๋ฏ๋ก ์ฃผ์ํด์ผ ํจ
- ์์ผ๋ฉด undefined๋ฅผ ๋ฐํํจ
let arr = [1, 2, 3, 4, 5, 6];
const result = arr.find((item) => {
return item % 2 === 0;
});
console.log(result); // 2 (4์ 6์ ๋ฐํํ์ง ์์)
// ๐ต ๋ฏธ์ฑ๋
์์ธ user ๋ฐํํ๊ธฐ
let userList = [
{ name : "Mai", age: 37 },
{ name : "Ian", age: 38 },
{ name : "H & C", age: 7 }
];
const result = userList.find((user) => {
if (user.age < 19) {
return true;
}
return false;
});
console.log(result); // {"name": "H & C", "age": 7}
arr.findIndex(๐)
- ์ฐพ๋๋ค๋ ์๋ฏธ๋ ๋์ผํ์ง๋ง ์กฐ๊ธ ๋ ๋ณต์กํ ์ฐ์ฐ์ ํ ์ ์์
- ์์ผ๋ฉด index๋ฅผ ๋ฐํํ๊ณ , ์์ผ๋ฉด -1์ ๋ฐํํจ
- ์ฒซ ๋ฒ์งธ true๋ง ๋ฐํํ๊ณ ๋๋๋ฏ๋ก ์ฃผ์ํด์ผ ํจ
// ๐ต ๋ฏธ์ฑ๋
์์ธ user์ index ๋ฐํํ๊ธฐ
let userList = [
{ name : "Mai", age: 37 },
{ name : "Ian", age: 38 },
{ name : "H & C", age: 7 }
];
const result = userList.findIndex((user) => {
if (user.age < 19) {
return true;
}
return false;
});
console.log(result); // 2
arr.filter(๐)
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ชจ๋ ์์๋ฅผ ๋ฐํํจ
- ์ฌ์ฉ๋ฒ์
arr.find(๐)
์ ๋์ผํจ
const arr = [1, 2, 3, 4, 5, 6];
const result = arr.filter((item) => {
return item % 2 === 0;
});
console.log(result); // [2, 4, 6]
๐ง find
๋ ์ซ์๋ก ๋ฐํ๋๋๋ filter
๋ ๋ฐฐ์ด๋ก ๋ฐํ๋๋ค...? ๊ฐ์ array methods์ธ๋ฐ... 2์ [2]๋ ๊ฐ์ง ์์๋ฐ... ํท๊ฐ๋ฆฌ๊ฒ! ์ด๋ ๊ฒ ์ ํ ์ด์ ๊ฐ ์์ ํ
๋ฐ ๊ทธ๊ฒ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋คใ
ใ
๐ง
arr.reverse()
: ์ญ์์ผ๋ก ์ฌ์ ๋ ฌํจ (์ต๊ทผ์ ๊ฐ์ ํ user ์์ผ๋ก ์ ๋ ฌํ ๋, ์ต๊ทผ์ ์์ฑ๋ ๊ธ ์์ผ๋ก ์ ๋ ฌํ ๋ ์์ฃผ ์ฐ์)arr.map(๐)
: ํจ์๋ฅผ ๋ฐ์ ํน์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํจ
let userList = [
{ name : "Mai", age: 37 },
{ name : "Ian", age: 38 },
{ name : "H & C", age: 7 }
];
let newUserList = userList.map((user, index) => {
return Object.assign({}, user, {
id : index + 1,
isAdult : user.age > 19,
});
});
console.log(newUserList);
arr.join()
- ๋ฐฐ์ด์ ํฉ์ณ์ ๋ฌธ์์ด๋ก ๋ฐ๋ค ๋ ์ฌ์ฉํจ
- ์ธ์๋ก ๊ตฌ๋ถ์๋ฅผ ๋ฐ์
let arr = ["์๋
", "๋๋", "๋ฉ์ดํธ์ผ"];
let result = arr.join("โค๏ธ");
console.log(result); // "์๋
โค๏ธ๋๋โค๏ธ๋ฉ์ดํธ์ผ"
arr.split()
: ๋ฌธ์์ด์ ๋๋ ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ค
// (1)
const users = "Mai, Ian, H & C";
const result = users.split(",");
console.log(result); // ["Mai"," Ian"," H & C"]
// (2)
let str = "Hello, this is KARI.";
const result = str.split("");
console.log(result); // ["H","e","l","l","o",","," ","t","h","i","s"," ","i","s"," ","K","A","R","I","."]
Array.isArray()
- ๋ฐฐ์ด์ธ์ง ์๋์ง ํ๋จํ ๋ ์ฌ์ฉํจ
- JavaScript๋ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ผ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด์
typeof
๋ฅผ ์ ์ฉํ๋ฉด ๋ชจ๋
๊ฐ์ฒด๋ผ๊ณ ๋ฐํํ๋ฏ๋ก ๋ฐฐ์ด์ธ์ง ์๋์ง ์๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ๋จ
let me = {
name : "Mai",
age : 31
};
let us = ["Mai", "Ian", "H & C"];
console.log(typeof me); // "object"
console.log(typeof us); // "object"
console.log(Array.isArray(me)); // false
console.log(Array.isArray(us)); // true
8. array methods 02 - sort, reduce
arr.sort(๐)
- ๋ฐฐ์ด์ ์ฌ์ ๋ ฌํจ (๋ฐฐ์ด ์์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ฏ๋ก ์ฃผ์)
- ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์
// ๐ต '27, 8, 5, 13'์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ
let arr = [27, 8 , 5, 13];
arr.sort();
console.log(arr); // [13, 27, 5, 8] : ์์๋ฆฌ๊ฐ 1, 2์ฌ์ 13๊ณผ 27์ด ์์ ์ด
// โ
// (1) ํจ์๋ฅผ arr ์ธ๋ถ์ ์์ฑ
let arr [27, 8, 5, 13];
function fn(a, b) {
return a-b; // 'a-b'๊ฐ ์์๋ฉด a๊ฐ b ๋ค์, 0์ด๋ฉด ๊ทธ๋๋ก, ์์๋ฉด a๊ฐ b ์์ ์ค๋๋ก ์ ๋ ฌํ๊ธฐ ์ํด ํ์ํ ํจ์
}
arr.sort(fn);
console.log(arr); // [5, 8, 13, 27]
// (2) ํจ์๋ฅผ arr ๋ด๋ถ์ ์์ฑ
let arr [27, 8, 5, 13];
arr.sort((a-b) => {
// ์ฌ๊ธฐ์ 'console.log'๋ฅผ ์ฐ์ด๋ณด๋ฉด ๋ฐฐ์ด์ ์์๋ค์ด ๋ ์์ฉ ๋ฌถ์ฌ ์์ (์ ์ซ์๊ฐ a, ๋ค ์ซ์๊ฐ b)
return a-b;
});
console.log // [5, 8, 13, 27]
// (3) Lodash ํ์ฉ
// '<script src="lodash.js"></script>' ์์ฑํ๊ณ ์จ์ผ ํจ
let arr = [27, 8 , 5, 13];
_.sortBy(arr);
console.log(arr);// [5, 8, 13, 27]
- arr.reduce(๐)
- (๋์ ๊ณ์ฐ ๊ฐ, ํ์ฌ ๊ฐ) => { return ๊ณ์ฐ ๊ฐ };
- ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์
arr.map(๐)
์ด๋arr.filter(๐)
๋์ ์จ์ ๋ฐฐ์ด์ ๋ฐํํ ์ ์์
// ๐ต ๋ฐฐ์ด์ ๋ชจ๋ ์ ํฉ์น๊ธฐ
let arr = [1, 2, 3, 4, 5];
const result = arr.reduce((prev, crr) => {
return prev + crr;
}, 0); // ์ฌ๊ธฐ์์ '0'์ ์ด๊ธฐ๊ฐ์ธ๋ฐ, ์ํ๋ ๊ฒ์๋ก ๋ฐ๊พธ์ด๋ ๋จ e.g. 100, [] ๋ฑ
console.log(result); // 15
// ๐ต ์ฑ์ธ์ ์ด๋ฆ๋ง ๋์ถํ๊ธฐ
let userList = [
{ name : "Ian", age: 45 },
{ name : "Mai", age: 44 },
{ name : "H", age: 18 },
{ name : "C", age: 16 }
];
let result = userList.reduce((prev, cur) => {
if (cur.age > 18) {
prev.push(cur.name);
}
return prev;
}, []);
console.log(result); // ["Ian","Mai"]
// ๐ต ์ฌ์ฉ์์ ๋์ด์ ํฉ ๊ตฌํ๊ธฐ
let userList = [
{ name : "Ian", age: 45 },
{ name : "Mai", age: 44 },
{ name : "H", age: 18 },
{ name : "C", age: 16 }
];
let result = userList.reduce((prev, cur) => {
return (prev += cur.age);
}, 0);
console.log(result); // 123
// ๐ต ์ด๋ฆ์ ๊ธธ์ด๊ฐ ์ธ ๊ธ์์ธ ์ฌ๋ ๊ตฌํ๊ธฐ
let userList = [
{ name : "Ian", age: 45 },
{ name : "Mai", age: 44 },
{ name : "H", age: 18 },
{ name : "C", age: 16 }
];
let result = userList.reduce((prev, cur) => {
if (cur.name.length === 3) {
prev.push(cur.name);
} return prev;
}, []);
console.log(result); // ["Ian","Mai"]
cf. arr.reduceRight()
๋ arr.reduce
์ ๋น์ทํ๋ ๋ฐฐ์ด์ ๋์์๋ถํฐ ์์๋จ
9. destructuring assignment
- ์ ์
- ๊ตฌ์กฐ ๋ถํด ํ ๋น ๊ตฌ๋ฌธ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ๋ถํดํด์ ๊ทธ ๊ฐ์ ๋ณ์์ ๋ด์ ์ ์๊ฒ ํ๋ ํํ์
- ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด
let str = "Ian - Mai - H - C";
let [user1, user2, user3, user4] = str.split(" - ");
console.log(user1); // "Ian"
console.log(user2); // "Mai"
console.log(user3); // "H"
console.log(user4); // "C"
- ๊ธฐ๋ณธ ๊ฐ
- ๊ธฐ๋ณธ ๊ฐ์ด ์์ผ๋ฉด ๊ฐ์ด ์์ ๋ 'undefined'๋ฅผ ๋ฐํํ๋ฏ๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์์
let [a, b, c] = [1, 2];
console.log(a); // 1
console.log(b); // 2
console.log(c); // undefined
// โ
let [a=3, b=4, c=5] = [1, 2];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 5
- ๊ณต๋ฐฑ๊ณผ comma๋ฅผ ์ด์ฉํ ๋ฐํ ๊ฐ ๋ฌด์
let [user1, , user2, user3, user4] = ["Ian", "Krystal", "Mai", "H", "C"];
console.log(user1); // "Ian"
console.log(user2); // "Mai"
console.log(user3); // "H"
console.log(user4); // "C"
- ๊ฐ์ฒด ๊ตฌ์กฐ ๋ถํด
let user = {name: "Mai", age: 30};
let {name, age} = user; // 'let {age, name} = user;'๋ผ๊ณ ์์๋ฅผ ๋ฐ๊ฟ๋ 'let name = user.name, let age = user.age'์ธ ๊ฒ์ ๋ณํจ ์์
console.log(name); // "Mai"
console.log(age); // 30
- key ๋ณ๊ฒฝ ๊ฐ๋ฅ
let user = {name: "Mai", age: 30};
let {name:userName, age:userAge} = user;
console.log(userName); // "Mai"
console.log(userAge); // 30
- ๊ธฐ๋ณธ ๊ฐ
- ๊ธฐ๋ณธ ๊ฐ์ด ์์ผ๋ฉด ๊ฐ์ด ์์ ๋ 'undefined'๋ฅผ ๋ฐํํ๋ฏ๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์์
- ๊ฒฐ๊ณผ๊ฐ 'undefined'์ผ ๋๋ง ๊ธฐ๋ณธ ๊ฐ์ด ์ฌ์ฉ๋๋ฏ๋ก ์ด๋ฏธ ๊ฐ์ฒด์ ๊ฐ์ด ์๋ค๋ฉด ๊ธฐ๋ณธ ๊ฐ์ ๋ฌด์๋จ
let user = {name: "Mai", age: 30};
let {name, age, gender} = user;
console.log(name); // "Mai"
console.log(age); // 30
console.log(gender); // undefined
// โ
let user = {name: "Mai", age: 30};
let {name, age, gender = "gender"} = user;
console.log(name); // "Mai"
console.log(age); // 30
console.log(gender); // "gender"
10. rest parameters, spread syntax
- arguments๋ฅผ ์ฌ์ฉํด๋ ๋๋ ES6์์ ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํจ
- ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ ์ ํด์ง์ง ์์ ๊ฐ์์ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ํ๋
- arguments์ ๋ฌ๋ฆฌ ๋ฐฐ์ด methods๋ฅผ ์ฌ์ฉํ ์ ์์
- ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ฅผ ํญ์ ๋ง์ง๋ง์ ์์ด์ผ ํจ
function showName(...names){
console.log(names);
}
showName(); // []
showName("Ian"); // ["Ian"]
showName("Ian, Mai"); // ["Ian", "Mai"]
// ๐ต ์ ๋ฌ ๋ฐ์ ์ ๋ชจ๋ ๋ํ๊ธฐ (1)
function add(...numbers) {
let result = 0; // ์ด๊ธฐ ๊ฐ์ 0
numbers.forEach((num) => (result += num));
console.log(result);
}
add(1, 2, 3); // 6
add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 55
// ๐ต ์ ๋ฌ ๋ฐ์ ์ ๋ชจ๋ ๋ํ๊ธฐ (2)
function add(...numbers) {
let result = numbers.reduce((prev, cur) => prev + cur);
console.log(result);
}
add(1, 2, 3); // 6
add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 55
// ๐ต user ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ์์ฑ์ ํจ์ ๋ง๋ค๊ธฐ
function User(name, age, ...skills) {
this.name = name;
this.age = age;
this.skills = skills;
}
const user1 = new User("Ian", 30, "TS", "React");
const user2 = new User("Mai", 29, "Three", "React");
const user3 = new User("H", 16, "English");
const user4 = new User("C", 14, "French");
console.log(user1);
console.log(user2);
console.log(user3);
console.log(user4);
- ์ ๊ฐ ๊ตฌ๋ฌธ
arr.push()
,arr.splice()
,arr.concat9)
์ด๋ฐ method๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ๊ฑฐ๋ก์ด๋ฐ ์ ๊ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ฌ์- ๊ฐ์ฒด์์๋
Object.assign
์ธ ํ์ ์์
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let result = [...arr1, ...arr2]; // '...arr1' = 1, 2, 3์ด๊ณ '...arr2' = 4, 5, 6
console.log(result); // [1, 2, 3, 4, 5, ,6]
// ๐ต arr1์ [4, 5, 6, 1, 2, 3]์ผ๋ก ๋ง๋ค๊ธฐ
// (1)
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
arr2.reverse().forEach((num) => {
arr1.unshift(num);
});
console.log(arr1);
// (2)
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
arr1 = [...arr2, ...arr1];
console.log(arr1);
// ๐ต fe์ lang์ skills๋ก ํ์ฌ ๊ฐ์ฒด ๋ง๋ค๊ธฐ
// (1)
let user = { name: "Mai"};
let info = { age: 30 };
let fe = ["Three", "React"];
let lang = ["Korean", "English"];
user = Object.assign({}, user, info, {
skills: [],
});
fe.forEach((item) => {
user.skills.push(item);
});
lang.forEach((item) => {
user.skills.push(item);
});
console.log(user);
// (2)
let user = { name: "Mai"};
let info = { age: 30 };
let fe = ["Three", "React"];
let lang = ["Korean", "English"];
user = {
...user,
...info,
skills : [
...fe, ...lang],
};
console.log(user);
11. closure
โป ๋ณ์, hoisting, ํจ์ ์ ์ธ๋ฌธ์ ํน์ง์ ๋ํ ์ ํ ํ์ต ํ์
- ์ ์
- ํจ์์ ์ดํ์ ํ๊ฒฝ (lexical environment) ์ ์กฐํฉ (JS๋ ์ดํ์ ํ๊ฒฝ์)
- ํจ์๊ฐ ์์ฑ๋ ๋น์์ ์ธ๋ถ ๋ณ์๋ฅผ ๊ธฐ์ตํ๋ฉฐ, ์์ฑ๋ ์ดํ์๋ ๊ณ์ํด์ ๊ทธ ๋ณ์์ ์ ๊ทผํ ์ ์์ (์ธ๋ถ ํจ์์ ์คํ์ด ๋๋์ ์ธ๋ถ ํจ์๊ฐ ์๋ฉธ๋ ์ดํ์๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ์ ๊ทผํ ์ ์์)
๐ง ์ค... ์ด๋ ต๋ค.. ๋ค์ ๋ด์ผ๊ฒ ๋ค... ๐ง
function makeCounter() {
let num = 0; // 2๏ธโฃ ๊ทธ ์ซ์๋ ์ธ๋ถ ํจ์์ ๋ณ์์, 5๏ธโฃ '์๋ํ'์ ์ฑ๊ณตํ ๊ฒ (์ค์ง counter๋ฅผ ์ฆ๊ฐ์ํค๊ณ ๋ฐํ๋ฐ์ ์๋ง ์์)
return function () {
return num++;
};
}
let counter = makeCounter(); // 1๏ธโฃ counter์ makeCounter๊ฐ returnํ๋ ํจ์์ธ function () { return num++; };์ ๋ฃ์, ์ด ํจ์๋ ์ซ์๋ฅผ ๋ฐํํ๋๋ฐ 4๏ธโฃ ์ด๋ ๊ฒ counter๊ฐ ์์ฑ๋ ์ดํ์ ๊ณ์ ๊ธฐ์ตํ๊ณ ์๊ธฐ ๋๋ฌธ์ 0, 1, 2, ์ด๋ ๊ฒ ์ฆ๊ฐํ ์ ์๋ ๊ฒ์
console.log(counter()); // 0 3๏ธโฃ ์ด๊ธฐ ๊ฐ์ธ 0 ์ดํ์ 1์ฉ ๋ํด์ง๋ ๊ฑด ๋ด๋ถ ํจ์์์ (return num++) ์ธ๋ถ ํจ์์ธ makeCounter() { let num = 0; ์ฆ ์ธ๋ถ ํจ์์ num์ ์ ๊ทผํ๋ ๊ฒ
console.log(counter()); // 1
console.log(counter()); // 2
12. scheduling functions - setTimeout, setInterval
- ๊ณตํต ํน์ง
- ํ์ฌ ์คํ ์ค์ธ script๊ฐ ์ข ๋ฃ๋ ํ scheduling ํจ์๋ฅผ ์คํํจ
- brower๋ ๊ธฐ๋ณธ์ ์ผ๋ก 4ms ์ ๋์ ๋๊ธฐ ์๊ฐ์ด ์์ด์ time์ด 0์ด์ด๋ ๋ฐ๋ก ์คํ๋์ง ์์ ์ ์์
setTimeout(๐, time);
- ์ผ์ ์๊ฐ์ด ์ง๋ ํ ํจ์๋ฅผ ์คํ
- ์ธ์๊ฐ ํ์ํ๋ฉด 'time' ๋ค์ ๊ธฐ์ฌ
// ๐ต ํจ์๋ฅผ 3์ด ํ์ ์คํํ๊ธฐ
function fn() {
console.log(3)
}
setTimeout(fn, 3000); // 3000๋ 3์ด์
// โ ์ด๋ ๊ฒ ์ ์ด๋ ๋จ
setTimeout(function() {
console.log(3)
}, 3000);
// ๐ต ์ธ์ ์ถ๊ฐํ๊ธฐ
function showName(name) {
console.log(name);
}
setTimeout(showName, 3000, "Mai"); // ์์๋๋ก ํจ์, ์๊ฐ, ์ธ์์ด๋ฉฐ ์ด ์ธ์๋ showName ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์ (name) ๋ก ์ ๋ฌ๋จ
clearTimeout(tId)
: ์์ ๋ ์์ ์ ์์ฐ
// ๐ต showName ํจ์ ์คํํ์ง ์๊ธฐ
const tId = function showName(name) {
console.log(name);
clearTimeout(tId);
}
setTimeout(showName, 3000, "Mai");
๐ง mozilla๋ฅผ ๋ณด๋ cancel property๊ฐ์ ๊ณณ์ ์ฌ์ฉํ๋ ๋ฏํจ ๐ง
setInterval
- ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ํจ์๋ฅผ ๋ฐ๋ณต
setTimeout
๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ ๋์ผ- ๋ฐ๋ณต์ ์ค๋จํ๋ ค๋ฉด
clearInterval(tId)
๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ
// ๐ต 3์ด๋ง๋ค Mai ๋์ค๊ฒ ํ๊ธฐ
function showName(name) {
console.log(name);
}
const tId = setInterval(showName, 3000, "Mai");
// ๐ต ์ฌ์ฉ์๊ฐ ์ ์ํ ์ง ์ผ๋ง๋ ์ง๋ฌ๋์ง 1์ด์ ํ ๋ฒ์ฉ 5์ด ๋์ ๋ถ๋ฌ์ค๊ธฐ
let num = 0;
function showTime() {
console.log(`์ ์ํ ์ง ${num++}์ด๊ฐ ์ง๋ฌ์ต๋๋ค.`);
if (num > 5) {
clearInterval(tId);
}
}
const tId = setInterval(showTime, 1000);
13. this ๊ฐ์ ๋ฐ๊พธ๋ ํจ์๋ค - call, apply, bind
JS์์๋ ํจ์๋ฅผ ์ด๋์์ ์ด๋ป๊ฒ ํธ์ถํ๋์ง์ ์๊ด ์์ด this
๊ฐ ๋ฌด์์ธ์ง ์ง์ ํ ์ ์๋ค.
call
- ๋ชจ๋ ํจ์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ,
this
๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ง์ ํ ์ ์์ - ์ฐจ๋ก๋๋ก ๋งค๊ฐ๋ณ์์ ๋ค์ด๊ฐ์ผ ํจ
- ๋ชจ๋ ํจ์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ,
// ๐ต ์ด๋ฆ ๋ถ๋ฌ์ค๊ธฐ
const mai = {
name : "Mai",
};
const ian = {
name : "Ian",
};
function showThisName() {
console.log(this.name);
}
showThisName(); // (๋น ๊ฐ) : ์ฌ๊ธฐ์์ this๋ window๋ฅผ ๊ฐ๋ฆฌํค๋๋ฐ, window.name์ ๋น ๊ฐ์ด๋ผ์ ์๋ฌด๊ฒ๋ ๋จ์ง ์์
showThisName.call(mai) // Mai : ์ด๋, ํจ์๋ฅผ ํธ์ถํ๋ฉด์ call์ ์ฌ์ฉํ๊ณ this๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ธ mai๋ฅผ ์ ๋ฌํ๋ฉด ํด๋น ํจ์๊ฐ ์ฃผ์ด์ง ๊ฐ์ฒด์ method์ธ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์์. call์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ this๋ก ์ฌ์ฉํ ๊ฐ์ด๊ณ , ๋งค๊ฐ๋ณ์๊ฐ ๋ ์์ผ๋ฉด ๊ทธ ๋งค๊ฐ๋ณ์๋ก ํธ์ถํ๋ ํจ์๋ก ์ ๋ฌ๋จ (this๊ฐ mai๊ฐ ๋ ๊ฒ)
showThisName.call(ian) // Ian : this๊ฐ ian์ด ๋จ
// ๐ต ์ด๋ฆ์ ์ฃผ์์ ์ง์
์ถ๊ฐํ๊ธฐ
const mai = {
name : "Mai",
};
const ian = {
name : "Ian",
};
function update(address, occupation) { // update๋ address์ occupation์ ๋ฐ์์ ๊ฐ์ฒด ์ ๋ณด๋ฅผ ์๋ก์ด date๋ก updateํด์ค
this.address = address;
this.occupation = occupation;
};
update.call(mai, "Swiss", "professor"); // ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ this๋ก ์ฌ์ฉ๋ ๊ฐ, ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ๋ ํจ์๊ฐ ์ฌ์ฉํ ๋งค๊ฐ๋ณ์๋ฅผ ์์๋๋ก ๊ธฐ์ฌํ ๊ฒ
console.log(mai);
update.call(ian, "Italy", "photographer");
console.log(ian);
apply
- ํจ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ธํ๋ฉด
call
๊ณผ ๋์ผํจ call
์ ์ผ๋ฐ์ ์ธ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ง๋ง,apply
๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์apply
๋ ๋ฐฐ์ด ์์๋ฅผ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ๋ ์ฉ์ดํจ- ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋ฐฐ์ด์ ์ ๋ฌํ๋ฉด ์ฐจ๋ก๋๋ก ๊ทธ ๋ฐฐ์ด์ ์์๋ค์ ์ธ์๋ก ์ฌ์ฉํจ
- ํจ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ธํ๋ฉด
// ๐ต ์์ ๋์ผํ ๊ฐ์ ์ป๋ call์ด ์๋ apply ์ฌ์ฉํ๊ธฐ
const mai = {
name : "Mai",
};
const ian = {
name : "Ian",
};
function update(address, occupation) {
this.address = address;
this.occupation = occupation;
};
update.call(mai, ["Swiss", "professor"]); // ๋ฐฐ์ด๋ก ์ ์ด์ผ ํจ
console.log(mai);
update.call(ian, ["Italy", "photographer"]); // ๋ฐฐ์ด๋ก ์ ์ด์ผ ํจ
console.log(ian);
// ๐ต ๋ค์ ์์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
const nums = [3, 10, 1, 6, 4];
// (1)
const minNum = Math.min(...nums);
const maxNum = Math.max(...nums);
// (2)
const minNum = Math.min.call(null, ...nums);
const maxNum = Math.max.call(null, ...nums);
// = Math.max.apply(null, [3, 10, 1, 6, 4])
// (3)
const minNum = Math.min.apply(null, nums);
const maxNum = Math.max.apply(null, nums);
// = Math.max.call(null, 3, 10, 1, 6, 4)
console.log(minNum);
console.log(maxNum);
bind
: ํจ์์ this ๊ฐ์ ์๊ตฌํ ๋ฐ๊ฟ ์ ์์
// ๐ต "hello, Mai" ๋์ถํ๊ธฐ
const user = {
name: "Mai",
showName: function () {
console.log(`hello, ${this.name}`);
},
};
// (1)
user.showName(); // "hello, Mai"
let fn = user.showName;
fn(); // ๋ฐ๋ฉด ์ด๋ ๊ฒ ํ๋ฉด "hello, "๋ง ๋์ค๋๋ฐ ๊ทธ ์ด์ ๋ method๋ ์ ์์ ์๋ ๊ฒ this์ธ๋ฐ ์์์ (let fn = ) fn์ ํ ๋นํ ๋ this๋ฅผ ์์ด๋ฒ๋ ธ๊ณ ํธ์ถํ ๋ fn()๋ง ํธ์ถํ๋๊น this๊ฐ ์๋ ๊ฒ
//(2)
fn.call(user); // "hello, Mai"
// (3)
fn.apply(user); // "hello, Mai"
// (4)
let boundFn = fn.bind(user);
boundFn(); // "hello, Mai"
๐ง ์ ๊ทธ๋ฅ fn.bind(user);
๋ ์ ๋์ง? ๐ง
14. ์์, prototype
์ถ์ฒ : ์๋ฐ์คํฌ๋ฆฝํธ ์ค๊ธ ๊ฐ์ข #14 ์์, ํ๋กํ ํ์
(Prototype)
// ๐ต for ... in์ผ๋ก ๊ฐ์ฒด์ property ์ํํ๊ธฐ
const car = {
wheels: 4,
drive() {
console.log("drive..");
},
};
const bmw = {
color: "red",
navigation: 1,
};
bmw.__proto__ = car; // bmw ๋ณ์์๋ ์์ง๋ง car์ ์๋ wheels์ drive ์ ๋ณด๋ bmw๊ฐ ๊ฐ๊ฒ ๋จ
const x5 = {
color: "white",
name: "x5",
};
x5.__proto__ = bmw;
for(p in x5) {
console.log(p);
}
// โฌ๏ธ Output
// "color"
// "name"
// "navigation"
// "wheels"
// "drive"
// ํ์ง๋ง key, value ๋ฑ ๊ฐ์ฒด ๊ด๋ จ method๋ ์์๋ property๋ ์ ๋์ด
Object.keys(x5); // ["color", "name"]
Object.values(x5); // ["white", "x5"]
// ๐ต for ... in์ผ๋ก ๊ฐ์ฒด์ property ์ ๋ฌด ํ์ธํ๊ธฐ
for (p in x5) {
if (x5.hasOwnProperty(p)) {
console.log("o", p);
} else {
console.log("x", p);
}
}
// โฌ๏ธ Output
// "o" "color"
// "o" "name"
// "x" "navigation"
// "x" "wheels"
// "x" "drive"
// ๐ต ๋น์ทํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์๋ ์์ฑ์ ํจ์์ ์ฌ์ฉํ๊ธฐ
const car = {
wheels: 4.
drive() {
console.log("drive..");
},
};
const Bmw = function (color) {
this.color = color;
};
const x5 = new Bmw("red");
const z4 = new Bmw("blue");
x5.__proto__ = car;
z4.__proto__ = car;
// โ ๊ฐ์ ๋์์ธ๋ฐ ์ผ์ผ์ด '__proto__' ์ ์จ๋ ๋๊ฒ code ๋ณ๊ฒฝ
const Bmw = function (color) {
this.color = color;
};
Bmw.prototype.wheels = 4;
Bmw.prototype.drive = function () {
console.log("drive..");
};
const x5 = new Bmw("red");
const z4 = new Bmw("blue");
instanceof
- ์์ฑ์ ํจ์๊ฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๊ทธ ๊ฐ์ฒด๋ ์์ฑ์์ instance๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ, ์ด๋ฅผ ํ์ธํ ์ ์๋ ์ฐ์ฐ์์
- ๊ฐ์ฒด์ ์์ฑ์๋ฅผ ๋น๊ตํ๊ณ , ๊ฐ์ฒด๊ฐ ๊ทธ ์์ฑ์๋ก๋ถํฐ ์์ฑ๋ ๊ฒ์ธ์ง ํ์ธํ ์ ์์
const Bmw = function (color) {
this.color = color;
};
Bmw.prototype.wheels = 4;
Bmw.prototype.drive = function () {
console.log("drive..");
};
const x5 = new Bmw("red");
const z4 = new Bmw("blue");
z4 instanceof Bmw // true
z4.constructor === Bmw // true : ์์ฑ์๋ก ๋ง๋ค์ด์ง instance ๊ฐ์ฒด์๋ constructor๋ผ๋ property๊ฐ ์กด์ฌํจ
// โ ๊ฐ์ ๋์์ธ๋ฐ ํ ๋ฒ์ ์ฐ๋๋ก code๋ฅผ ๋ณ๊ฒฝ...ํ ์ ์์ผ๋ ์ด๋ ๊ฒ ๋ฎ์ด์ฐ๊ธฐ ํ๋ฉด constructor๊ฐ ์ฌ๋ผ์ง. ๊ทธ๋์ ์์ ๊ฐ์ด ์ฐ๋ ์ง, ์๋๋ฉด ๋ฐ๋ก constructor๋ฅผ ์ ์ด์ฃผ์ด์ผ ํจ. ์ฆ JS๋ constructor๋ฅผ ๋ช
ํํ๊ฒ ๋ณด์ฅํ์ง ์์์ ๊ฐ๋ฐ์์ ์ํด ์ธ์ ๋ ์์ ๋ ์ ์์.
Bmw.prototype = {
constructor: Bmw, // ์ถ๊ฐ๋ก ์ ์ ๊ฒ
wheels: 4,
drive() {
console.log("drive..");
},
};
// ๐ต closure๋ฅผ ์ฌ์ฉํด ์ด๊ธฐ์ ์ค์ ํ color ๊ฐ์ ๋ฐ์ ์๋ง ์๊ณ ๋ณ๊ฒฝ์ ๋ชป ํ๊ฒ ํ๊ธฐ
const Bmw = function (color) {
this.color = color;
};
const x5 = new Bmw("red");
// ์ code๋ x5.color = "black" ๋ฑ์ผ๋ก color๋ฅผ ๋ฐ๊ฟ ์ ์์
// โ closure๋ฅผ ์จ์ ๋ณ๊ฒฝํ๋ฉด
const Bmw = function (color) {
const c = color;
this.getColor = function () {
console.log(c);
};
};
const x5 = new Bmw("red"); //getColor ํจ์๊ฐ ์์ฑ๋ ๋น์์ context ๊ธฐ์ตํ๊ณ ์์
15. class
class
- ์์ฑ์ ํจ์์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์
- ์์ฑ์ ํจ์์ ๋ฌ๋ฆฌ
new
๋ฅผ ์์ฑํ์ง ์์์ ๋ "undefined"์ ๊ทธ์น๋ ๊ฒ ์๋, "TypeError"๊ฐ ๋ฐ์ํจ (error๋ฅผ ์ธ์งํ ์ ์์) - ์์ฑ์ ํจ์์ ๋ฌ๋ฆฌ constructor์ class๋ผ๋ ๊ฒ ๋ช ์๋จ
for ... in
๋ฌธ์์ ์ ์ธ๋จ- ์์ ์
extends
keyword๋ฅผ ์ฌ์ฉํจ - ES6์์ ์ถ๊ฐ๋จ
// ๐ต class๋ก car๋ฅผ ๋ง๋ค๊ณ extends๋ก bmw์ ์์ํ๊ธฐ
class Car {
constructor(color) {
this.color = color;
this.wheels = 4;
}
drive() {
console.log("drive..");
}
stop() {
console.log("STOP!");
}
}
class Bmw extends Car {
park() {
console.log("PARK");
}
}
const z4 = new Bmw("blue"); // __proto__์ f park()๊ฐ ์๊ณ , __proto__์ __proto__์ drive์ stop์ด ์์
- method overriding
super
- ๋ง์ฝ Bmw์ Car์์ ์ ์ํ method์ ๋์ผํ method๊ฐ ์กด์ฌํ๋ค๋ฉด, Bmw์ method๊ฐ ๋์ด (Bmw์ method๊ฐ Car์ method๋ฅผ ๋ฎ์ด์ด ๊ฒ)
- ์ด๋ ๊ฒ ๋์ผํ method๊ฐ ์์ ๋, Bmw์ ๊ฒ์ด Car์ ๊ฒ์ ๋ฎ์ด์ฐ๋ ๊ฒ ์๋, ํฉ์ณ์ ํ์ฅํ๊ณ ์ถ๋ค๋ฉด super๋ฅผ ์ฌ์ฉ
// ๐ต ์์ class์ ์๋ ํจ์๋ ์ฌ์ฉํ๊ณ , ๋ถ๋ชจ class์ ์๋ ํจ์๋ ์ฌ์ฉํ๊ธฐ
class Car {
constructor(color) {
this.color = color;
this.wheels = 4;
}
drive() {
console.log("drive..");
}
stop() {
console.log("STOP!");
}
}
class Bmw extends Car {
park() {
console.log("PARK");
}
stop() {
super.stop(); // ๋ถ๋ชจ class์ธ Car์ stopํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
console.log("OFF");;
}
}
const z4 = new Bmw("blue");
- constructor overriding
class Car {
constructor(color) {
this.color = color;
this.wheels = 4;
}
drive() {
console.log("drive..");
}
stop() {
console.log("STOP!");
}
}
class Bmw extends Car {
constructor(color) { // ์์ ์์ฑ์๋ ๋ถ๋ชจ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋ฏ๋ก constructor์ super์ ์ ์ด์ this.property๋ก ํ ๋นํด ์ฃผ์ด์ผ ํจ, constructor์ super์ color๋ฅผ ๋ฐ์ Car์ ๋๊ฒจ์ฃผ์ด์ผ z4์ color ์ ๋ณด๊น์ง ์ ๋์ด
super(color);
}
park() {
console.log("PARK");
}
}
const z4 = new Bmw("blue");
16. promise
promise
const pr = new Promise((resolve, reject) => { code });
- resolve : ์ฑ๊ณตํ ๊ฒฝ์ฐ
- reject : ์คํจํ ๊ฒฝ์ฐ
โ๏ธcallback ํจ์
: ์ด๋ค ์ผ์ด ์๋ฃ๋ ์ดํ์ ์คํํ๋ ํจ์
์ถ์ฒ : ์๋ฐ์คํฌ๋ฆฝํธ ์ค๊ธ ๊ฐ์ข #16 ํ๋ก๋ฏธ์ค(Promise)
// ๐ต 3์ด ํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ํจ์ ๋ณด์ฌ์ฃผ๊ธฐ
const pr = new Promsie ((resolve, reject) => {
setTimeout(() => {
resolve("OK")
}, 3000)
});
pr.then(
function (result) {}, // ์ดํ๋์์ ๋ ์คํ
function (reject) {} // ๊ฑฐ๋ถ๋์์ ๋ ์คํ
finally () {} // ์ดํ์ด๋ ๊ฑฐ๋ถ๋ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ์คํ
);
// โ ์๋์ ๊ฐ์ด ์ ๋ ๊ฒ ๊ฐ๋
์ฑ์ ์ข๊ณ , ์ฒซ ๋ฒ์งธ ํจ์๋ฅผ ์คํํ๋ค๊ฐ ๋๋ error๋ ์ก๊ธฐ ์ฌ์
const pr = new Promise ((resolve, reject) => {
setTimeout(() => {
resolve("OK")
}, 3000)
});
pr.then(
function (result) {},
).catch(
function (reject) {},
).finally(
function () {
console.log("--- ์ฃผ๋ฌธ ๋ ---") // loading ํ๋ฉด๊ฐ์ ๊ฑธ ์์จ ๋ ์ ์ฉํจ
}
)
// ๐ต 1๋ฒ๋ถํฐ 3๋ฒ๊น์ง ์์๋๋ก ์ ํ ์ฃผ๋ฌธํ๊ธฐ
// (1) callback hell ํ์์ผ๋ก ์์ฑ
const f1 = (callback) => {
setTimeout(function () {
console.log("1๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
callback();
}, 1000);
};
const f2 = (callback) => {
setTimeout(function () {
console.log("2๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
callback();
}, 3000);
};
const f3 = (callback) => {
setTimeout(function () {
console.log("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
callback();
}, 2000);
};
console.log("์์");
f1(function () {
f2(function () {
f3(function () {
console.log("๋");
});
});
});
// (2) promise chaining ํ์์ผ๋ก ์์ฑ (์ฝ 6์ด ์ ๋ ๊ฑธ๋ฆผ)
const f1 = () => {
return new Promise((res, rej) => {
setTimeout(() => {
res("1๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 1000);
});
};
const f2 = (message) => {
console.log(message);
return new Promise((res, rej) => {
setTimeout(() => {
res("2๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 3000);
});
};
const f3 = (message) => {
console.log(message);
return new Promise((res, rej) => {
setTimeout(() => {
res("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 2000);
});
};
console.log("์์");
f1()
.then((res) => f2(res))
.then((res) => f3(res))
.then((res) => console.log(res))
.catch(console.log)
.finally(() => {
console.log("๋");
});
// (3) Promise.all์ ์ฌ์ฉํ์ฌ ์์ฑ (์ธ ์ ํ์ด ๋์์ ์ฃผ๋ฌธ๋๋ฉด ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ฆฌ๋ ์ ํ์ ๋ดค์ ๋ ์ต๋ 3์ด๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ๋นจ๋ฆฌ ๋์ถ๋จ)
const f1 = () => {
return new Promise((res, rej) => {
setTimeout(() => {
res("1๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 1000);
});
};
const f2 = (message) => {
console.log(message);
return new Promise((res, rej) => {
setTimeout(() => {
res("2๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 3000);
});
};
const f3 = (message) => {
console.log(message);
return new Promise((res, rej) => {
setTimeout(() => {
res("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 2000);
});
};
console.time("x"); // ์๋ console.timeEnd()์ ๊ฐ์ด ์์ ์๊ฐ์ ์ธก์ ํ ์ ์์
Promise.all([f1(), f2(), f3()]) // f1(), f2(), f3()๊ฐ ๋ชจ๋ ์๋ฃ๋์ด์ผ then ๋ถ๋ถ์ด ์คํ๋จ
.then(res => {
console.log(res);
console.timeEnd("x");
});
Promise.all()
- ํ๋๋ผ๋ reject๊ฐ ์์ผ๋ฉด ์ ์ฒด๊ฐ ์คํ๋์ง ์์
- ํ๋์ ์ ๋ณด๋ผ๋ ๋๋ฝ๋๋ฉด ์ ์ฒด๋ฅผ ๋ณด์ฌ์ฃผ์ง ์์์ผ ํ ๋ ์ฌ์ฉ (๋ค ๋ณด์ฌ์ฃผ๊ฑฐ๋, ํ๋๋ ๋ณด์ฌ์ฃผ์ง ์๊ฑฐ๋)
Promise.race()
Promise.all()
์ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง๋ง,Promise.race()
๋ ํ๋๋ผ๋ 1๋ฑ์ผ๋ก ์๋ฃ๋๋ฉด ๋๋- ์ฉ๋์ด ํฐ image๋ค์ loadingํ๋๋ฐ ๊ทธ ์ค ํ๋๋ผ๋ ์๋ฃ๋๋ฉด ๊ทธ image๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉ
// ์ ์์ ์ ์ด์ด์
// (4)
Promise.race([f1(), f2(), f3()]) // f1(), f2(), f3()๊ฐ ๋ชจ๋ ์๋ฃ๋์ด์ผ then ๋ถ๋ถ์ด ์คํ๋จ
.then(res => {
console.log(res);
});
17. async, await
async
๋ away
๋ฅผ ํตํด promise
ํจ์๋ฅผ chain์ผ๋ก ํธ์ถํ๋ ๊ฒ๋ณด๋ค ๊ฐ๋
์ฑ์ด ์ข์์ง๋ค.
async
:function
์์ ๋ถ์ฌ์ฃผ๋ฉด ํญ์promise
๋ฅผ ๋ฐํํจ
// (1)
async function getName () {
return "Mai";
}
console.log(getName()); // Promise { 'Mai' }
getName().then((name) => {
console.log(name); // "Mai"
});
// (2)
async function getName () {
return Promise.resolve("Mai");
}
getName().then((name) => {
console.log(name); // "Mai"
});
// (3)
async function getName () {
throw new Error("err...");
}
getName().catch((err) => {
console.log(err); // Error: 'err...'
});
await
- ํญ์
async
ํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉํ ์ ์์ (๋ค๋ฅธ ๋ฐ์ error ๋ฐ์ํจ) await
ํจ์ ์์Promise
๊ฐ ์ค๊ณ , ์ด๊ฒ ๋ค ์ฒ๋ฆฌ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผPromise ... then
๋ณด๋คawait
๋ก ์ฐ๋ ๊ฒ ๊ฐ๋ ์ฑ์ด ๋ ์ข์
- ํญ์
// ๐ต 1์ด ํ์ "Mai"๊ฐ ์ฐํ
function getName(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(name);
}, 1000);
});
}
async function showName() {
const result = await getName("Mai");
console.log(result);
}
console.log("์์");
showName();
// ๐ต 1๋ฒ๋ถํฐ 3๋ฒ๊น์ง ์์๋๋ก ์ ํ ์ฃผ๋ฌธํ๊ธฐ
// (5) await, async๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ
const f1 = () => {
return new Promise((res, rej) => {
setTimeout(() => {
res("1๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 1000);
});
};
const f2 = (message) => {
console.log(message);
return new Promise((res, rej) => {
setTimeout(() => {
res("2๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
// rej(new Error("err..."));
}, 3000);
});
};
const f3 = (message) => {
console.log(message);
return new Promise((res, rej) => {
setTimeout(() => {
res("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
}, 2000);
});
};
console.log("์์");
async function order() {
try { // async await๋ฅผ ์ธ ๋ ์ค๋ฅ๋ฅผ ๋๋นํด ๊ฐ์ธ์ฃผ๋ try ... catch๋ฌธ
const result1 = await f1();
const result2 = await f2(result1);
const result3 = await f3(result2);
console.log(result3);
} catch (e) {
console.log(e); // ์ด ๋ถ๋ถ์์ ์ ์ ํ error๋ฅผ ์ฒ๋ฆฌํด์ฃผ๊ณ ๋์ด๊ฐ๋ฉด ๋จ
}
console.log("์ข
๋ฃ");
}
order();
// Promise.all๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ
// ์ ์์ ์ ์ด์ด์
console.log("์์");
async function order() {
try {
const result = await Promise.all([f1(), f2(), f3()]);
console.log(result);
} catch (e) {
console.log(e);
}
console.log("์ข
๋ฃ");
}
order(); // [ '1๋ฒ ์ฃผ๋ฌธ ์๋ฃ', '2๋ฒ ์ฃผ๋ฌธ ์๋ฃ', '3๋ฒ ์ฃผ๋ฌธ ์๋ฃ' ]
18. generator
- generator ๊ฐ์ฒด
- ํจ์์ ์คํ์ ์ค๊ฐ์ ๋ฉ์ท๋ค๊ฐ ์ฌ๊ฐํ ์ ์์
- ๋ค๋ฅธ ์์ ์ ํ๋ค๊ฐ ๋ค์ ๋์์์ next() ํด์ฃผ๋ฉด ์งํ์ด ๋ฉ์ท๋ ๋ถ๋ถ๋ถํฐ ์ด์ด์ ์คํ
- Redux Saga์์ ๋ง์ด ์ฐ์
function
๋ฐ๋ก ์์ '*'๋ฅผ ๋ถ์yield
์์ ํจ์์ ์ฌ์ฉ์ ๋ฉ์ถ ์ ์์next()
method๊ฐ ์์ผ๋ฉฐ ์ฌ์ฉํ๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด yield๊น์ง ๊ฐ๊ณ ๋ฉ์ถค- value์ done์ด๋ผ๋ property๋ฅผ ๊ฐ์ง
- value๋
yield
์ค๋ฅธ์ชฝ ๊ฐ์ (๊ฐ์ ์๋ตํ๋ฉด "undefined"์) - done : ํจ์๊ฐ ๋๋ฌ๋์ง ๋ํ๋ด๋ฉฐ ์คํ์ด ๋๋ฌ์ผ๋ฉด "true", ์ ๋๋ฌ์ผ๋ฉด "false"์
- value๋
next()
์ธ์return()
๊ณผthrow()
method๋ฅผ ๊ฐ์ง๊ณ ์์- ํจ์๊ฐ ๋๋๊ธฐ ์ ์ return() method๋ฅผ ์ฌ์ฉํ๋ฉด done์ด true๊ฐ ๋๋ฉฐ, ๊ทธ ์ดํ์ next method๋ฅผ ์คํํด๋ ๊ณ์ value๊ฐ undefine, done์ด true๊ฐ ๋จ
- ๋ฐ๋ณต์ด ๊ฐ๋ฅํจ (iterable)
Symbol.iterator
method๊ฐ ๊ตฌํ๋์ด ์์ด์ผ ํจ- ์ด method๋ก ํธ์ถํ ๊ฒฐ๊ณผ๊ฐ iterator์ธ๋ฐ, ์ด iterator๋ value์ done์ด๋ผ๋ property๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ method์ธ next๊ฐ ์์ด์ผ ํจ
- generator๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ง ์๊ณ ํ์ํ ๊ฐ๋ง ๊ทธ๋๋๋ ์์ฑํจ
- ์ผ๋ฐ์ ์ธ ํจ์๋ก๋ ์ด๋ค ๊ฐ์ ๊ตฌํ ๋ ๋ชจ๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํด ๋์ผ ํ๊ณ , ์ธ์ง ์ ์ธ์ง ์ ํด์ง์ง ์์ ์ํฉ์์๋ ๊ทธ ๊ฐ์ ์ ์งํด์ผ ํจ
- ํ์ํ ์๊ฐ๊น์ง ๊ณ์ฐ์ ๋ฏธ๋ฃจ๊ณ , ํ์ํ ๋ ์ฐ์ฐํด์ ๊ฐ์ ์ฃผ๊ธฐ ๋๋ฌธ์ memory ๊ด๋ฆฌ ์ธก๋ฉด์์ ํจ์จ์ ์
while (true)
๋ฌธ์ ์ฌ์ฉํ๋ฉด์break
๋ฅผ ์ฐ์ง ์์๋ ๋จ
- ํจ์์ ์คํ์ ์ค๊ฐ์ ๋ฉ์ท๋ค๊ฐ ์ฌ๊ฐํ ์ ์์
- โ๏ธ ๋ฐฐ์ด์ ๋ฐ๋ณต์ฑ
- ๋ฐฐ์ด๋ prototype์ ๋ณด๋ฉด "Symbol(Symbol.iterator)"๊ฐ ์์
- ๋ฐฐ์ด์ Symbol.iterator method๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด method๊ฐ ๋ฐํํ๋ ๊ฐ์ด iterator์์ด๋ฏ๋ก ๋ฐฐ์ด์ iterable (๋ฐ๋ณต ๊ฐ๋ฅํ) ๊ฐ์ฒด์
for ... of
๋ฌธ์ผ๋ก ์ํํ ์ ์์
// ๐ต it๋ผ๋ ๋ณ์ ์์ arr๊ฐ ๊ฐ์ง๊ณ ์๋ Symbol.iterator method๋ฅผ ์คํํ๊ธฐ
const arr = [1, 2, 3, 4, 5];
const it = arr[Symbol.iterator]();
it.next(); // {value: 1, done: false} ...
// ๐ต for ... of๋ฌธ์ผ๋ก ์ํํ๊ธฐ
for (let num of arr) {
console.log(num)
};
// ๐ต
function* fn() {
yield 4;
yield 5;
yield 6;
}
const a = fn();
a[Symbol.iterator]() === a; // true : a๋ผ๋ generator์ Symbol.iterator๋ผ๋ method๋ฅผ ์คํํ ๊ฐ์ด ์๊ธฐ ์์ ๊ณผ ๊ฐ๋ค๋ ๋ง
for (let num of a) { // for ... of๊ฐ ์์๋๋ฉด a[Symbol.iterator]()๋ฅผ ํธ์ถํ๊ณ ์ด๊ฒ ์์ผ๋ฉด error๊ฐ ๋ฐ์ํ ํ ๋ฐํ๋ iterator์ next method๋ฅผ ํธ์ถํ๋ฉด์ done์ด true๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํจ
console.log(num);
} // 4, 5, 6
// ๐ต next() method์ ์ธ์ ์ ๋ฌํ๊ธฐ
function* fn() {
const num1 = yield "์ฒซ ๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.";
console.log(num1);
const num2 = yield "๋ ๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.";
console.log(num2);
return num1 + num2;
}
const a = fn();
a.next() // {value: "์ฒซ ๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.", done: false}
a.next(4) // ์ธ์๊ฐ num1์ ์ ์ฅ๋จ, {value: "๋ ๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด ์ฃผ์ธ์.", done: false}
a.next(7) // ์ธ์๊ฐ num2์ ์ ์ฅ๋จ, {value: 7, done: true}
// ๐ต ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด๋ ๋ฌด๋ฆฌ ๊ฐ์ง ์๋ generator
function* fn() {
let index = 0;
while (true) {
yield index++;
}
}
const a = fn(); // a.next();๋ฅผ ์ฌ์ฉํ ๋๋ง ์ฐ์ฐ๋ผ์ break๊ฐ ์๋ ๋ฌดํ ๋ฐ๋ณต๋ฌธ์์๋ ๋ป์ง ์์
// ๐ต yield๋ก ๋ค๋ฅธ generator ๋ถ๋ฅด๊ธฐ
function* gen1() {
yield "W";
yield "O";
yield "R";
yield "L";
yield "D";
}
function* gen2() {
yield "Hello,";
yield* gen1();
yield "!";
}
console.log(...gen2()); // "Hello," "W" "O" "R" "L" "D" "!"
Endnote
๐ related documents
๐ the source of this content
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ช JavaScript w/ ์ฝ๋ฉ์๋ง (์ค๊ธ)), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@maimade/javascript04์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค