[TIL] 210918

Lee SyongΒ·2021λ…„ 9μ›” 18일
0

TIL

λͺ©λ‘ 보기
31/204
post-thumbnail

πŸ“ 였늘 ν•œ 것

  1. "false" VS false / array.flat() / 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° / prototype / function.call() / array.filter() / && / array.includes() / array.push() / array.map()

  2. javascript-koans 풀이 μ™„λ£Œ


πŸ“– ν•™μŠ΅ 자료

  1. μƒν™œμ½”λ”© 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°•μ˜ 1 ~ 12편(7.2)

πŸ“š 배운 것

πŸ”Ž javascript-koans

이전 풀이 μ΄μ–΄μ„œ
ν’€λ©΄μ„œ λͺ¨λ₯΄κ±°λ‚˜ ν—·κ°ˆλ Έλ˜ λΆ€λΆ„ 정리


1. AboutHigherOrderFunctions.js

1) "false" VS false

(1) var msg = "" + ((3 % 2) === 0);

var msg = "";

msg = msg + ((3 % 2) === 0);
// msg = "" + false;
// ""와 falseλ₯Ό λ”ν•œ 값을 λ³€μˆ˜ msg에 ν• λ‹Ή
console.log(msg);
// "false" (∡ "" + false === "false")

msg = msg + ((2 % 2) === 0);
// msg = "false" + true;
// "false"와 trueλ₯Ό λ”ν•œ 값을 λ³€μˆ˜ msg에 ν• λ‹Ή
console.log(msg);
// "falsetrue"

(2) var msg = "" + (3 % 2) === 0;

var msg = "";

msg = msg + (3 % 2) === 0;
// msg = "" + 1 === 0;
// ""와 1을 λ”ν•œ 값이 0κ³Ό μΌμΉ˜ν•˜λŠ”μ§€λ₯Ό νŒλ‹¨ ν›„ true/false 값을 msg λ³€μˆ˜μ— ν• λ‹Ή
console.log(msg);
// false (∡ "1" !== 0)

msg = msg + (2 % 2) === 0;
// msg = false + 0 === 0;
// false와 0을 λ”ν•œ 값이 0κ³Ό μΌμΉ˜ν•˜λŠ”μ§€λ₯Ό νŒλ‹¨ ν›„ true/false 값을 msg에 ν• λ‹Ή
console.log(msg);
// true (∡ console.log(false + 0); // 0 )

cf. boolean(λΆˆλ¦¬μ–Έ)

  • true/false 값을 κ°–λŠ”λ‹€
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ trueλŠ” 1, falseλŠ” 0κ³Ό κ°™λ‹€κ³  ν‘œν˜„λ˜κΈ°λ„ ν•œλ‹€
console.log(true); // true
console.log(true + 0); // 1
console.log(false); // false
console.log(false + 1); // 0

2) array.flat();

(1) μ€‘μ²©λœ λ°°μ—΄ 평탄화

var array = [[1, 2], [[3, 4], [5, 6]]];

var flat1 = array.flat();
console.log(flat1);
// [1, 2, [3, 4], [5, 6]]

var flat2 = array.flat(2);
console.log(flat2)
// [1, 2, 3, 4, 5, 6]

(2) λ°°μ—΄μ˜ ꡬ멍 제거

var array = [1, 2, , 3, 4];

var flat = array.flat();
console.log(flat);
// [1, 2, 3, 4]

πŸ”Ž 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

AboutInheritance.js ν’€λ‹€κ°€ prototype κ°•μ˜ λ“£κ³  옴
μƒν™œμ½”λ”© 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°•μ˜ (1 ~ 12편(7.2)) μ°Έκ³ 


1. 객체

μ„œλ‘œ μ—°κ΄€λœ
λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό
κ·Έλ£Ήν•‘ ν•˜κ³ 
이름을 뢙인 것

2. μ˜ˆμ•½μ–΄ this

thisκ°€ 속해 μžˆλŠ” λ©”μ„œλ“œ
κ°€ 속해 μžˆλŠ” 객체λ₯Ό 가리킴

3. prototype(ν”„λ‘œν† νƒ€μž…)

1) 의미

  • μ–΄νœ˜μ  의미 : μ›ν˜•, κ³΅ν†΅λœ λͺ¨μŠ΅, 본래의 λͺ¨μŠ΅

  • μžλ°”μŠ€ν¬λ¦½νŠΈ : ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄

2) μƒμ„±μž ν•¨μˆ˜ μ•ˆμ—μ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 경우

μƒμ„±μžλ₯Ό μ΄μš©ν•΄ 객체λ₯Ό 생성할 λ•Œλ§ˆλ‹€ λ©”μ„œλ“œκ°€ λ§Œλ“€μ–΄μ Έ λ©”λͺ¨λ¦¬μ— 할당이 되기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 효율이 쒋지 μ•Šλ‹€

function Person (name, first, second) {
  this.name = name;
  this.first = first;
  this.second = second;

  // 이 뢀뢄이 kim, lee λ“±μ˜ 객체듀을 생성할 λ•Œλ§ˆλ‹€ μƒˆλ‘œ λ§Œλ“€μ–΄μ Έ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœλ‹€
  this.sum = function () {
    return this.first + this.second;
  }
}

var kim = new Person('kim', 10, 20);
var lee = new Person('Lee', 10, 10);

console.log(kim.sum()); // 30
console.log(lee.sum()); // 20

3) prototype ν™œμš©

ν•œ 번만 μ •μ˜ν•΄ λ†“μœΌλ©΄ 되기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬κ°€ λΉ„νš¨μœ¨μ μœΌλ‘œ λ‚­λΉ„λ˜μ§€ μ•ŠλŠ”λ‹€

(1) μƒμ„±μžλ₯Ό μ΄μš©ν•΄ μƒμ„±ν•œ λͺ¨λ“  κ°μ²΄λ“€μ˜ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 방법

// 객체의 πŸ’‘μ†μ„±πŸ’‘μ€ 객체 μƒμ„±μž ν•¨μˆ˜μ— μ •μ˜ν•΄λ‘κ³ 
function Person (name, first, second) {
  this.name = name;
  this.first = first;
  this.second = second;
}

// νš¨μœ¨μ„±μ„ μœ„ν•΄ 객체의 πŸ’‘λ©”μ„œλ“œπŸ’‘λŠ” prototype을 μ΄μš©ν•΄ λ”°λ‘œ μ •μ˜ν•  것
Person.prototype.sum = function () {
  return this.first + this.second;
}

var kim = new Person('kim', 10, 20);
var lee = new Person('Lee', 10, 10);

console.log(kim.sum()); // 30
console.log(lee.sum()); // 20

(2) μƒμ„±μžλ₯Ό μ΄μš©ν•΄ μƒμ„±ν•œ 객체듀 쀑 μ–΄λŠ ν•œ 객체의 λ©”μ„œλ“œλ§Œ λ°”κΎΈλŠ” 방법

function Person (name, first, second) {
  this.name = name;
  this.first = first;
  this.second = second;
}

Person.prototype.sum = function () {
  return this.first + this.second;
}

var kim = new Person('kim', 10, 20);
var lee = new Person('Lee', 10, 10);

// μΆ”κ°€ν•œ μ½”λ“œ
kim.sum = function () {
  return 'modified: ' + (this.first + this.second);
} 

console.log(kim.sum()); // 'modified: 30'
console.log(lee.sum()); // 20

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ kim.sum()의 값을 κ΅¬ν•΄μ£ΌλŠ” κ³Όμ •

  • λ¨Όμ €, 객체 kim에 sum()이 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€
  • μ—†μœΌλ©΄, 객체 kimλ₯Ό λ§Œλ“€ λ•Œ μ΄μš©ν•œ μƒμ„±μž Person의, prototypeμ΄λΌλŠ” 속성에, sum()이 μ •μ˜λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€

β†’ 이λ₯Ό ν”„λ‘œν† νƒ€μž… 체인이라고 ν•œλ‹€
β†’ 이λ₯Ό 톡해 λͺ¨λ“  κ°μ²΄λŠ” κ·Έ 객체의 μƒμ„±μžμ˜ prototype 속성에 μ •μ˜λœ 속성과 λ©”μ„œλ“œλ“€μ„ 상속할 수 μžˆλ‹€


πŸ”Ž javascript-koans

λ‹€μ‹œ λŒμ•„μ™€μ„œ


2. AboutInheritance.js

1) function.call()

ν•¨μˆ˜(Function)와 ν•¨μˆ˜μ˜ call() λ©”μ†Œλ“œ μ°Έκ³ 

var koGreeting = {
  greeting : "μ•ˆλ…•",
  name : "홍길동",
  sayHello: function() {
    return this.greeting + ", " + this.name;
  }
};

var enGreeting = {
  greeting: "Hello",
  name: "HongKilDong"
};

console.log(koGreeting.sayHello());
// μ•ˆλ…•, 홍길동

console.log(koGreeting.sayHello.call(enGreeting));
// Hello, HongKilDong
  • λ§ˆμ§€λ§‰ 쀄 μ½”λ“œμ˜ 의미

    call() λ©”μ„œλ“œλŠ” koGreeting 객체 μ•ˆμ˜ sayHello() λ©”μ„œλ“œκ°€ (koGreeting 객체가 μ•„λ‹ˆλΌ) call() λ©”μ„œλ“œμ˜ 첫 번째 인수둜 주어진 enGreeting 객체의 λ©”μ„œλ“œλ‘œ λ™μž‘ν•˜λ„λ‘ ν•΄μ€€λ‹€


3. AboutApplyingWhatWeHaveLearnt.js

와 μ–΄.λ ΅.λ‹€.

1) 견과λ₯˜μ™€ 버섯을 λͺ» λ¨ΉλŠ” μ‚¬λžŒμ΄ 먹을 수 μžˆλŠ” ν”Όμž μ°ΎκΈ°

var products = [
  { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false },
  { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false },
  { name: "South Of The Border", ingredients: ["black beans", "jalapenos", "mushrooms"], containsNuts: false },
  { name: "Blue Moon", ingredients: ["blue cheese", "garlic", "walnuts"], containsNuts: true },
  { name: "Taste Of Athens", ingredients: ["spinach", "kalamata olives", "sesame seeds"], containsNuts: true }
];

var productsICanEat = products.filter(function (obj) {
  return (obj.containsNuts === false) && (!obj.ingredients.includes('mushrooms'));
});

console.log(productsICanEat);
// [ { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false } ]
  • filter() λ©”μ„œλ“œμ˜ 인수둜 λ“€μ–΄μ˜€λŠ” ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ objλŠ” filter() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄ products의 μš”μ†Œλ₯Ό μ˜λ―Έν•œλ‹€

  • filter() λ©”μ„œλ“œλŠ”, 주어진 ν•¨μˆ˜μ˜ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜λŠ”(주어진 ν•¨μˆ˜μ˜ κ²°κ³Όκ°€ true인 경우의) λͺ¨λ“  μš”μ†Œλ“€μ„ λͺ¨μ•„ μƒˆλ‘œμš΄ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€

    • (ν”Όμ—°μ‚°μž) && (ν”Όμ—°μ‚°μž)

    • obj.containsNuts === false β†’ ν”Όμ—°μ‚°μž 1 (true/false)

    • !obj.ingredients.includes('mushrooms') ν”Όμ—°μ‚°μž 2 (true/false)

    • ν”Όμ—°μ‚°μž 1κ³Ό 2κ°€ λͺ¨λ‘ ture라면, && μ—°μ‚°μžμ— μ˜ν•΄ trueκ°€ λ°˜ν™˜λœλ‹€

  • λ”°λΌμ„œ, products.filter(ν•¨μˆ˜)λŠ” ν”Όμ—°μ‚°μž 1κ³Ό 2κ°€ λͺ¨λ‘ trueκ°€ λ˜λŠ” obj듀을 μ°Ύμ•„ μƒˆλ‘œμš΄ λ°°μ—΄λ‘œ λ°˜ν™˜ν•œλ‹€

2) 3 λ˜λŠ” 5의 배수인 1000 미만의 λͺ¨λ“  μžμ—°μˆ˜ λ”ν•˜κΈ°

// 빈 λ°°μ—΄ array 생성
var array = [];

// λ°°μ—΄ array에 1000 미만의 3 λ˜λŠ” 5의 배수인 μžμ—°μˆ˜λ“€μ„ μš”μ†Œλ‘œ μ‚½μž…
for (var i = 1; i < 1000; i++) {
  if (i % 3 === 0 || i % 5 === 0) {
    array.push(i);
  }
}

// μš”μ†Œλ“€μ˜ 값을 λ‹€ λ”ν•˜κΈ° μœ„ν•΄ reduce() 이용
var answer = array.reduce((prev, curr) => prev + curr);
console.log(answer);
// 233168

3) λͺ¨λ“  ν”Όμžλ₯Ό λ§Œλ“œλŠ” 데 버섯이 λͺ‡ 개 λ“€μ–΄κ°€λŠ”κ°€

κ΅¬ν•˜κΈ΄ ν–ˆλŠ”λ° λ­”κ°€ μ’€ μ΄μƒν•œ κ±° κ°™λ‹€

  • products λ°°μ—΄μ˜ 각 μš”μ†Œ(즉, 각 객체의 ingredients μ†μ„±μ˜ κ°’λ“€(즉, ingredients λ°°μ—΄μ˜ μš”μ†Œλ“€))을 λ½‘μ•„μ„œ μƒˆλ‘œμš΄ λ°°μ—΄λ‘œ λ§Œλ“¦
    β†’ map 이용

  • κ·Έ λ§Œλ“  배열듀을 ν•˜λ‚˜μ˜ 배열에 λ„£κΈ° μœ„ν•΄ 평탄화 μž‘μ—…
    β†’ flat() 이용

  • mushrooms만 골라냄 β†’ filter() 이용

  • lengthλ₯Ό ꡬ함

var products = [
  { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false },
  { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false },
  { name: "South Of The Border", ingredients: ["black beans", "jalapenos", "mushrooms"], containsNuts: false },
  { name: "Blue Moon", ingredients: ["blue cheese", "garlic", "walnuts"], containsNuts: true },
  { name: "Taste Of Athens", ingredients: ["spinach", "kalamata olives", "sesame seeds"], containsNuts: true }
];

// 1. 정리λ₯Ό μœ„ν•΄ λ©”μ„œλ“œλ₯Ό μ“Έ λ•Œλ§ˆλ‹€ λ³€μˆ˜μ— ν• λ‹Ήν•œ 버전

var allIngredients = products.map(function (obj) {
  return obj.ingredients;
});

var flat = allIngredients.flat();

var mushrooms = flat.filter(function (ingredient) {
  return ingredient === 'mushrooms';
});

console.log(mushrooms.length); // 2

// 2. ν•œ λ²ˆμ— 짧게 쀄인 버전

var ingredientCount = products.map(function (obj) {
  return obj.ingredients;
})
  .flat()
  .filter(function (ingredient) {
    return ingredient === 'mushrooms';
  }).length;

console.log(ingredientCount); // 2

πŸ™‹β€β™€οΈ 질문

μ›λž˜ 사전에 μ•„λž˜ 두 μ€„μ˜ μ½”λ“œκ°€ μ£Όμ–΄μ Έ μžˆμ—ˆλŠ”λ° λ‚΄κ°€ λ§Œλ“€λ‹€ λ³΄λ‹ˆ 이것듀이 λ°°μ œλ˜μ—ˆλ‹€. 사싀 이 μ½”λ“œλ“€μ΄ 잘 이해가 가지 μ•ŠλŠ”λ‹€.

var ingredientCount = { "{ingredient name}": 0 };
console.log(ingredientCount['mushrooms']);

검색해보고 옴

μ²˜μŒλΆ€ν„° mushroom이 λ“€μ–΄κ°„ 개수λ₯Ό κ΅¬ν•˜λŠ” 게 μ•„λ‹ˆλΌ μ–΄λ–€ μž¬λ£ŒλΌλ„ λͺ‡ κ°œκ°€ λ“€μ–΄κ°€λŠ”μ§€ ꡬ할 수 μžˆλ„λ‘ μ½”λ“œλ₯Ό μ§œμ•Ό ν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€.

ν•˜μ§€λ§Œ, μœ„μ˜ 두 μ½”λ“œλ“€μ„ λΉ„λ‘―ν•΄ μ—¬μ „νžˆ 이해가 μ•ˆ κ°„λ‹€.


✨ 내일 ν•  것

  1. Number Baseball κ΅¬ν˜„ μ‹œμž‘
profile
λŠ₯λ™μ μœΌλ‘œ μ‚΄μž, ν–‰λ³΅ν•˜κ²ŒπŸ˜

0개의 λŒ“κΈ€