์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ ์ด์ ๋ฆฌํ
๐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์
- number, string, boolean,
- object(function, array, data, regexp),
- null, undefined
- Symbol
๐ getter & setter
- getter ๋ฉ์๋๋ obj.propName์ ์ฌ์ฉํด ํ๋กํผํฐ๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ ๋ ์คํ
- setter ๋ฉ์๋๋ obj.propName = value์ผ๋ก ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ๋ ค ํ ๋ ์คํ
let user = {
name: "John",
surname: "Smith",
get fullName() { //ํจ์๊ฐ ์๋๋ผ ๊ทธ๋ฅ ํ๋กํผํฐ. ํธ์ถํ๋ฉด getterํจ์๊ฐ ์คํ
return `${this.name} ${this.surname}`;
}
set fullName(value) { //ํจ์๊ฐ ์๋๋ผ ๊ทธ๋ฅ ํ๋กํผํฐ. ํธํํ๋ฉด setterํจ์๊ฐ ์คํ
[this.name, this.surname] = value.split(" ");
}
};
// ์ฃผ์ด์ง ๊ฐ์ ์ฌ์ฉํด set fullName์ด ์คํ๋ฉ๋๋ค.
user.fullName = "Alice Special"
alert(user.fullName); // Alice Special
alert(user.name); // Alice
alert(user.surname); // Special
์ด๋ ๊ฒ getter์ setter ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ๊ฐ์ฒด์ fullName์ด๋ผ๋ '๊ฐ์’์ ํ๋กํผํฐ๊ฐ ์๊น๋๋ค.
๊ฐ์์ ํ๋กํผํฐ๋ ์ฝ๊ณ ์ธ ์ ์์ง๋ง ์ค์ ๋ก๋ ์กด์ฌํ์ง ์์ต๋๋ค.
๐ label ๋ฌธ
์ด๋ฆํ ๋ก ์ง์ ๋ c์ธ์ด์ goto๋ฌธ ์ ๋๋ก ์๊ฐํด ๋์๋ฉด ๋ฉ๋๋ค.
๋ณดํต, ๋ ์ด๋ธ์ ๋ฐ๋ณต๋ฌธ์์ ์ฐ์ ๋๋ค. ๊ทธ๊ฒ๋ break์ continue ๋ฌธ๊ณผ ๊ฐ์ด ์ฐ์ด๊ฒ ๋์ฃ .
- break ๋ ์ด๋ธ๋ช ;
- continue ๋ ์ด๋ธ๋ช ;
for(var i = 0; i < a.length; i++){
for(var j = 0; j< a[i].length; j++){
document.write(a[i][j] + "<br>");
if(a[i][j] == 22){
break;
}
}
if(a[i][j] == 22){
break; // ์์ ํ ๋ฃจํ๋ฌธ์ ๋น ์ ธ๋์ค๋ ค๋ฉด ์กฐ๊ฑด์๊ณผ break๋ฌธ์ด ์ฌ๋ฌ๋ฒ ์ฐ์ด๊ฒ ๋๋ค.
}
}
outsideFor: // ๋ ์ด๋ธ
for(var i = 0; i < a.length; i++){
insideFor:
for(var j = 0; j< a[i].length; j++){
document.write(a[i][j] + "<br>");
if(a[i][j] == 22){
break outsideFor; // ๋จ ํ๋ฒ์ ์ฒ๋ฆฌ๋ก ์ค์ฒฉ ๋ฃจํ๋ฌธ์ ๋น ์ ธ๋์จ๋ค.
}
}
}
๐ var, let, const
์ค๋ณต ์ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ
var : ์ค๋ณตํด์ ์ ์ธ(+์ด๊ธฐํ)๊ฐ ๊ฐ๋ฅํ๋ค
const, let : ์ค๋ณต ์ ์ธ ๋ถ๊ฐ๋ฅ
โ
์ฌํ ๋น ๊ฐ๋ฅ ์ฌ๋ถ
var, let : ๊ฐ์ ์ฌํ ๋น์ด ๊ฐ๋ฅํ ๋ณ์๋ค.
const : ๊ฐ์ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ ์์๋ค.
* var ๋๋ let๊ณผ ๋ฌ๋ฆฌ, const ์ ์ธ์์๋ ๋ฐ๋์ ๊ฐ์ ์ ์ธ๊ณผ ๋์์ ์ ์ํด์ผ ํ๋ค
โ
๋ณ์ ์ค์ฝํ ์ ํจ๋ฒ์
var : ํจ์ ๋ด๋ถ์ ์ ์ธ๋ ๋ณ์๋ง ์ง์ญ ๋ณ์๋ก ์ธ์ ํ๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ
let, const : ๋ชจ๋ ๋ธ๋ก ๋ด๋ถ์์ ์ ์ธ๋ ๋ณ์๊น์ง ์ง์ญ๋ณ์๋ก ์ธ์ ํ๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ
โ
๋ณ์ ํธ์ด์คํ
๋ฐฉ์
var: ๋ณ์ ํธ์ด์คํ
์ด ๋ฐ์ํ๋ค. ๋ฐ๋ก undefined๊ฐ์ด ๋ค์ด๊ฐ๋ค.
let, const: ๋ณ์ ํธ์ด์คํ
์ด ๋ฐ์ํ๋ค. ํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. ๊ฐ์ด ๋ค์ด๊ฐ์ง ์๋๋ค.
โ
์ ์ญ๊ฐ์ฒด ํ๋กํผํฐ ์ฌ๋ถ
var : var๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ญ๊ฐ์ฒด(๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ๊ฒฝ์ฐ window)์ ํ๋กํผํฐ๋ค.
let, const : let/const ๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ญ๊ฐ์ฒด ํ๋กํผํฐ๊ฐ ์๋๋ค.
๐ ํ์ ๋ณํ
์ซ์ -> ๋ฌธ์์ด ๋ณํ
String(123);
123.toString()
๋ฌธ์์ด -> ์ซ์ ๋ณํ
Number("123")
parseInt("123")
parseFloat("123.1")
โ๊ฐ -> ๋ถ๋ฆฌ์ธ ๋ณํ
๋ณ์๋ฅผ !๋ก falseํ๊ณ ๋ค์ !๋ก ํ๋ฉด์, ๊ฐ์ ์ ์งํ๋ฉด์ ๋ถ๋ฆฌ์ธ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
!!a
๐ null, undefined, NaN, Infinity
undefined : ํด๋น ๋ณ์๊ฐ ๋น์ด์๋ ์ํ๋ฅผ ์๋ฏธํจ.
null : ๊ฐ์์ฒด๊ฐ ์๋ค๋ ์๋ฏธ๊ฐ ์๋๋ผ, ๊ฐ์ด๊ธด ํ๋ฐ ์ด๋ ํ ์ ํจํ ๊ฐ๋ ์๋๋ผ๋ ๊ฒ์ ์๋ฏธํจ.
NaN : number ํ์ ์ด๋ฉฐ, '์ซ์๊ฐ ์๋'์ ์๋ฏธํ๋ ์ซ์.
Infinity : number ํ์ ์ด๋ฉฐ, '๋ฌดํ๋'๋ฅผ ์๋ฏธํ๋ ์ซ์
๊ฐ | Boolean ๋ฌธ๋งฅ | Number ๋ฌธ๋งฅ | String ๋ฌธ๋งฅ |
null | false | 0 | "null" |
undefined | false | NaN | "undefined" |
NaN | false | NaN | "NaN" |
Infinity | true | Infinity | "Infinity" |
๊ฒฐ๋ก
1. typeof ์ฌ์ฉ์ undefined๋ undefined, null์ object, NaN์ number๊ฐ ๋ฐํ๋๋ค.
2. NaN==undefined๋ false๋ค.
3. NaN==null์ false๋ค.
4. null==undefined๋ true๋ค.
5. NaN๊ณผ null๊ณผ undefined๋ ์ผ๋ฐ์ ์ผ๋ก ๋น๊ตํ ๋ false๋ก ์ทจ๊ธํ๋ค.
6. null์ ์ซ์์ ๊ฒฝ์ฐ 0์ด ๋๋ค.
7. undefined๋ ์ซ์์ ๊ฒฝ์ฐ NaN์ด ๋๋ค.
6. NaN์ ๋น๊ต๋ isNaN์ผ๋ก ํ์ง ์๋๋ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ ์ ์๋ค.
๐ ๋ฐฐ์ด
/* ์์ฑ */
var arrLit = [1, true, "JavaScript"]; // ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
var arrObj = Array(1, true, "JavaScript"); // Array ๊ฐ์ฒด์ ์์ฑ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
var arrNewObj = new Array(1, true, "JavaScript"); // new ์ฐ์ฐ์๋ฅผ ์ด์ฉํ Array ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ
var arrNewObj = new Array(3); // ๋น ๋ฐฐ์ด length 3 ์์ฑ
/* ์ถ๊ฐ */
let animals = [
["๊ณ ์์ด", 1],
["๊ฐ์์ง", 2],
["๊ฐ๊ตฌ๋ฆฌ", 3],
];
animals.push(["์ฝ๋ผ๋ฆฌ", 4]); // animals[3]
animals.unshift(["ํ์คํฐ", 0]); // animals[0]
animals.splice(4, 0, ["๊ธฐ๋ฆฐ", 5]); // ๋ถ๋ชจ๋ฐฐ์ด ์ธ๋ฑ์ค [4]์ ์์ ๋ฐฐ์ด ์ธ๋ฑ์ค[0]์ ์ถ๊ฐ
/* ์ญ์ */
const numbersArr = ['zero', 'one', 'two', 'three'];
// ์์์ ๊ฐ๋ง ์ญ์ ๋๋ค
delete numbersArr[2]; // (4) ["zero", "one", empty, "three"]
// ์์ ๊ฐ๋ง์ด ์๋๋ผ ์์๋ฅผ ์์ ํ ์ญ์ ํ๋ค
numbersArr.splice(2, 1); // (3) ["zero", "one", "three"]
numbersArr.pop(); // ์์ ๋ฐฐ์ด ๋งจ ๋ ์์ ์ญ์ // (2) ["zero", "one"]
numbersArr.shift(); // ์์ ๋ฐฐ์ด ๋งจ ์ ์์ ์ญ์ // (1) ["one"]
arr.length = 0 // ๋ฐฐ์ด ์ ์ฒด ๋น์ฐ๊ธฐ
/* ๋ฐฐ์ด ์ฌ๋ถ ํ์ธ */
var arr = [1, true, "JavaScript"]; // ๋ฐฐ์ด ์์ฑ
document.write(typeof arr); // object
document.write(Array.isArray(arr)); // true
document.write(arr instanceof Array); // true
โ์ผ๋ฐ์ ์ธ ์ธ์ด์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด ์์์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค.
ํ์ง๋ง ํน์ ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์ ๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ํจ์จ์ ์ด์ง ์๋ค.
โ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ํด์ ํ ์ด๋ธ๋ก ๊ตฌํ๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ์ฑ๋ฅ์ ์ธ ๋ฉด์์ ๋๋ฆด ์ ๋ฐ์ ์๋ ๊ตฌ์กฐ์ ์ธ ๋จ์ ์ ๊ฐ๋๋ค.
ํ์ง๋ง ํน์ ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์ ๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ๋น ๋ฅธ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ ๋์์ ํ๋ด๋ธ ํน์ํ ๊ฐ์ฒด
๐ Call & apply & Bind
call,apply,bind ์ด๋์ ๋๋ ๋ง๊ณ ๊ทธ๋ฅ ์ฐธ์กฐํ๋ ํจ์ ์กฐ์์ด๋ค.
๋ญ ์กฐ์ํ๋๋ฉด, this๋ฅผ ๋ฐ๊ฟ์ ๋ง์น ํด๋น ํจ์๊ฐ ์ด๋ ๊ฐ์ฒด ์์ ์๊ฒ ํ ์ ์๋ค.
var obj = { n: 1, yell(){ this.n = 100; } };
var obj2 = { n: 1 };
obj.yell.call(obj2); == obj2.yell(); // ๋ง์น obj2๊ฐ์ฒด ์์์ yell()์ ๋ถ๋ฌ์จ ๊ผด๊ณผ ๊ฐ๋ค.
var arr = [ ... ];
Array.prototype.join.call(arr) == arr.join(); // ๋์ด ํ๋๊ฑด ๊ฐ๋ค. ํํ๋ง ๋ค๋ฅผ๋ถ
apply๋ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ๋ call์ด๋ค.
๋ญ๊ฐ ์ฌ๋ฌ๊ฐ์ ์ธ์๋ฅผ ์ ์ฉํ๊ณ ์ถ์๋ฐ, ์์๊ฐ ์๋ ๋ฐฐ์ด๋ณ์๋ก ์ ์ฉํ๋ ค๊ณ ํ ๋ ์ฐ์ธ๋ค.
var example = function (a, b, c) {
return a + b + c;
};
example(1, 2, 3);
example.call(null, 1, 2, 3);
example.apply(null, [1, 2, 3]); //apply๋ call์์ ์ธ์๋ง ๋ฐฐ์ด๋ก
example.bind(null)(1, 2, 3); //bind๋ call์ด๋ apply์ ๋น์ทํ์ง๋ง ํธ์ถ์ ํ์ง ์์ง ์๊ณ ํจ์๋ง ๋ฐํ
๐ this
- this๋ ํจ์ ๋ธ๋ก ์ค์ฝํ ๋ด์์ ์ ์ธ๋์ผ ์๋ํ๋ค.
- ๋ด๋ถํจ์๋ ์ฝ๋ฐฑ์ด๋ ๋ฆฌ์ค๋๋ ๋ญ๋ ๊ฐ์ ๋ฌด์กฐ๊ฑด this๋ ์ ์ญ๊ฐ์ฒด
- this์ง์ 3๊ฐ์ง ๋ฐฉ๋ฒ
- var that = this
- call,bind,apply
- ํ์ดํ ํจ์ - ์ฝ๋ฐฑํจ์ this ํด๊ฒฐ๋ฒ
function getUserName(firstName, lastName, callback) { callback.call(๊ฐ์ฒด, firstName, lastName); }
- ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ํจ์์ this๋ ์ธ๋ถํจ์์์ ๋ถ๊ตฌํ๊ณ ์ด๋ฒคํธ ํ๊ฒ์ ๊ฐ๋ฆฌํจ๋ค.
- ํ์ดํํจ์๋ this๊ฐ ์๊ธฐ๋๋ฌธ์ ํ์ดํ ํจ์๋ด์ this๋ ์ธ๋ถํจ์ this์ด๋ค.
๐ ์ฒด์ด๋
ํจ์์์ ์๊ธฐ ์์ this์ ๋ฆฌํดํ๋ฉด ์๊ธฐ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ์ฐ์์ผ๋ก . ์ ์ฌ์ฉํ ์ ์๋ค.
let ladder = {
step: 0,
up() {
this.step++;
return this;
},
down() {
this.step--;
return this;
},
showStep() {
alert( this.step );
}
}
ladder.up().up().down().up().down().showStep(); // 1
๐ ์์ธ ์ฒ๋ฆฌ
try {
* ์คํํ ์ฝ๋๋ฅผ ์
๋ ฅํ๋ค.
* ์ ์์ด๋ผ๋ฉด ๋ฌธ์ ์์ด ์คํ๋๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
* ์์ธ๋ throw ๋ฌธ์ ์ํด ๋ฐ์ํ ์๋ ์๊ณ , ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ฉ์๋์ ์ํด ๋ฐ์ํ ์๋ ์๋ค.
} catch (e) {
* ์ด ๋ธ๋ก ๋ด๋ถ์ ๋ฌธ์ฅ๋ค์ ์ค์ง try ๋ธ๋ก์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ง ์คํ๋๋ค.
* ์ด ๋ฌธ์ฅ๋ค์์ ์ง์ญ ๋ณ์ e๋ฅผ ์ฌ์ฉํ์ฌ Error ๊ฐ์ฒด ๋๋ ์์์ ๋์ง ๋ค๋ฅธ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
* ์ด ๋ธ๋ก์์๋ ์ด๋ป๊ฒ๋ ๊ทธ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์๋ ์๊ณ ,
* ๊ทธ๋ฅ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ์์ธ๋ฅผ ๋ฌด์ํ ์๋ ์๊ณ ,
* ์๋๋ฉด throw ๋ฅผ ์ฌ์ฉํด์ ์์ธ๋ฅผ ๋ค์ ๋ฐ์์ํฌ ์๋ ์๋ค.
} finally {
* ์ด ๋ธ๋ก์๋ try ๋ธ๋ก์์ ์ผ์ด๋ ์ผ์ ๊ด๊ณ์์ด ๋ฌด์กฐ๊ฑด ์คํ๋ ์ฝ๋๊ฐ ์์นํ๋ค.
* ์ด ์ฝ๋๋ try ๋ธ๋ก์ด ์ด๋ป๊ฒ๋ ์ข
๋ฃ๋๋ฉด ์คํ๋๋ค.
* try ๋ธ๋ก์ด ์ข
๋ฃ๋๋ ์ํฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
1) ์ ์์ ์ผ๋ก ๋ธ๋ก์ ๋์ ๋๋ฌํ์ ๋
2) break, continue ๋๋ return ๋ฌธ์ ์ํด์
3) ์์ธ๊ฐ ๋ฐ์ํ์ง๋ง catch ์ ์์ ์ฒ๋ฆฌํ์ ๋
4) ์์ธ๊ฐ ๋ฐ์ํ๊ณ ๊ทธ๊ฒ์ด ์กํ์ง ์์ ์ฑ ํผ์ ธ๋๊ฐ ๋
}
function userException(name, message) { // ์ฌ์ฉ์ ์์ธ์ฒ๋ฆฌ ํจ์
this.name = name;
this.message = message;
}
function exceptionHandling() {
try {
var a = 1;
var b = 0;
if( b == 0) {
throw new userException('divideByZeroException', '0์ผ๋ก ๋๋ ์ ์์ต๋๋ค');
}
} catch(e) {
if(e instanceof userException) {
console.log(e.name + "::" + e.message);
}
if(e instanceof dataValidationException) {
console.log(e.name + "::" + e.message);
}
} finally {
console.log("finally excute");
}
}
๐ ์๊ท๋จผํธ
function addNum(x=0, y=0, z=0) { // ๋ํดํธ ๋งค๊ฐ๋ณ์
return x + y + z;
}
function sub(...restArgs) {
console.log(arguments); // arguments ๊ฐ์ฒด = ์ ์ฌ๋ฐฐ์ด(์ํ๋ ๊ฐ๋ฅ. ๋จ ๋ฐฐ์ด๋ฉ์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ)
console.log(restArgs) // ๋๋จธ์ง ๋งค๊ฐ๋ณ์ = ๋ฐฐ์ด
}
sub(1,2,3,4,5);
๐ ํ์ดํ ํจ์
- this๋ฅผ ๊ฐ์ง์ง ์์ต๋๋ค.
- arguments๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
- new์ ํจ๊ป ํธ์ถํ ์ ์์ต๋๋ค.
- ํ์ดํ ํจ์๋ super๊ฐ ์์ต๋๋ค.
โ[ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด์๋ ์๋๋ ๊ฒฝ์ฐ]
- ์ผ๋ฐ๊ฐ์ฒด์ ๋ฉ์๋ (this๊ฐ ์์ผ๋๊น)
- prototype ๋ฉ์๋ (๋ง์ฐฌ๊ฐ์ง ํ๋กํ ํ์ ๊ฐ์ฒด this์ฐธ์กฐ ๋ถ๊ฐ๋ฅ)
- ์์ฑ์ ํจ์ ๋ฐ new (ํ์ดํ ํจ์๋ prototype ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค.)
- addEventListener ํจ์์ ์ฝ๋ฐฑํจ์ (this๊ฐ์์ผ๋ ์ด๋ฒคํธํ๊ฒ์ ๋ชป๊ฐ์ ธ์จ๋ค. ๊ฑ ์ผ๋ฐํจ์ ์ฐ์)
- ํ์ดํ ํจ์๋ call, apply, bind ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ this๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ ํ์ ์ ํ์ธํ์ - typeof / instanceof / Object.prototype.toString
// typeof : ํผ์ฐ์ฐ์์ ๋ฐ์ดํฐ ํ์
์ ๋ฐํํ๋ ์ฐ์ฐ์
typeof 5; // return 'number'
typeof 'haha'; // return 'string'
typeof {}; // return 'object'
typeof []; // return 'object'
typeof function () {}; // return 'function'
typeof null; // return 'object'
// instanceof : ๊ฐ์ฒด๊ฐ ํน์ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋น๊ต์ฐ์ฐ์
let arr = [1, 2, 3];
alert( arr instanceof Array ); // true
alert( arr instanceof Object ); // true - ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐฐ์ด์ ๊ฐ์ฒด์ด๋ค. ํฌํจ๊ด๊ณ
// Object.prototype.toString : toString์ ์จ๊ฒจ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํ์ฅ typeof, instanceof์ ๋์
let arr = [];
alert(arr); // [object Object]
let objectToString = Object.prototype.toString;
alert( objectToString.call(arr) ); // [object Array]
๐ Call by Value & Call by Reference
๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ ๋ฌํ๋ค๋ ๊ด์ ์์ ๋ฐ๋ผ๋ณผ ๋
์๋ฐ์คํฌ๋ฆฝํธ๋ ํญ์ ๊ฐ์ ์ํ ์ ๋ฌ(Call By Value)๋ง ์กด์ฌํ๋ค๊ณ ๋งํ ์ ์๋ค.
โ
๊ฐ์ด ์์๊ฐ์ด๋ ์ฐธ์กฐ๊ฐ์ด๋์ ์ฐจ์ด๋ง ์์ ๋ฟ์ด๋ค.
์์ ํ์ ์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ฏ์ด ๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๊ณ
์ฐธ์กฐ ํ์ ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ(์ฐธ์กฐ๊ฐ)์ด ๋ณต์ฌ๋์ด์ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋์ ์๋ฆฌ๋ ๊ฐ๋ค.
๐ computed property
๊ฐ์ฒด์ key๊ฐ์ ํํ์(๋ณ์, ํจ์ ๋ฑ)์ ํตํด ์ง์ ํ๋ ๋ฌธ๋ฒ์ด๋ค.
let key = 'name'
let obj = {
[`${key}`] : 'yujuck' // success
}
var a = "1111";
var s = {
[a] : 1111;
}
// >> {1111 : 1111}
var Array = [{key:1, value:10},
{key:2, value:20},
{key:3, value: 30}];
var result = Array.map(function(el){
// var obj = {};
// obj[el.key] = el.value;
// return obj;
return {[el.key] : el.value};
});
๐ ์ ๊ฐ ์ฐ์ฐ์
์ ๊ฐ์ฐ์ฐ์๋ ๋ฌ๋ ์ธ ์ ์๋ค. ํผ์ณ์ง ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ๋ด์ ๋ฐ๊ตฌ๋๊ฐ ๋ฐ๋์ ํ์ํ๋ค.
์์ฝ :
"..."๋ ์ ๊ฐ ์ฐ์ฐ์๋ ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ฉ๋๋ค.โ
ํจ์ ํธ์ถ ์ ์ฌ์ฉ๋๋ฉด ๋ฐฐ์ด์ ๋ชฉ๋ก์ผ๋ก ํ์ฅํด์ฃผ๋ "์ ๊ฐ ์ฐ์ฐ์"์ ๋๋ค.
ํจ์ ๋งค๊ฐ๋ณ์์ ๋์ ์์ผ๋ฉด ์ธ์ ๋ชฉ๋ก์ ๋๋จธ์ง๋ฅผ ๋ฐฐ์ด๋ก ๋ชจ์์ฃผ๋ "๋๋จธ์ง ๋งค๊ฐ๋ณ์"์ ๋๋ค.
โ
์ฌ์ฉ ํจํด :
์ธ์ ๊ฐ์์ ์ ํ์ด ์๋ ํจ์๋ฅผ ๋ง๋ค ๋ ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ง์ ์์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์์ ๋ฐฐ์ด์ ์ ๋ฌํ ๋ ์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
const arr = [4, 5, 6];
const arrWrap = [1, 2, 3, ...arr, 7, 8, 9] //์ค๊ฐ์ ๋์
๊ฐ๋ฅ
const arr1 = [1, 2, 3];
const arr2 = [...arr1].reverse(); //reverse๋ ๊ทธ ๋ฐฐ์ด๊ฐ์ ๋ฐ๊ฟ๋ฒ๋ฆฌ๋๊น ์ด๋ฐ์์ผ๋ก
/* ๋ฐฐ์ด ๋ณต์ฌ */
var arr = [1,2,3];
var copy1 = arr; // ๋ ํผ๋ฐ์ค ์ด์ด๋ถ์ด๊ธฐ
var [...copy2] = arr; // ๋ฐฐ์ด์ ์์ ๋ณต์ฌ
var copy3 = [...arr]; // ๋ฐฐ์ด์ ์์ ๋ณต์ฌ
/* ๊ฐ์ฒด ๋ณต์ฌ */
var prevState = {
name: "yuddomack",
birth: "1996-11-01",
age: 22
};
var state = {
...prevState,
age: 23
}; // { name: 'yuddomack', birth: '1996-11-01', age: 23 }
/* ๋๋จธ์ง ๋งค๊ฐ๋ณ์ : ํ๋ผ๋ฏธํฐ ๊ฐ๋ค์ ๋ฐ๋ก ์ง์ง๋ฐฐ์ด๋ก ๋ณํ */
// ์๊ท๋จผํธ์ ์ ๊ฐ์ฐ์ฐ์๋ฅผ ์ฐ๋ฉด ๋ฐฐ์ด๋ก ๋ฐํํ๋ ์๋ก์ด ๋ฌธ๋ฒ์ด ๋๋ค.
(function a(...rest){
console.log(rest); // [1, 2, 3, 4, 5]
})(1,2,3,4,5);
/* ์ ๋๋ ์ดํฐ */
function* generateName() {
yield 'W';
yield 'O';
yield 'N';
yield 'I';
yield 'S';
yield 'M';
}
const genForSpread = generateName();
console.log([...genForSpread]); // ['W', 'O', 'N', 'I', 'S', 'M']
๐ ๋น๊ตฌ์กฐํ(๊ตฌ์กฐ๋ถํด)
๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ํด์ฒดํ์ฌ ๊ทธ ๊ฐ์ ๊ฐ๋ณ ๋ณ์์ ๋ด์ ์ ์๊ฒ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์.
/* ๋ฐฐ์ด */
var [a1, a2, ...rest_a] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// a1, a2๋ณ์์ ํ์ํ ๋ฐฐ์ด๊ฐ์ ๋ฃ์ด์ ๋ฐ๋ก ์ฌ์ฉํ ์์๊ฒ ๋๋ค
/* ๊ฐ์ฒด */
var { a1, a2, ...rest_a } = { a1 : 10, a2 : 20, a3 : 30, a4 : 40 };
/* ๊ฐ์ฒด key๊ฐ์ ๋ค๋ฅธ์ด๋ฆ ๋ณ์๋ก ์ ์ฅ */
var { a1 : awesome_name, a2 : dumb , ...rest_a } = { a1 : 10, a2 : 20, a3 : 30, a4 : 40 };
/* ์๋ฃํ ํ์
์ด ์์์ ()๋ฌถ์ด ๋ฐ๋ก ์ ์ฉ ํํ ๊ฐ๋ฅ */
({ a, b } = { a : 10, b : 20});
/* ๊ธฐ๋ณธ๊ฐ ํ ๋น */
var [a, b=5] = [10];
var {c = 30, d : new_name = 40} = { };
/* ๋ฌธ์์ด */
function fullName(value) {
[this.name, this.surname] = value.split(" ");
// [this.name, this.surname] = ["Alice", "Special"];
}
};
fullName("Alice Special")
/* ๋ฐ๋ณต๋ฌธ */
const users = [
{name: 'kim', age: 10, addr:'kor'},
{name: 'joe', age: 20, addr:'usa'}
];
for(var {name : n, age : a} of users){
//๋ณ์ n๊ณผ a์ ๊ฐ์ ๋์
ํ์ฌ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
}
/* ํจ์ ์๊ท๋จผํธ */
const users = [
{name: 'kim', age: 10, addr:'kor'},
{name: 'joe', age: 20, addr:'usa'},
];
(function renderUser({name, age, addr}){
})(users[0]);
users.map(({name, age, addr}) => {
//map์ผ๋ก ๊ฐ ๊ฐ์ฒด ํ๋์ฉ ์ฐธ์กฐํ๊ฒ๋๊ณ ๋น๊ตฌ์กฐํ๋ก {name, age, addr}์ ๊ฐ๊ฐ ๊ฐ์ ๋ณ์์ ๋์
});
/* ํด๋์ค */
class Student extends Person {
constructor({grade, ...rest}) {
// ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
super(rest);
this.grade = grade;
}
}
const s = new Student({grade: 3, name: '์ค์์ค', age: 19});
๐ ๋๋ฒ ๋ฉ์๋
Number.isFinite()
: ์ ํํ ์?
Number.isInteger()
: ์ ์?
Number.isNaN()
: nan?
Number.prototype.toFixed()
: ๋งค๊ฐ๋ณ์๋ก ์ง์ ๋ ์์ซ์ ์๋ฆฌ๋ฅผ ๋ฐ์ฌ๋ฆผ
Number.prototype.toPrecision()
: ๋งค๊ฐ๋ณ์๋ก ์ง์ ๋ ์ ์ฒด ์๋ฆฟ์๊น์ง ์ ํจํ๋๋ก ๋๋จธ์ง ์๋ฆฟ์๋ฅผ ๋ฐ์ฌ๋ฆผ
๐ ๋ฌธ์์ด ๋ฉ์๋
String.prototype.split(separator, limit)
: ๋ฌธ์์ด -> ๋ฐฐ์ด
โ
String.prototype.substring(star, end)
String.prototype.slice(start, end)
: ๋ฌธ์์ด ์ผ๋ถ ๋ฝ์
: slice๋ -1 ์ธ๋ฑ์ค ์ง์
โ
String.prototype.indexOf(searchstring, fromIndex)
String.prototype.lastIndexOf(searchString, fromIndex)
: ํด๋น ๋ฌธ์๊ฐ ์๋ค๋ฉด ์ธ๋ฑ์ค๋ฅผ ๋ฐํ. ๋ฌธ์๊ฐ์ด ์๋์ง ์ฐพ์๋ ์
: lastIndecOf๋ ๋ง์ง๋ง ๊ธฐ์ค์ ์กฐ์ ํด์ ์ํ๋ ๊ตฌ๊ฐ์์ ์ธ๋ฑ์ค ์ฐพ์
โ
Stringโ.prototypeโ.includes(searchString, position)
: indexOf ๋ถ๋ฆฌ์ธ ๋ฒ์ ผ
๐ ๋ฐฐ์ด ๋ฉ์๋
Array.from
: ์ ์ฌ๋ฐฐ์ด,์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด -> ๋ฐฐ์ด ๋ณํ
Array.of
: ์ธ์๋ฅผ -> ๋ฐฐ์ด๋ก ๋ณํ
โ
Array.prototype.indexOf(searchElement, fromIndex)
: String์ indexOf๋ ๊ฐ์
: ๋ถ๋ฆฌ์ธ ๋ฒ์ ผ includes()๊ฐ ์์
โ
Array.prototype.join(separator)
: ๊ตฌ๋ถ์ ์ฒ๋ฆฌ ํํ ๋ฌธ์์ด ๋ณํ
: ์ฌ์ค์ String์ split์ ๋ฐ๋๋ฒ์ ผ
โ
Array.prototype.slice(start, end)
: ๋ฌธ์์ด slice๋ ๊ฑฐ์ ๋น์ท
: ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ๋ฐฐ์ด๋ณต์ฌ๊ฐ ์ผ์ด๋จ. ์ด๋ฅผ ์ด์ฉํด ์ ์ฌ๋ฐฐ์ด์ ๋ฐฐ์ด๋ก ๋ณํ ๊ฐ๋ฅ
const arr0 = [].slice.call(arguments); // [1, 2, 3]
const arr1 = [...arguments]; // [1, 2, 3]
const arr2 = Array.from(arguments); // [1, 2, 3]
Array.prototype.splice(start, deleteCount, …items)
์ด 3๊ฐ์ง์ ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
1) ๋ฐฐ์ด ์์ ์ถ๊ฐ (์ญ์ ์ํ๊ณ ์ถ๊ฐ)
2) ๋ฐฐ์ด ์์ ๊ต์ฒด (์ญ์ ํ๊ณ ์ถ๊ฐ)
3) ๋ฐฐ์ด ์์ ์ญ์ (์ถ๊ฐ ์ํ๊ณ ์ญ์ )
โ
Array.prototype.fill()
: ํจ์ ์ธ์๋ฅผ ๋ฐฐ์ด ์ธ์๋ก
const arr = new Array(5).fill(); // [undefined, undefined, undefined, undefined, undefined]
// fill()์ ์๋ถ์ผ๊ฒฝ์ฐ -> [empty x 5]
const arr = new Array(5).fill(5); // [5, 5, 5, 5, 5]
Array.prototype.at()
: ์ ์ด์ฟผ๋ฆฌ eq()๊ฐ์ ๊ฐ๋ . [-1]๋ฅผ at(-1) ๋ก ์ธ์ ์๋ค.
๐ ๋ ์ง ๋ฉ์๋
new.Date()
: ๊ฒฐ๊ณผ๊ฐ์ด Date๊ฐ์ฒด๋ก ๋ฐํ. ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์.
Date()
: new์ฐ์ฐ์ ์์ด ํธ์ถ. ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌธ์์ด๋ก ๋ฐํ
โ๋ช์ผ ์ , ๋ช์ผ ํ ๋ ์ง ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ
var now = new Date(); // ํ์ฌ ๋ ์ง ๋ฐ ์๊ฐ
console.log("ํ์ฌ : ", now);
var yesterday = new Date(now.setDate(now.getDate() - 1)); // ์ด์
console.log("์ด์ : ", yesterday);
var tomorrow = new Date(now.setDate(now.getDate() + 1)); // ๋ด์ผ
console.log("๋ด์ผ : ", tomorrow);
๐ ๊ฐ์ฒด ๋ฉ์๋
Object.create()
// ์ฃผ์ด์ง ํ๋กํ ํ์
(prototype)์ ๊ฐ์ฒด์ ์์ฑ๋ค์ ๊ฐ๊ณ ์๋ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
Object.assign()
// ํ๋ ์ด์์ ์๋ณธ ๊ฐ์ฒด๋ค๋ก๋ถํฐ ๋ชจ๋ ์ด๊ฑฐ๊ฐ๋ฅํ ์์ฑ๋ค์ ๋์ ๊ฐ์ฒด๋ก ๋ณต์ฌํฉ๋๋ค.
// ๊ทธ๋ฅ ๊ฐ์ฒด = ๊ฐ์ฒด ํ๋ฉด ์ฃผ์๊ฐ์ด ๊ณต์ ๋ ๋ฟ์ด๋ค.
Object.keys()
// ๊ฐ์ฒด์ ํค๋ง ๋ด์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. (๋จ, ์ด๊ฑฐ๊ฐ๋ฅํ ๊ฒ๋ง)
Object.values()
// ๊ฐ์ฒด์ ๊ฐ๋ง ๋ด์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. (๋จ, ์ด๊ฑฐ๊ฐ๋ฅํ ๊ฒ๋ง)
Object.getOwnPropertyNames()
// ํด๋น ๊ฐ์ฒด๊ฐ ๊ฐ์ง ๋ชจ๋ ๊ณ ์ ํ๋กํผํฐ์ ์ด๋ฆ์ ๋ฐฐ์ด์ ๋ด์ ๋ฐํํฉ๋๋ค.
Object.entries()
// [ํค, ๊ฐ] ์์ ๋ด์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
// ๋ณดํต ๊ฐ์ฒด๋ฅผ ์ด์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํ๊ณ Map์๋ฃํ์ผ๋ก ๋ง๋ค๋ ์ฌ์ฉ
Object.fromEntries()
// [ํค, ๊ฐ] ํํ์ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค.
child instanceof Object; // child๊ฐ ๊ฐ์ฒด์ธ์ง ํ์ธ true/false
typeof [] // []์ ํ์
์ด ๋ญ์ง ๋ฐํ -> object
๐ setTimeout()
// ์ค์ฒฉ ์ค์ผ์ฅด๋ง
let timerId = setTimeout(function tick() {
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
let first = 10
let second = 20
let result = 0
function add(x, y) {
return x + y
}
setTimeout(function() {
result = add(first, second)
console.log(result) // ์ ๋ต์? 30(x) 40(o)
}, 1000)
first = 20
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ๊ฐ์ task๋ฅผ ํ์ ์ ์ฌํด๋๊ณ ์์๋๋ก ์ฒ๋ฆฌํ๋ค.
์ด ๋ ์ด๋ค ์ฝ๋๊ฐ ์๋ก์ด ํ์คํฌ๋ก ์ ์ฌ๋์ง์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ๋ฉด ์์ ๊ฐ์ ์ค์๋ฅผ ์ ์ง๋ฅผ ์ ์๋ค.
์ต์ด์ task ๋ ์คํฌ๋ฆฝํธ ํ์ผ ์์ฒด์ด๋ค.
์ด ์ฒซ๋ฒ์งธ task ๋ด์ setTimeout์ ๋ณ๋์ task๋ฅผ ์์ฑํ๊ณ ์ฒซ๋ฒ์งธ task ๊ฐ ์ข ๋ฃ๋๊ธธ ๊ธฐ๋ค๋ฆฐ๋ค.
์ฒซ๋ฒ์งธ task ์ธ ์คํฌ๋ฆฝํธ์ ์คํ์ด ๋๋๋ฉด ๋น๋ก์ setTimeout ์ ํจ์๋ฅผ ์คํํ ์ค๋น๋ฅผ ํ๋ค.
๐ Promise
- ๋น๋๊ธฐ๊ฐ ์ธ์ ์ด๋์ ์คํ๋ ์ง ๋ชจ๋ฅด๋๊น ์ผ์ข ์ ์ฝ์์ ํ๊ณ ๋ค์ ํจ์ ์คํ(then)์ ๋ณด์ฅํ๋ ๊ธฐ๋ฒ.
- ์ด๋ฅผ ํตํด ๋๊ธฐ์์ผ๋ก ๊ตฌํํ ์ ์์ง๋ง ํจ์ ์ฝ๋ฐฑ์ง์ฅ์ ํด๊ฒฐํ๋๋ then์ฝ๋ฐฑ์ง์ฅ์ด ์๊ฒจ๋ ์์์ด์ async/await์ ์ฐ๋ ์ถ์ธ์ด๋ค.
function p() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('error');
}, 1000);
});
}
//์ํ๋ ์์ ์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฝ๋ฐฑํจ์๋ ํธ์ถํ ์ ์๋ค.
p()
.then(() => {
console.log('1000msํ์ fulfilled ๋ฉ๋๋ค.');
})
.catch(reason => {
console.log('1000msํ์ rejected ๋ฉ๋๋ค.', reason);
});
๐ async / await
- async/await๊ฐ Promise๋ฅผ ์๋ฒฝํ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ค.
- ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด, .then์ ์ฝ๋ฐฑ์ง์ฅ์ ๊ต์ฒดํ๊ธฐ ์ํด await์ ์ฌ์ฉํ๋๊ฒ์ด๋ค. async๋ await์ ์ฌ์ฉํ๊ธฐ ์ํ ์ฒ๋ฆฌ.
- asyncํจ์๋ Promise๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค. ๋ฐ๋ผ์ asyncํจ์ ๋ด์์ await๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ทธ ๊ฒฐ๊ณผ๋ก then์ผ๋ก ๋ฐ์์ฌ์ ์๋ค.
async function p2(){ // async์ ์ง์ ํด์ฃผ๋ฉด Promise๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ก ๋ง๋ค์ด์ค๋ค.
return 'hello2'; //๋ฆฌํด๊ฐ์ Promise{<resolved>: "hello2"} ์๋ resolveํด์ค๋ค๋๊ฑธ ์ ์์๋ค.
// reject๋ throw ์๋ฌ๋ฅผ ๋ ๋ฆฌ๋ฉด ๋๋ค.
}
p2().then((n) => console.log(n));
- ์ ํ ์ฐ๊ด์๋ ๋น๋๊ธฐํจ์๋ฅผ ์ฌ๋ฌ๊ฐ ๋ฐ์์ฌ๊ฒฝ์ฐ, ์์๋ฅผ ์งํฌํ์๊ฐ ์๊ธฐ๋๋ฌธ์ ์ฑ๋ฅ์ ์ํด ๋ฒ๋ ฌ ์ฒ๋ฆฌ ํด์ค๋ค.
let a = await getApple(); // 1์ด ๊ธฐ๋ค๋ฆฌ๊ณ ๋ฆฌํด๊ฐ์ ์ป๋๋ค.
let b = await getBanana(); // 1์ด ๊ธฐ๋ค๋ฆฌ๊ณ ๋ฆฌํด๊ฐ์ ์ป๋๋ค.
// ์ด 2์ด ๊ธฐ๋ค๋ ค์ผํจ
// -------------------------------------------------------------------------
let getApplePromise = getApple(); // 1์ด ๊ธฐ๋ค๋ฆฌ๊ณ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์คํ์ํค๊ณ ๋ฆฌํด๊ฐ์ ๋ณ์์ ๋ฃ๋๋ค.
let getBananaPromise = getBanana(); // 1์ด ๊ธฐ๋ค๋ฆฌ๊ณ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์คํ์ํค๊ณ ๋ฆฌํด๊ฐ์ ๋ณ์์ ๋ฃ๋๋ค.
let a = await getApplePromise;
let b = await getBananaPromise;
// ๋ณธ๋๋ผ๋ฉด 1์ด+1์ด ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋๋ฐ, ์์์ 1์ด๊ธฐ๋ค๋ฆฌ๋ ํจ์๋ฅผ ํ๋ฒ์ ๋ถ๋ฌ์๊ธฐ ๋๋ฌธ์, ๋์ถฉ 1.001์ด๋ง ๊ธฐ๋ค๋ฆฌ๋ฉด ๋๊ธฐ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
๐ ํด๋ก์
โํจ์๋ก์์ ํด๋ก์
- ์ง์ญ๋ณ์๋ก์ ์๋
var increase = (function() {
var counter = 0;
return function(){ // ํด๋ก์
return ++counter;
}
})();
var increase = (function(counter) { // ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ญ๋ณ์๋ก
return function(){ // ํด๋ก์
return ++counter;
}
})(0);
increase(); // 1
โ
ํด๋์ค ๋ก์์ ํด๋ก์
- ํด๋์ค์ private ๋ณ์๋ก์ ์๋
function Counter() {
// ์นด์ดํธ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์์ ๋ณ์
// this.counter๋ก ์ํ๊ธฐ ๋๋ฌธ์ new ์์ฑ์๋ก ์ด๊ธฐํํด๋ ์ด ๋ณ์๋ ๊ฐ์ฒด์ ๋ด๊ธฐ์ง ์๋๋ค.
var counter = 0;
// ํด๋ก์
this.increase = function () {
return ++counter;
};
// ํด๋ก์
this.decrease = function () {
return --counter;
};
}
const counter = new Counter(); // counter๊ฐ์ฒด๋ increase decreaseํจ์ ๋๊ฐ๋ง ๊ฐ๊ฒ ๋๋ค.
console.log(counter.increase()); // 1
console.log(counter.decrease()); // 0
๐ ๋ฐฐ์ด ๊ณ ์ฐจ ํจ์ ์ด ์ ๋ฆฌ
- .forEach() : ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์ฐ์ฐ์ ์ํ
- .map() : ์ฝ๋ฐฑํจ์์์์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐํ
- .find() : indexOf() ๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฃผ๋๊ฑฐ๊ณ , include()๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ Bool๋ก ์ฃผ๋๊ฑฐ๋ฉด, find()๋ ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ ๊ทธ๋๋ก ์ค๋ค.
- .findindex() : indexOf() ์ ์ฝ๋ฐฑํจ์ ๋ฒ์ ผ / find()์ ๋ฆฌํด๊ฐ์ด ์ธ๋ฑ์ค์ธ ๋ฒ์ ผ.
- .filter() : find()์ ์ฐพ์์ ๊ฐ์ ๋ฐํํ๋ ๊ธฐ๋ฅ๊ณผ map()์ ๋ฐฐ์ด์์ฑ ๊ธฐ๋ฅ์ ์ตํฉ ๋ฒ์ ผ.
- .reduce() : acc์๋ถํฐ ์์ํด์ ๋ฐฐ์ด๊ฐcur์ ์ํํ๋ฉฐ acc+=cur์ ์คํ.
๐ defer / async ์ง์ฐ ๋ก๋
๐ Map ์๋ฃํ
let map1 = new Map([ ['a',1], ['a1',2], ['b',3] ])
// map ์๋ฃํ : {"a" => 1, "a1" => 2, "b" => 3}
// ์ฒด์ด๋ ๊ฐ๋ฅ
map
.set('1', 'str1')
.set(1, 'num1')
.set(true, 'bool1');
๊ฐ์ฒด -> ๋งต
1) Object.entries()๋ก ๋ฐฐ์ด๋ก ๋ณํ
2) ๋ณํ๋ ๊ฐ์ผ๋ก new Map()
๋งต -> ๊ฐ์ฒด
1) map.entries()๋ก ๋งต์ฉ ์ดํฐ๋ ์ดํฐ ๋ฐํ
2) Object.fromEntries()์ผ๋ก ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํ
๐ Set ์๋ฃํ
์ (Set)์ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๊ฐ์ ๋ชจ์๋์ ํน๋ณํ ์ปฌ๋ ์
let sett = new Set(["bananas", "oranges", "bananas", "apples", "bananas"]);
// Set(3) {'bananas', 'oranges', 'apples'}
๐ Symbol ์๋ฃํ
- Symbol() - ์ผ๋ฐ ์ฌ๋ณผ
- Symbol.for() - ์ ์ญ ์ฌ๋ณผ
- Symbol.keyFor() - Symbol.for() ์ด๋ฆํ ๋ฐํ
- Symbol.description - Symbol() ์ด๋ฆํ ๋ฐํ.
- Symbol.iterator - ์ด๋ค ๊ฐ์ฒด๊ฐ Symbol.iterator๋ฅผ ํ๋กํผํฐ key๋ก ์ฌ์ฉํ ๋ฉ์๋ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ดํฐ๋ ์ดํฐ๋ก ๋์ํ๋๋ก
๐ ํ๋กํ ํ์
/* 1๋จ๊ณ : ํ๋กํ ํ์
๊ฐ์ฒด ์ ์ */
var proto = {
sentence : 4,
probation : 2
};
/* 2๋จ๊ณ : ๊ฐ์ฒด ์์ฑ์ ์ ์ */
var Prisoner = function(name, id) {
this.name = name;
this.id = id;
}
/* 3๋จ๊ณ : ์์ฑ์์ ํ๋กํ ํ์
๊ฐ์ฒด ์ฐ๊ฒฐ */
Prisoner.prototype = proto;
/* 4๋จ๊ณ : ๊ฐ์ฒด ์์ฑ */
var firstPrisoner = new Prisoner("Joe", "12A");
var secondPrisoner = new Prisoner("Joe2", "12A2");
Prototype Object
- ํจ์์ ์์ฒด์ ์ผ๋ก ๋ด์ฅ๋์ด์๋ ์์ ๊ฐ์ฒด. ํด๋์ค ์ญํ ํ๋ ์์
- Prototype Object๋ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด์ ๊ฐ์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ์์ฑ์ผ๋ก constructor์ __proto__๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
constructor ์์ฑ์๋ Prototype Object์ ๊ฐ์ด ์์ฑ๋์๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ต๋๋ค. (์์ฑ์๋๊น)
__proto__๋ Prototype Link์ ๋๋ค. ๋ฐ์์ ์์ธํ ์ค๋ช ํฉ๋๋ค.
Prototype Link
- __proto__
- โ__proto__์์ฑ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋น ์ง์์ด ๊ฐ์ง๊ณ ์๋ ์์ฑ
- __proto__๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์กฐ์์ด์๋ ํจ์์ Prototype Object๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- ์ด๋ ๊ฒ __proto__์์ฑ์ ํตํด ์์ ํ๋กํ ํ์ ๊ณผ ์ฐ๊ฒฐ๋์ด์๋ ํํ๋ฅผ ํ๋กํ ํ์ ์ฒด์ธ(Chain)
๐ ํด๋์ค ๋ฌธ๋ฒ
class Person {
// ์์ฑ์
constructor({name, age}) {
this.name = name;
this.age = age;
}
introduce() {
return `์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์
๋๋ค.`;
}
}
const person = new Person({name: '์ค์์ค', age: 19});
console.log(person.introduce()); // ์๋
ํ์ธ์, ์ ์ด๋ฆ์ ์ค์์ค์
๋๋ค.
- ํด๋์ค ๋ฉ์๋์ computed property์ฒ๋ผ ๋ณ์๋ก ๋ช ๋ช ๊ฐ๋ฅ
- getter, setter ์ฌ์ฉ๊ฐ๋ฅ
- ์ ๋๋ ์ดํฐ ์ฌ์ฉ ๊ฐ๋ฅ. ๋ฉ์๋์์ * ๋ถ์ฌ์ฃผ๋ฉด ๋จ
- static ๋ถ์ด๋ฉด ์ ์ ๋ฉ์๋ ์ฌ์ฉ
class Parent {
// ์คํํฑ
static staticProp = 'staticProp';
static staticMethod() {
return 'I\'m a static method.';
}
// ์ผ๋ฐ
instanceProp = 'instanceProp';
instanceMethod() {
return 'I\'m a instance method.';
}
constructor(name, first, second){
this.name=name;
this.first=first;
this.second=second;
}
sum(){
return (this.first + this.second);
}
}
class Child extends Parent {
constructor(name, first, second, third){
super(name, first, second); //๋ถ๋ชจ ์์ฑ์๋ฅผ ๊ฐ์ ธ์์ ํํ๊ฒ ํ๋ค.
this.third = third;
}
// ์ค๋ฒ๋ก๋ฉ
sum(){
return super.sum() + this.third; // super๋ก ๋ถ๋ชจ๋ฉ์๋๋ฅผ ๋ณต๋ถ
}
}
// ์์ํ๋ฉด ๋ถ๋ชจ์ static์์๋ค์ ์ฌ์ฉ ๊ฐ๋ฅ
console.log(Child.staticProp); // staticProp
console.log(Child.staticMethod()); // I'm a static method.
// ์์ํ๋ฉด ๋ถ๋ชจ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
const c = new Child();
console.log(c.instanceProp); // instanceProp
console.log(c.instanceMethod()); // I'm a instance method.
// ๋ถ๋ชจ ์ค๋ฒ๋ก๋ฉ ๋ฉ์๋ ์ฌ์ฉ
const kim = new Child('kim', 10, 20, 30);
console.log(kim.sum()); // (10 + 20) + 30 = 60
๐ ์ดํฐ๋ฌ๋ธ & ์ดํฐ๋ ์ดํฐ
- ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ [Symbol.iterator]() ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด.
- ์ผ๋ฐ ๊ฐ์ฒด๋ฅผ ์ดํฐ๋ฌ๋ธ๋ก ๋ฑ๋กํ๋ฉด for..of๋ฌธ์ผ๋ก ์ํํ ์ ์๋ค.
- ๋ฐฐ์ด๋ ๋ฌธ์์ด, Map,Set๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด.
- Array.from() ๋ฉ์๋๋ฅผ ํตํด ์ ์ฌ๋ฐฐ์ด์ด๋ ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด๋ฅผ ์ง์ง๋ฐฐ๊ธฐ ๋ฐฐ์ด๋ก ๋ณํ ๊ฐ๋ฅํ๋ค.
โ
๐ ์ ๋๋ ์ดํฐ
์ ๋๋ ์ดํฐ๋ ์ดํฐ๋ฌ๋ธ์ด๋ฉฐ ๋์์ ์ดํฐ๋ ์ดํฐ = ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ ํจ์
async๊ฐ Promise๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ฏ์ด, ์ ๋๋ ์ดํฐ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ค.
โ
โ
โ