'2022/07/25'에 해당되는 글 3건
Swallow Copy, Deep Copy, json 복사시 문제점과 대응
JavaScript, ECMAScript# 참조 : https://paperblock.tistory.com/218
● Javascript 가 Json / 배열 객체를 다루는 법 .
요약하면 포인터 방식이다 .
1: const original = {name: '철수', age: 12};
2: const clone = original;
3: console.log(clone === original) //true
4: clone.name = '영희';
5: console.log(original.name) //영희
1열 : javascript 는 {} 객체를 할당하고 그 주소를 original 에 담는다.
2열 : clone 에 original 에 담긴 주소를 담는다 . 즉, orignal 과 clone 은 같은 객체를 가르킨다 . call by ref .
● Javascript 가 Json / 배열 객체를 다룰 때 특이사항
javascript 에는, 객체를 복사할 때 Object.assign() 이나 Paste객체= {...Copy객체 } ( ES6 Spread Operator )방식을 사용한다.
1: const original = {name: '철수', age: 12};
2: const clone = Object.assign({}, original);
3: clone.name = '영희'
4: console.log(original) // {name: '철수', age: 12}
5 :console.log(clone); // {name: '영희', age: 12}
1: const original = {profile: {name:'철수', age:12}, grade: 'A'};
2: const clone = { ...original };
3: clone.profile.name = '영희';
4: clone.grade = 'B';
5: console.log(original) // {profile: {name: '영희', age: 12}, grade: 'A'}
6: console.log(clone); // {profile: {name: '영희', age: 12}, grade: 'B'}
문제는,
1: const original = {profile: {name:'철수', age:12}, grade: 'A'};
2: const clone = { ...original };
3: clone.profile.name = '영희';
4: clone.grade = 'B';
5: console.log(original) // {profile: {name: '영희', age: 12}, grade: 'A'}
6: console.log(clone); // {profile: {name: '영희', age: 12}, grade: 'B'}
1열에서 Json 객체안에 Json 객체가 있을 경우 복사가 특이하다. ( 이를 Swallow Copy = 얕은 복사라 한다 )
즉, original 에는 바깥쪽 Json 객체 주소를 가지는데, 문제는 안쪽 Json 객체인 {name:'철수', age:12} 도 별도의 Json 객체로 주소를 가진다 . 즉 profile 은 다시 Json 객체 주소이다.
그렇기 때문에 3열에서 name = '영희' 로 바꾸면 original 과 clone 의 name 이 모두 바뀐다.
그래서 객체안의 객체까지 "복사" 하는게 Deep Copy 이다.
● Deep Copy
과거에는 Deep Copy 를
const clone = JSON.parse(JSON.stringify(original));
와 같이 parse 와 stringfy 직렬화를 사용하였다 .
하지만, 엔진에서 parse 속도 개선하였으나 그래도 느렸고, 심지어 복잡한 구조의 경우 복사에 문제가 발생했다 .
* 복잡한 구조 = Recursive data structures, Built-in types (Date, Map, Set, Date, RegExp, ArrayBuffer...), Functions
이를 Application 레벨에서 해결하려고 나온게 underscore와 Lodash.deepclone 함수 이다.
하지만 이젠 엔진레벨에서 모든 브라우저저가 StructuredClone() 을 지원한다.
● StructuredClone
사용법은 아래와 같다.
const pasteobject = structuredClone(copyobject)
* 문법 ) structuredClone(value, { transfer })'JavaScript, ECMAScript' 카테고리의 다른 글
| Indexed DB (0) | 2022.08.03 |
|---|---|
| 디버깅.Debugging.VSC.VisualStudioCode.연동 (0) | 2022.07.28 |
| Callback, Promise, Async/Await (0) | 2022.04.04 |
| import, export (0) | 2021.09.28 |
| CORS.ajax.fetch.어떻게 해도 CORS 가 발생할 경우 (0) | 2021.08.31 |
Node.js
IT 용어, 인터넷 활용 등등참고 ) https://www.youtube.com/watch?v=u-hZI2tFGdU
Javascript 고성능 엔진인 크롬 V8 엔진을 받아 브라우저 없이 커널상에서 동작하게 수정한 것이다 .
그리고, ( Node.js 사에 말하길 ) Node.js 는 Scalable 네트워크 어플리케이션용이다 .
Asynchronous event-driven 방식이다 .
참고) Mongodb 에는 V8 엔진이 들어가고, Couchbase 에는 Node.js 가 들어간다.
'IT 용어, 인터넷 활용 등등' 카테고리의 다른 글
| 2023-003.ML, Accuracy, Precision, Recall, F1Score (0) | 2023.01.03 |
|---|---|
| CPU (0) | 2022.10.28 |
| 이벤트소싱, CQRS (0) | 2022.07.07 |
| 2022-415.대칭키,비대칭키,공개키,개인키,AES,RSA차이 (0) | 2022.06.02 |
| CleanArchitecture,클린아키텍처 (0) | 2022.06.02 |