TIL

TIL :: JavaScript / replit. 21~24

sophie0527 2022. 5. 17. 02:11

⁍21. λ‚ μ§œμ™€ μ‹œκ°„

  • νšŒμ›κ°€μž…μ„ ν•œ λ‚ μ§œμ™€ μ‹œκ°„,
  • 글을 μž‘μ„±ν•œ μ‹œκ°„
  • νœ΄λŒ€ν°μ˜ ν˜„μž¬ μ‹œκ°„ λ“±...

λ‚ μ§œμ™€ μ‹œκ°„μ„ μ €μž₯ν•˜κ³  보여쀄 λ•Œ λ‚ μ§œ 객체λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ‚ μ§œ 객체λ₯Ό 생성할 λ•Œ : new μ—°μ‚°μž λ‹€μŒμ— Date μƒμ„±μžλ₯Ό μ”λ‹ˆλ‹€.

  • new Date()
var rightNow = new Date();
console.log(rightNow);
//2019-02-18T00:45:06.562Z

예) 2μ›” 18일 μ›”μš”μΌ 19:45

Date κ°μ²΄λ‘œ ν˜„μž¬ μ‹œκ°„μ„ κ°€μ Έμ˜¨ ν›„, Date κ°μ²΄κ°€ κ°–κ³  μžˆλŠ” ν•¨μˆ˜λ‘œ 각 λ‚ μ§œ, μ‹œκ°„μ˜ 값을 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

let rightNow = new Date();
let year = rightNow.getFullYear();
let month = rightNow.getMonth()+1;
let date = rightNow.getDate();
let day = rightNow.getDay();
let currentHour = rightNow.getHours();
let currentMin = rightNow.getMinutes();

console.log(year)
console.log(month)
console.log(date)
console.log(day)
console.log(currentHour)
console.log(currentMin)

⚠️ μ£Όμ˜

getMonth λ©”μ„œλ“œλŠ”, ν˜„μž¬ 달보닀 1 μž‘μ€ 값을 λ°˜ν™˜ ν•˜λ―€λ‘œ μ£Όμ˜ν•΄μ£Όμ„Έμš”.

λ˜ν•œ 1초, 1초 μ‹œκ°„μ΄ 흐λ₯Έλ‹€κ³  ν•΄μ„œ rightNow λ‹΄κΈ΄ μ‹œκ°„ 값이 λ³€ν•˜μ§€ μ•ŠλŠ”κ±΄ μ•„μ‹œκ² μ£ ?

μœ„μ˜ μ½”λ“œ 1번째 쀄이 μ‹€ν–‰λ˜λŠ” μˆœκ°„μ˜ ν˜„μž¬ μ‹œκ°„μ΄ λ‹΄κΈ°λŠ” 것 μž…λ‹ˆλ‹€.

 

β—‰ getTime

let rightNow = new Date();
let time = rightNow.getTime();

getTime λ©”μ„œλ“œλ‘œ λ‚ μ§œμ˜ λ°€λ¦¬μ΄ˆ ν‘œν˜„μ„ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1564563605026 μ΄λΌλŠ” μˆ«μžκ°€ λ°˜ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„λ§ˆ μ—¬λŸ¬λΆ„λ“€μ΄ 보고 μžˆλŠ” μˆ«μžμ™€ λ‹€λ₯Ό κ²ƒμž…λ‹ˆλ‹€.

참고둜, 기쀀이 λ˜λŠ” μΌμžλŠ” 1970λ…„ 1μ›” 1μΌμž…λ‹ˆλ‹€.

1970λ…„ 1μ›” 1μΌλ‘œλΆ€ν„° 1564563605026 λ°€λ¦¬μ΄ˆκ°€ μ§€λ‚¬λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

λ§Œμ•½ 10λΆ„ 뒀에 λ‹€μ‹œ μƒˆλ‘œ new Date() λ₯Ό ν˜ΈμΆœν•˜λ©΄, μ‹œκ°„μ΄ 쑰금 ν˜λ €μœΌλ‹ˆ μœ„μ˜ 1564563605026 λ³΄λ‹€λŠ” 큰 μˆ«μžκ°€ λ‚˜μ˜¬ κ²ƒμž…λ‹ˆλ‹€.

μ΄λ ‡κ²Œ getTime λ©”μ†Œλ“œλ‘œ λ°˜ν™˜λœ 숫자둜 비ꡐ연산을 톡해 μ–Έμ œκ°€ 더 과거인지 νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

값이 더 μž‘μœΌλ©΄ κ³Όκ±°μž…λ‹ˆλ‹€.

 

β—‰ νŠΉμ • λ‚ μ§œμ˜ Date 

νŠΉμ • λ‚ μ§œλ₯Ό 맀개 λ³€μˆ˜ 둜 λ„˜κ²¨μ£Όλ©΄, ν•΄λ‹Ή λ‚ μ§œμ˜ Dateλ₯Ό λ°˜ν™˜ 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

let date1 = new Date('December 17, 2019 03:24:00');
let date2 = new Date('2019-12-17T03:24:00');
let date3 = new Date(2019, 5, 1);

미ꡭ을 λΉ„λ‘―ν•΄ 전세계 λŒ€λΆ€λΆ„μ˜ λ‚˜λΌλ“€μ΄ 생일을 κΈ°μ€€μœΌλ‘œ λ‚˜μ΄λ₯Ό 계산 ν•©λ‹ˆλ‹€. μ‰½κ²Œ 말해 미ꡭ은 νƒœμ–΄λ‚˜μžλ§ˆμž 0살이고 생일을 μ§€λ‚˜μ•Ό λΉ„λ‘œμ†Œ ν•œ 살이 λ©λ‹ˆλ‹€. λ°˜λ©΄μ— ν•œκ΅­μ€ νƒœμ–΄λ‚˜μžλ§ˆμž 1살이고 연도가 λ°”λ€” λ•Œλ§ˆλ‹€ ν•œ μ‚΄μ”© λ¨ΉμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ―Έκ΅­μ—μ„œλŠ” 1995λ…„ 9μ›” 12일에 νƒœμ–΄λ‚¬μœΌλ©΄ 1995λ…„ 9μ›” 12μΌμ—λŠ” 0살이고

1996λ…„ 9μ›” 12일이 λ˜μ•Ό 1살이 λ©λ‹ˆλ‹€. 그에 λΉ„ν•΄ ν•œκ΅­μ—μ„œλŠ” 1995λ…„ 9μ›” 12일에 νƒœμ–΄λ‚˜μžλ§ˆμž 1살이고 1996λ…„ 1μ›” 1일에 2살이 λ©λ‹ˆλ‹€.

1μ‚΄ 차이도 크게 μƒκ°ν•˜λŠ” μš°λ¦¬λ‚˜λΌ 고유의 문화에 λΉ„λ‘―ν•œ 계산법이 μ•„λ‹Œκ°€ μΆ”μΈ‘ν•΄ λ΄…λ‹ˆλ‹€. λ―Έκ΅­μ΄λ‚˜ λ‹€λ₯Έ λ‚˜λΌκ°€ μ‚¬μš©ν•˜λŠ” λ‚˜μ΄ 계산법은 μš°λ¦¬λ‚˜λΌμ—μ„œλŠ” λ§Œ λ‚˜μ΄ λΌκ³  ν•˜μ£ .


Assignment

미ꡭ을 λΉ„λ‘―ν•΄ 전세계 λŒ€λΆ€λΆ„μ˜ λ‚˜λΌλ“€μ΄ 생일을 κΈ°μ€€μœΌλ‘œ λ‚˜μ΄λ₯Ό 계산 ν•©λ‹ˆλ‹€. μ‰½κ²Œ 말해 미ꡭ은 νƒœμ–΄λ‚˜μžλ§ˆμž 0살이고 생일을 μ§€λ‚˜μ•Ό λΉ„λ‘œμ†Œ ν•œ 살이 λ©λ‹ˆλ‹€. λ°˜λ©΄μ— ν•œκ΅­μ€ νƒœμ–΄λ‚˜μžλ§ˆμž 1살이고 연도가 λ°”λ€” λ•Œλ§ˆλ‹€ ν•œ μ‚΄μ”© λ¨ΉμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ―Έκ΅­μ—μ„œλŠ” 1995λ…„ 9μ›” 12일에 νƒœμ–΄λ‚¬μœΌλ©΄ 1995λ…„ 9μ›” 12μΌμ—λŠ” 0살이고 1996λ…„ 9μ›” 12일이 λ˜μ•Ό 1살이 λ©λ‹ˆλ‹€. 그에 λΉ„ν•΄ ν•œκ΅­μ—μ„œλŠ” 1995λ…„ 9μ›” 12일에 νƒœμ–΄λ‚˜μžλ§ˆμž 1살이고 1996λ…„ 1μ›” 1일에 2살이 λ©λ‹ˆλ‹€. 1μ‚΄ 차이도 크게 μƒκ°ν•˜λŠ” μš°λ¦¬λ‚˜λΌ 고유의 문화에 λΉ„λ‘―ν•œ 계산법이 μ•„λ‹Œκ°€ μΆ”μΈ‘ν•΄ λ΄…λ‹ˆλ‹€. λ―Έκ΅­μ΄λ‚˜ λ‹€λ₯Έ λ‚˜λΌκ°€ μ‚¬μš©ν•˜λŠ” λ‚˜μ΄ 계산법은 μš°λ¦¬λ‚˜λΌμ—μ„œλŠ” λ§Œ λ‚˜μ΄ λΌκ³  ν•˜μ£ .

μ•žμ„œ λ§ν•œ 만으둜 κ³„μ‚°ν•œ λ‚˜μ΄λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜μΈ getWesternAge ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄ λ΄…μ‹œλ‹€.

  • 이 ν•¨μˆ˜λŠ” birthday λΌλŠ” 인자λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
  • 이 birthday λŠ” Date κ°μ²΄ μž…λ‹ˆλ‹€. birthday λΌλŠ” 인자λ₯Ό λ„£μ—ˆμ„ λ•Œ, ν˜„μž¬λ₯Ό κΈ°μ€€μœΌλ‘œ 만으둜 κ³„μ‚°ν•œ λ‚˜μ΄λ₯Ό 리턴 ν•΄μ£Όμ„Έμš”.
  • birthday λŠ” string이 μ•„λ‹Œ Date κ°μ²΄λΌλŠ” κ±Έ λͺ…μ‹¬ν•˜μ„Έμš” :)
  • 예λ₯Ό λ“€μ–΄, 였늘이 2020λ…„ 7μ›” 21일이고, birthday κ°’이 λ‹€μŒκ³Ό κ°™λ‹€λ©΄:
1990-03-21T00:45:06.562Z

리턴 값은 30 이 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

function getWesternAge(birthday) {
  let current = new Date();
  let year = current.getFullYear();
  let month = current.getMonth() + 1;
  let date = current.getDay();

  let age = year - birthday.getFullYear(); 
  console.log(age);

  if ( 
    month < birthday.getMonth() ||
    (month === birthday.getMonth() + 1 && date <  birthday.getDay())
    ) {
      age -= 1;
      }
        console.log(age);
        return age;
}

⁍22. Number

μˆ˜ν•™ 계산을 μœ„ν•΄μ„œλŠ” JavaScriptμ—μ„œ μ œκ³΅ν•˜λŠ” Math 객체λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ‹€μŒ μ‚¬μ΄νŠΈμ—μ„œ ν•œ 번 λ΄μ£Όμ„Έμš”. πŸ‘‰ Math객체

μ ˆλŒ€κ°’ κ΅¬ν•˜κΈ°, sin, cos, 제곱근 λ“±λ“±, Math 객체에 μˆ˜ν•™κ³„μ‚° λ©”μ„œλ“œκ°€ 많이 μžˆλ„€μš”.

 

β—‰ round, ceil, floor

  • round : 반올림 λ©”μ„œλ“œ 
  • ceil : 올림 λ©”μ„œλ“œ
  • floor : λ‚΄λ¦Ό λ©”μ„œλ“œ
console.log(Math.round(2.5));
console.log(Math.round(2.49));
console.log(Math.round(2));
console.log(Math.round(2.82));
console.log(Math.ceil(2.5));
console.log(Math.ceil(2.49));
console.log(Math.ceil(2));
console.log(Math.ceil(2.82));
console.log(Math.floor(2.5));
console.log(Math.floor(2.49));
console.log(Math.floor(2));
console.log(Math.floor(2.82));

 

β—‰ λžœλ€ν•¨μˆ˜ 

  • Math.random()
var randomNumber = Math.random();
console.log(randomNumber);

0.0000000000000000μ—μ„œ 0.9999999999999999 μ‚¬μ΄μ˜ κ°’μ—μ„œ 랜덀수λ₯Ό 제곡

var randomNumber = Math.random();
console.log(Math.floor(randomNumber*10));

randomNumber * 10 μ˜ 값은 1의 μžλ¦¬μˆ˜μ— μ—„μ²­ κΈ΄ μ†Œμˆ˜μžλ¦¬λ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

ex) 9.697009826327621

확인해 λ³΄μ…¨λ‚˜μš”?

μ΄λ ‡κ²Œ κ΅¬ν•œ ν›„, μ†Œμˆ˜μžλ¦¬λŠ” λ‹€ 버리도둝 λ‚΄λ¦Όν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 0~10 μ‚¬μ΄μ˜ 랜덀수λ₯Ό ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

이런 λžœλ€ν•¨μˆ˜λŠ” 둜또λ₯Ό λ½‘κ±°λ‚˜, 이벀트 λ‹Ήμ²¨μžλ₯Ό 뽑을 λ•Œ μœ μš©ν•˜κ²Œ μ“°μž…λ‹ˆλ‹€.


Assignment

μ΅œμ†Œ(min), μ΅œλŒ€κ°’(max)을 λ°›μ•„ κ·Έ μ‚¬μ΄μ˜ 랜덀수λ₯Ό return ν•˜λŠ” ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ£Όμ„Έμš”.

  • ν•¨μˆ˜λŠ” μ§§μ§€λ§Œ, μ΄λ²ˆμ—λŠ” μˆ˜ν•™μ˜ λ‡Œλ₯Ό 쑰금 써야 ν•˜λŠ” assignment μž…λ‹ˆλ‹€. πŸ™Œ
  • μ•žμœΌλ‘œ λžœλ€ν•¨μˆ˜λ₯Ό μ“Έ 일이 정말 λ§ŽμŠ΅λ‹ˆλ‹€.
  • 그런데 Math.random() μœΌλ‘œλŠ” λ‚΄κ°€ μ›ν•˜λŠ” λ²”μœ„μ˜ 랜덀수λ₯Ό 얻을 μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.
  • 항상 0.0000000000000000μ—μ„œ 0.9999999999999999 사이 κ°’λ§Œ return ν•΄μ£ΌκΈ° λ•Œλ¬Έμ΄μ£ .

 

πŸ˜…λ‚˜μ˜ 풀이

// Assignment
function getRandomNumber (min, max) {
  let random = Math.random()*(max - min) + min;
  return random;
}
console.log(getRandomNumber)

μ •λ‹΅

// Assignment
function getRandomNumber (min, max) {
  return Math.round(Math.random() * (max - min) +min);
}

⁍23. Object (객체)

 

  • κ°μ²΄λŠ” {}(μ€‘κ΄„ν˜Έ)둜 감싸져 있고,
  • 콜둠으둜 κ΅¬λΆ„λœ 이름 / κ°’ 의쌍 듀이, μ‰Όν‘œλ‘œ λΆ„λ¦¬λœ λͺ©λ‘μ˜ ν˜•νƒœμž…λ‹ˆλ‹€.

λ‹€μ‹œ λ§ν•˜λ©΄ κ°μ²΄λŠ” 이름과 κ°’μœΌλ‘œ κ΅¬μ„±λœ ν”„λ‘œνΌν‹°λ“€μ˜ 집합이라고 ν•  수 μžˆλ‹€.

μœ„μ—μ„œ property 이름을 1, 2둜 λ‚˜λˆ„μ—ˆλŠ”λ°, ν”„λ‘œνΌν‹° 이름은 쀑볡이 되면 μ•ˆ 되기 λ•Œλ¬Έμ— 숫자λ₯Ό 달리 ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

plan1 μ˜ 객체λ₯Ό λ§Œλ“€μžλ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

let plan1 = {
  name: "Basic",
  price: 3.99,
  space: 100,
  transfer: 1000,
  pages: 10
};

μ•„λž˜μ˜ κ·œμΉ™μ„ μ§€μΌœ 객체λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • property 이름은 쀑볡될 수 μ—†λ‹€.
  • property이름과 propertyκ°’ 사이에 : (콜둠)으둜 κ΅¬λΆ„ν•œλ‹€.
  • propertyλ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” , (μ‰Όν‘œ)λ₯Ό λΆ™μ—¬μ€€λ‹€.
  • property κ°’μ—λŠ” μ–΄λŠ typeμ΄λ‚˜ κ°€λŠ₯ν•˜λ‹€(string, number, array, object, function..)

ν•΄λ‹Ή 객체의 property값을 μ ‘κ·Όν•˜κ³  싢을 λ•ŒλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • λ§ˆμΉ¨ν‘œ(.) μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©°, μ ‘κ·Όν•˜λ €λŠ” 객체λͺ…은 μ™Όμͺ½μ—, ν”„λ‘œνΌν‹° λͺ…은 였λ₯Έμͺ½μ— μœ„μΉ˜ν•©λ‹ˆλ‹€.
  • λŒ€κ΄„ν˜Έ([])λ₯Ό μ‚¬μš©ν•˜μ—¬, μ ‘κ·Όν•˜λ €λŠ” 객체λͺ…은 μ™Όμͺ½μ—, ν”„λ‘œνΌν‹° λͺ…은 μŒλ”°μ˜΄ν‘œ("")와 ν•¨κ»˜ λŒ€κ΄„ν˜Έ μ•ˆμ— μž‘μ„±ν•©λ‹ˆλ‹€.
let plan1 = {   
  name: "Basic"
};

console.log(plan1.name);
console.log(plan1["name"]);

μ•„λž˜μ˜ μ½”λ“œμ—μ„œ μ–΄λ–»κ²Œ 객체의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν–ˆλŠ”μ§€ ν™•μΈν•΄μ£Όμ„Έμš”.

let myObj = {
  property1: "hello",
  property2: [1,2,3,4,5],
  property3: {
    childproperty: "haha"
  }
};

let name = "property";
console.log(myObj[name+"1"]);
console.log(myObj[name+"2"]);
console.log(myObj[name+"3"]);
console.log(myObj[name+"3"]["child"+name]);

console.log(myObj.property1);
console.log(myObj.property2);
console.log(myObj.property3);
console.log(myObj.property3.childproperty);

직접 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ„œ ν…ŒμŠ€νŠΈν•΄λ³΄κ³ , μ΄ν•΄λ˜μ§€ μ•ŠλŠ” 것이 있으면 μ§ˆλ¬Έν•΄μ£Όμ„Έμš”!

μœ„μ˜ myObj κ°μ²΄λ₯Ό μ •μ˜ν•œ 후에 property 값을 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let name = "property1";
myObj[name] = ["hi", "hello"];
console.log(myObj);

myObj객체의 property1 μ˜ 값은 μ›λž˜ ν…μŠ€νŠΈ μ˜€λŠ”λ° λ°°μ—΄λ‘œ λ°”κΏ”λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

myObj κ°€ μ–΄λ–»κ²Œ λ°”λ€Œμ—ˆλŠ”μ§€ κΌ­ ν™•μΈν•΄λ³΄μ„Έμš”.

ν˜Ήμ€ μƒˆλ‘œμš΄ propertyλ₯Ό μΆ”κ°€ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

myObj.property3.siblingproperty = [3, 6, 9];
console.log(myObj);

myObj κ°€ μ–΄λ–»κ²Œ λ°”λ€Œμ—ˆλŠ”μ§€ κΌ­ ν™•μΈν•΄λ³΄μ„Έμš”!!!!!!!!!

myObj μ˜ property1 κ°€ λ°°μ—΄λ‘œ λ°”λ€Œμ—ˆλŠ”λ°, 이 λ°°μ—΄μ˜ 첫번째 μš”μ†Œλ₯Ό μ ‘κ·Όν•˜κ³  μ‹ΆμœΌλ©΄ μ•„λž˜μ™€ 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

console.log(myObj.property1[0]);

myObj.property1 λŠ” ["hi", "hello"] μ΄κ³ , index 0에 μ ‘κ·Όν•˜μ˜€μœΌλ―€λ‘œ "hi" κ°€ λ‚˜μ˜¬ κ²ƒμž…λ‹ˆλ‹€.

μ•„λž˜μ™€ 같은 객체의 κ΅¬μ‘°λŠ” 정말 많이 μ“°μž…λ‹ˆλ‹€.

객체의 객체의 λ°°μ—΄μ˜ 객체.....?

let objData = {
  name: 50,
  address: { 
    email: "gaebal@gmail.com",
    home: "μœ„μ›Œν¬ 선릉2호점"
  },
  books: {
    year: [2019, 2018, 2006],
    info: [{
      name: "JS Guide",
      price: 9000
    }, {
      name: "HTML Guide",
      price: 19000,
      author: "Kim, gae bal"
    }]
  }
};

objData λΌλŠ” κ°μ²΄μ•ˆμ— name , address , books λΌλŠ” propertyκ°€ μžˆμŠ΅λ‹ˆλ‹€.

books μ— 또 객체가 ν• λ‹Ή λ˜μ—ˆλ„€μš”.

μœ„μ˜ λ°μ΄ν„°μ—μ„œ "HTML Guide" 에 μ ‘κ·Όν•˜κ³  싢을 λ•ŒλŠ” μ•„λž˜μ™€ 같이 ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

let bookName = objData.books.info[1].name;
console.log(bookName);

objData.book μ€ objData κ°μ²΄μ˜ book μ΄λΌλŠ” propertyλͺ…μ˜ property값을 가져와야 ν•˜λŠ”λ°,

ν•΄λ‹Ή propertyλͺ…은 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ‹ˆκΉŒ 값도 μ—†λŠ” 것이고 κ·Έλž˜μ„œ undefined λΌκ³  λ‚˜μ˜΅λ‹ˆλ‹€.


Assignment

μ΄μ œκΉŒμ§€ ν•˜μ…¨λ˜ Assignment μ™€λŠ” 쑰금 λ‹€λ₯Έ μœ ν˜•μž…λ‹ˆλ‹€. κ·Έ λ™μ•ˆμ—λŠ” νŠΉμ •κ°’μ„ κ΅¬ν•΄μ„œ 리턴 ν–ˆλ‹€λ©΄, μ΄λ²ˆμ—λŠ” 인자둜 받은 데이터λ₯Ό μ‘°ν•©ν•΄μ„œ, ꡬ쑰λ₯Ό λ°”κΏ”μ„œ λ¦¬ν„΄ν•©λ‹ˆλ‹€.

getData ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ£Όμ„Έμš”!

  • getData ν•¨μˆ˜λŠ” μ„Έ 개의 배열을 인자둜 λ°›μŠ΅λ‹ˆλ‹€.
    • salesArr : λ‚ μ§œλ³„ νŒλ§€λŸ‰
      • ex) [["20190401", 34], ["20190402", 23], ["20190403", 29]]
    • reviewArr : λ‚ μ§œλ³„ 리뷰수
      • ex) [["20190328", 3], ["20190401", 0], ["20190403", 1]]
    • likeArr : λ‚ μ§œλ³„ μ’‹μ•„μš”μˆ˜
      • ex) [["20190328", 98], ["20190401", 102], ["20190403", 125]]
  • λ‹€μŒ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•˜λŠ” 객체λ₯Ό λ§Œλ“€μ–΄μ„œ return ν•΄μ£Όμ„Έμš”.
  • λ¦¬ν„΄λ˜λŠ” κ°μ²΄λŠ” μ•„λž˜μ™€ 같이 3개의 propertyλ₯Ό κ°€μ§‘λ‹ˆλ‹€.
    • sumAmount : 총 νŒλ§€λŸ‰
    • sumReview : 총 리뷰개수
    • sumLike : 총 μ’‹μ•„μš”μˆ˜
function getData(salesArr, reviewArr, likeArr) {
  let sumAmount = 0;
  let sumReview = 0;
  let sumLike = 0;
  
  for(let i = 0; i < salesArr.length; i++) {
      sumAmount += salesArr[i][1];
    }
  for(let i = 0; i < reviewArr.length; i++) {
      sumReview += reviewArr[i][1];
    }
  for(let i = 0; i < likeArr.length; i++) {
      sumLike += likeArr[i][1];
    }
    
  const objData = {
    sumAmount: sumAmount,
    sumReview: sumReview,
    sumLike: sumLike,
  };
  return objData;
}

⁍24. Scope

scope은 JavaScript의 문법이 μ•„λ‹™λ‹ˆλ‹€.

JavaScriptμ—μ„œ scopeμ΄λž€, 'λ³€μˆ˜κ°€ μ–΄λ””κΉŒμ§€ 쓰일 수 μžˆλŠ”μ§€'의 λ²”μœ„λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

 

β—‰ Block

blockμ΄λž€ μ€‘κ΄„ν˜Έ({} , curly brace)둜 감싸진 것을 block이라고 ν•©λ‹ˆλ‹€.

function μ˜ λ‚΄λΆ€λŠ” ν•˜λ‚˜μ˜ blockμž…λ‹ˆλ‹€.

function hi() {
  return 'i am block';
}

for λ¬Έλ„ ν•˜λ‚˜μ˜ blockμ΄κ³ μš”

for (let i = 0; i < 10; i++) {
  count++;
}

if λ¬Έμ˜ {} λ„ ν•˜λ‚˜μ˜ blockμž…λ‹ˆλ‹€.

if (i === 1) {
  let j = 'one';
  console.log(j);
}

{} (block)λ‚΄λΆ€μ—μ„œ λ³€μˆ˜κ°€ μ •μ˜λ˜λ©΄ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ {} (block)λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{} (block)λ‚΄λΆ€μ—μ„œ μ •μ˜λœ λ³€μˆ˜λŠ” local(μ§€μ—­) λ³€μˆ˜λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

function getResult() {
  let result = 10;
  
  return result;
}

// μžλ°”μŠ€ν¬λ¦½νŠΈ μ—λŸ¬! 
// getResult λ‚΄λΆ€μ˜ scope에 μ ‘κ·Όν•  수 μ—†λ‹€
console.log(result);

console.log(result) μ—μ„œ getResult λ‚΄λΆ€μ— 접근이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— result λΌλŠ” λ³€μˆ˜μ˜ 쑴재λ₯Ό μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€.

result λΌλŠ” λ³€μˆ˜λŠ” getResult ν•¨μˆ˜μ˜ {} (block)μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

β—‰ Global(μ „μ—­) Scope 

scope은 λ³€μˆ˜κ°€ μ„ μ–Έλ˜κ³  μ‚¬μš©ν•  수 μžˆλŠ” κ³΅κ°„μž…λ‹ˆλ‹€.

scope μ™ΈλΆ€(blockλ°–)μ—μ„œλŠ” νŠΉμ • scope의 λ³€μˆ˜μ— μ ‘κ·Όν•  μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

block밖인 global scopeμ—μ„œ λ§Œλ“  λ³€μˆ˜λ₯Ό global variable(μ „μ—­λ³€μˆ˜)라고 ν•©λ‹ˆλ‹€.

μ½”λ“œ μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯ν•΄μ„œ λ³€μˆ˜κ°’μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

const color = 'red';
console.log(color);

function returnColor() {
  console.log(color);
  return color;
}

console.log(returnColor());

returnColor ν•¨μˆ˜ λ‚΄μ—μ„œ, returnColor ν•¨μˆ˜ 밖에 μžˆλŠ” color λΌλŠ” λ³€μˆ˜λ₯Ό return ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

color λΌλŠ” λ³€μˆ˜λŠ” global λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— returnColor ν•¨μˆ˜μ˜ blockμ—μ„œλ„ 접근이 κ°€λŠ₯ν•΄μ„œ 'red' λ₯Ό λ°˜ν™˜ν•œκ²ƒμž…λ‹ˆλ‹€.

 

β—‰ Scope의 μ˜€μ—Ό 

global λ³€μˆ˜λ₯Ό μ“°λ©΄ μ—¬κΈ° μ €κΈ°μ„œ μ ‘κ·Όν•˜κΈ° μ‰¬μ›Œμ„œ μ’‹λ‹€κ³  생각할 수 μžˆμ§€λ§Œ, λ„ˆλ¬΄ λ‚¨μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ— 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

global λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ήν”„λ‘œκ·Έλž¨μ˜ μ–΄λ””μ—μ„œλ‚˜ μ‚¬μš©ν•  수 μžˆλŠ” global namespaceλ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

namespaceλΌλŠ” 것은 λ³€μˆ˜ 이름을 μ‚¬μš©ν•  수 μžˆλŠ” λ²”μœ„λΌλŠ” λœ»μž…λ‹ˆλ‹€. scope이라고도 ν•˜κ³  특히 λ³€μˆ˜μ΄λ¦„μ„ μ–˜κΈ°ν•  λ•ŒλŠ” namespace라고도 ν•©λ‹ˆλ‹€.

global λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ λ•ŒκΉŒμ§€ 계속 μ‚΄μ•„μžˆμŠ΅λ‹ˆλ‹€. 이 말은 local λ³€μˆ˜λŠ” {} - block이 λλ‚˜λ©΄ 더 이상 λ³€μˆ˜κ°€ μ‚΄μ•„μžˆμ§€ μ•Šκ³  μ“Έ 수 μ—†λ‹€λŠ” λ§μž…λ‹ˆλ‹€.

global λ³€μˆ˜κ°€ 계속 μ‚΄μ•„μžˆμ–΄μ„œ λ³€μˆ˜κ°’μ΄ 계속 λ³€ν•œλ‹€λ©΄ ν•΄λ‹Ή λ³€μˆ˜λ₯Ό νŠΈλž˜ν‚Ήν•˜κΈ°λ„ μ–΄λ ΅κ³  이 λ³€μˆ˜λŠ” μ–΄λ””μ—μ„œ μ™œ ν•„μš”ν•œμ§€ μ•Œλ €λ©΄ λ„λŒ€μ²΄ μ–΄λ””μ—μ„œ let, const둜 선언을 ν–ˆλŠ”μ§€ μ°Ύμ•„ λ‚˜μ„œμ•Ό ν•©λ‹ˆλ‹€.

μ•„λž˜λŠ” scope이 μ˜€μ—Όλœ λŒ€ν‘œμ μΈ μ˜ˆμž…λ‹ˆλ‹€.

const satellite = 'The Moon';
const galaxy = 'The Milky Way';
let stars = 'North Star';

const callMyNightSky = () => {
  stars = 'Sirius';
  
  return 'Night Sky: ' + satellite + ', ' + stars + ', ' + galaxy;
};

console.log(callMyNightSky());
console.log(stars);
  • stars μ΄λΌλŠ” global λ³€μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.
  • callMyNightSky ν•¨μˆ˜μ—μ„œ μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ‹Άμ—ˆλŠ”λ° κΉœλΉ‘ν•˜κ³  let ν‚€μ›Œλ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
  • callMyNightSky μ„ ν˜ΈμΆœν•˜λ©΄ stars λ³€μˆ˜μ— "Sirius" μ΄ ν• λ‹Ήλ©λ‹ˆλ‹€.
  • global λ³€μˆ˜μ˜€λ˜ stars μ— 영ν–₯이 κ°”μŠ΅λ‹ˆλ‹€!
  • λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ global λ³€μˆ˜μΈ stars μ„ μ‚¬μš©ν•˜κ³  싢은데 값이 μˆ˜μ •λœ "Sirius" μœΌλ‘œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ•žμœΌλ‘œ ν•¨μˆ˜κ°€ λͺ‡ μ‹­κ°œ μžˆμ„μ§€λ„ λͺ¨λ₯΄λŠ” μƒν™©μ—μ„œ μ €λ ‡κ²Œ global λ³€μˆ˜λ₯Ό λ‚¨μš© ν•˜λ‹€κ°€λŠ” μ–΄λ””μ„œ μ–΄λ–»κ²Œ 값이 μˆ˜μ •λ μ§€ μ•Œ 수 μ—†μ–΄μ§‘λ‹ˆλ‹€.

 

β—‰ 쒋은 Scoping μŠ΅κ΄€ 

μœ„μ™€ 같이 global λ³€μˆ˜κ°€ μ—¬κΈ°μ €κΈ°μ„œ μˆ˜μ •λ˜λ©΄ μ•ˆλ˜κΈ° λ•Œλ¬Έμ— λ³€μˆ˜λ“€μ€ block scope으둜 μ΅œλŒ€ν•œ λ‚˜λˆ λ†”μ•Ό ν•©λ‹ˆλ‹€.

  • νƒ€μ΄νŠΈν•œ scope(tightly scoping)의 λ³€μˆ˜λŠ” μ½”λ“œ ν’ˆμ§ˆμ„ μ˜¬λ €μ€λ‹ˆλ‹€!
  • μ½”λ“œκ°€ block 으둜 λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„λ˜κΈ° λ•Œλ¬Έμ— μ½”λ“œ 가독성이 μ˜¬λΌκ°‘λ‹ˆλ‹€.
  • μ½”λ“œκ°€ ν•œμ€„ ν•œμ€„ μ­‰ λ‚˜μ—΄λœ 것이 μ•„λ‹ˆλΌ 각각의 κΈ°λŠ₯λ³„λ‘œ block을 λ‚˜λˆ„λ©΄ μ½”λ“œκ°€ μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  • λ‚˜μ€‘μ— μ½”λ“œλ₯Ό μˆ˜μ •ν•  일이 μžˆμ„ λ•Œ, μ½”λ“œλ₯Ό μ˜€λžœλ§Œμ— 보더라도 잘 λ‚˜λ‰˜μ–΄ μžˆμ–΄μ„œ μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨μ΄ λλ‚ λ•ŒκΉŒμ§€ λ³€μˆ˜κ°€ μ‚΄μ•„μžˆλŠ” 것이 μ•„λ‹ˆλΌμ„œ(block이 λλ‚˜λ©΄ local λ³€μˆ˜μ˜ 삢이 λλ‚˜μ„œ) λ©”λͺ¨λ¦¬ μ ˆμ•½λ„ λ©λ‹ˆλ‹€.

즉, ν•œλ§ˆλ””λ‘œ μš”μ•½ν•˜λ©΄ global λ³€μˆ˜λŠ” μ“°μ§€ μ•Šλ„λ‘ λ…Έλ ₯ν•΄μ•Ό ν•˜κ³ , μ΅œλŒ€ν•œ {} λ‚΄μ—μ„œ let, const μ„ μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μƒˆλ‘œ λ§Œλ“€μ–΄μ„œ μ“°μžλŠ” λ§μž…λ‹ˆλ‹€.

이제 λ§ˆμ§€λ§‰ μ˜ˆμ œμž…λ‹ˆλ‹€!

μ΄λ²ˆμ—λŠ” if λ¬Έμ˜ {} μ˜ block scope을 λ³΄κ² μŠ΅λ‹ˆλ‹€.

function logSkyColor() {
  const dusk = true;
  let myColor = 'blue'; 

  if (dusk) {
    let myColor = 'pink';
    console.log(myColor); // pink
  }

  console.log(myColor); // blue 
}

console.log(myColor); // μ—λŸ¬!!
  • if λ¬Έμ— {} μ˜ μ½”λ“œ block을 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 여기에 myColor λΌλŠ” λ³€μˆ˜λ₯Ό let μœΌλ‘œ μ„ μ–Έν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • if λ¬Έ λ‚΄μ—μ„œλŠ” "pink" λΌκ³  ν• λ‹Ή ν•˜μ˜€κ³ , if λ¬Έ λ°–μ—μ„œλŠ” "blue" λΌκ³  ν• λ‹Ήν•œ 것에 μ£Όλͺ©ν•΄μ£Όμ„Έμš”.

사싀 이 μ½”λ“œλŠ” function μ˜ block, scope, if λ¬Έμ˜ block, scope으둜, λͺ¨λ‘ block 을 잘 μ‚¬μš© ν•˜μ˜€λŠ”λ°λ„ scope namespaceκ°€ μ˜€μ—Όλœ κ²ƒμž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μƒˆλ‘œμš΄ blockμ—μ„œ λ³€μˆ˜λ₯Ό μ“Έ λ•ŒλŠ” 항상 λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ•Όν•œλ‹€λŠ” 것을 μžŠμ§€ λ§μ•„μ£Όμ„Έμš”.