JS repl.it3

younghyun·2022년 1월 30일
0

날짜와 시간

  • Date() : 날짜 객체 생성
    new Date() 가 반환된 rightNow 를 그대로 사용안함
    Date 타입이 갖고 있는 메서드를 활용함.
    코드 1번째 줄이 실행 되는 순간 현재 시간이 담김

    var rightNow = new Date();
    console.log(rightNow); // 2019-02-18T00:45:06.562Z
    
    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();
    let time = rightNow.getTime();

    getMonth(): 현재 달보다 1 작은 값을 반환
    getDate() : 날짜 반환
    getDay() : 요일 반환
    getTime() : 날짜 밀리초 표현 반환. 비교 연산을
    통해 언제가 더 과거인지 판단 가능.
    1564563605026 ( 기준일 1970년 1월 1일로부터 1564563605026 밀리초가 지났다는 의미 )

  • 특정 날짜 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); //

    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
    1990-03-21T00:45:06.562Z
    리턴 값은 30 이 되어야 합니다.

// 강의 내용과 관련된 코드를 작성하세요.
function getWesternAge(birthday) {
  // Date 객체인 birthday 를 매개변수로 받는 getWesternAge 함수 생성
  let rightNow = new Date();
  let age = rightNow.getFullYear() - birthday.getFullYear();
  // 현재 연도에서 생일 연도를 뺀 값을 age 로 한다.
  let birthMonth = birthday.getMonth();
  let thisMonth = rightNow.getMonth();
  // 현재 월과 생일 월을 변수에 저장한다.
  let birthDate = birthday.getDate();
  let thisDate = rightNow.getDate();
  // 현재 날짜와 생일 날짜를 변수에 저장한다.

  // 아래 코드는 다음 흐름에 따라 작성되었다.
  // 1. 생일 월과 현재 월을 비교 (3가지 경우의 수를 if, else if, else 로 처리)
  // 2. 생일 월과 현재 월이 같을 경우, 날짜를 비교

  if (birthMonth < thisMonth) {
    return age;
  } else if (birthMonth > thisMonth) {
    return age -1;
  } else {
    if (birthDate <= thisDate) {
      return age;
    } else {
      return age -1;
    }
  }
}

let mybirthday = new Date("1990-03-21T00:45:06.562Z");
console.log(getWesternAge(mybirthday));

// 아래의 코드는 절대로 수정하거나 삭제하지 마세요.
module.exports = {getWesternAge};

Number

Math.round(x)메서드 : 반올림 값 반환.
Math.ceil(x)메서드 : 가장 가까운 정수로 올림 된 x 값을 반환
Math.floor(x)메서드 : 가장 가까운 정수 로 내림 한 x 값을 반환
Math.trunc(x)메서드 : x의 정수 부분 반환.
Math.sign(x)메서드 : x가 음수, null 또는 양수이면 반환
Math.pow(x, y)메서드 : x의 값을 y의 거듭제곱으로 반환
Math.sqrt(x)메서드 : x의 제곱근을 반환
Math.abs(x)메서드 : x의 절대(양수) 값을 반환
Math.min()메서드 : 인수 목록에서 가장 낮은 값 찾음
Math.max()메서드 : 인수 목록에서 가장 높은 값 찾음
Math.random()메서드 : 0(포함)과 1(제외) 사이의 난수 반환

// 강의 내용과 관련된 코드를 자유롭게 작성해주세요.
console.log(Math.floor(2.5));

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

console.log(getRandomNumber (1, 10));

// 아래 코드는 절대 수정하지 마세요.
module.exports = {getRandomNumber};

위 코드에서 min이 없다면 8, 3이면 11이 최대값으로 지정되서 10.999까지(floor하면 10까지) 나오는 상황 발생함.(-min을 넣어서 최대값이 최소값 더해도 영향을 안받게 해야함) 8(최대값)을 포함해서 출력하게 하고 싶다면 - min + 1을 함.

객체

  • 객체 : 이름과 값으로 구성된 프로퍼티들의 집합


객체 규칙
property 이름은 중복될 수 없음.
property이름과 property값 사이에 : (콜론)으로 구분함.
property를 추가할 때는, (쉼표)를 붙여줌
property 값에는 어느 type이나 가능(string, number, array, object, function..)

객체 접근법
dot notation : 마침표(.) 연산자를 사용하며, 접근하려는 객체명은 왼쪽에, 프로퍼티 명은 오른쪽에 위치.
bracket notation : 대괄호([])를 사용하여, 접근하려는 객체명은 왼쪽에, 프로퍼티 명은 쌍따옴표("")와 함께 대괄호 안에 작성.
변수 사용시



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;
}
let amount = [["20190401", 34], ["20190402", 23], ["20190403", 29]];
let review = [["20190328", 3], ["20190401", 0], ["20190403", 1]];
let like = [["20190328", 98], ["20190401", 102], ["20190403", 125]];

console.log(getData(amount, review, like));



// 아래 코드를 수정하거나 삭제하지 마세요.
module.exports = {getData}

Scope

scope(namespace<변수 이름 이야기 할 시>) : '변수가 어디까지 쓰일 수 있는지'의 범위를 의미.(변수가 선언되고 사용되는 공간)
is not defined 는 변수가 아직 선언되지 않았다는 뜻.
변수를 선언해도 선언한 영역(block)에 접근할 수 없으면, 컴퓨터가
변수가 선언 되었다는 사실을 알지 못할 경우 오류메시지 출력됨.
어떤 변수는 여기저기서 쓸 수 있는 반면에, 어떤 변수는 특정 함수 내에서만 쓸 수 있음. 이런 개념이 scope

block : 중괄호({} , curly brace)로 감싸진 것
function 의 내부는 하나의 block, for, if문도 하나의 block


block scope : 블록 안 지역 변수 선언하는 범위
local(지역)변수 : {}(block)내부에서 정의된 변수. 오로지 {} (block)내부에서만 사용할 수 있음.

globl scope(namespace) : block 밖 전역 변수 선언, 사용하는 범위
global(전역)변수 : block밖인 global scope에서 만든 변수.
어디서든 접근 가능해서 변수값을 확인할 수 있음.
scope 외부(block밖)에서는 특정 scope의 변수에 접근할 수가 없음.
남발할 시 scope오염 발생


좋은 scoping 습관 : global 변수가 여기저기서 수정되면 안되기 때문에 변수들은 block scope으로 최대한 나눠야 함. ( 최대한 {} 내에서 let, const을 사용하여 변수를 새로 만들어서 써야 함. )

타이트한 scope(tightly scoping)의 변수는 코드 품질을 올려줌.
코드가 block 으로 명확하게 구분되기 때문에 코드 가독성이 올라감.
코드가 한줄 한줄 쭉 나열된 것이 아니라 각각의 기능별로 block을 나누면 코드가 이해하기 쉬워짐.
나중에 코드를 수정할 일이 있을 때, 코드를 오랜만에 보더라도 잘 나뉘어 있어서 유지보수가 쉬워짐.
프로그램이 끝날때까지 변수가 살아있는 것이 아니라서(block이 끝나면 local 변수의 삶이 끝나서) 메모리 절약됨.

scope 오염 : global 변수 값이 계속 변해서 변수 트래킹이 어렵고, 왜 필요한지 모르는 어디에서 선언했는지 경우

같은 이름 변수 사용으로 인한 scope 오염

위 코드는 function 의 block, scope, if 문의 block, scope으로, 모두 block 을 잘 사용 하였는데도 scope namespace가 오염된 것. 왜냐하면 같은 이름의 변수를 사용했기 때문.
새로운 block에서 변수를 쓸 때는 항상 다른 이름으로 변수를 선언해야함.

profile
선명한 기억보다 흐릿한 메모

0개의 댓글