fffo

js 복습 - 깊은복사, 생성자, Date 본문

Programming/Javascript

js 복습 - 깊은복사, 생성자, Date

gggs 2021. 9. 27. 18:44

깊은 복사

  • JSON 내장객체 이용 :
    • 객체를 문자열로 바꿨다가 다시 객체로 바꿈으로써 깊은 복사 수행
    • json에는 함수 데이터 타입이 없기 때문에 함수 프로퍼티가 누락됨
  • 외부 라이브러리 lodash의 cloneDeep(ob) 메서드 사용 :
    • 함수 프로퍼티 포함, 객체의 모든 부분을 새로 생성해서 복사
const _ = require("lodash");

const original = {
  func: function () {
    console.log("ppap");
  },
  obj: {
    a: 1,
    b: 2,
  },
};

const deepCopyJSON = JSON.parse(JSON.stringify(original));
console.log(original.obj === deepCopyJSON.obj); // false
console.log(deepCopyJSON.func); // undefined

const deepCopyLodash = _.cloneDeep(original);
console.log(original.obj === deepCopyLodash.obj); // false
console.log(deepCopyLodash.func); // [Function: func]

외부 라이브러리 사용법

npm

(터미널 환경)

  • npm init
    초기화. package.json을 생성해줌
  • npm i lodash
    i 옵션 : install의 단축어
  • --save : package.json의 dependencies 항목에 해당 모듈을 추가하는 옵션이지만 npm5이후로 --save 옵션 없이도 dependencies에 항목을 추가하므로 따로 기입하지 않아도 됨

생성자

  • 모든 함수 객체는 내부 메서드 [[Call]]을 가지고 있고, 함수가 호출 될 때 해당 메서드가 호출됨 ← callable이라 함
  • 생성자로서 호출 될 수 있는 함수는 내부 메서드로 [[Construct]]를 가짐
    • constructor : 함수 선언문, 함수 표현식, 클래스
    • non-constructor : 메서드(ES6 메서드 축약 표현), 화살표 함수
  • new 키워드와 함께 함수 호출 시 [[Call]]이 아닌 [[Construct]]가 호출 됨

new.target

  • 생성자 함수가 new 없이 호출되는 것을 방지하기 위해 ES6부터 new.target을 지원(IE는 지원 하지 않음에 유의)
  • 함수 내부에서 new.target을 사용 시 생성자 함수로서 호출 여부를 알 수 있음
    • 생성자 함수 → new.target은 함수 자신
    • 생성자 함수 아님(new 없이 호출) → new.target은 undefined
  • new.target을 지원하지 않는 환경에서는 스코프 세이프 생성자 패턴을 이용

Date

  • new Date() : 인수 값 만큼 UTC 기준시로부터 + ms한 Date객체를 반환
    • 인수로 연월일을 넣으면 월이 0부터 시작함에 유의
    • 인수로 연월일을 넣으면 자신의 국가 기준시가 들어 가지만 반환 값이 UTC기준시라면 서로 값이 달라질 수 있음. → 인자로 Date.UTC(연,월,일)을 입력
// Date.now()를 이용한 성능 측정
function benchmark(func) {
    const start = Date.now();
  for(let i = 0; i < 1000000; i++) {
    func(arguments);
  }
  return Date.now() - start;
}

function mul(a,b) {
  return a*b;
}

function sqr(a,b) {
  return a**b;
}

console.log(`mul : ${benchmark(mul,3,4)} ms`);
console.log(`sqr : ${benchmark(sqr,3,4)} ms`);

'Programming > Javascript' 카테고리의 다른 글

전역변수의 문제점 / let, const 키워드와 블록 스코프  (0) 2021.09.29
스코프  (0) 2021.09.28
함수  (0) 2021.09.27
원시 값과 객체의 비교  (0) 2021.09.26
객체 리터럴  (0) 2021.09.25
Comments