fffo
js 복습 - 깊은복사, 생성자, Date 본문
깊은 복사
- 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