programing

객체 위에 불변js를 사용해야 하는 이유는 무엇입니까?얼려?

javajsp 2023. 3. 10. 21:04

객체 위에 불변js를 사용해야 하는 이유는 무엇입니까?얼려?

을 인터넷에서 조사했다.Object.freeze()!!할! !!!!!

질문입니다만, 왜 이 라이브러리를 사용하여 네이티브가 아닌 데이터 구조를 사용하여 작업해야 합니까?오래된 javascript 오브젝트를 프리즈할 수 있는데?

불변의 J가 무엇을 제공하는지 이해하지 못한 것 같아.오브젝트를 불변하게 하는 라이브러리가 아니라 불변의 가치로 작업하는 라이브러리입니다.

단순히 문서와 사명 선언을 반복하지 않고 두 가지 사항을 설명하겠습니다.

  1. 유형. 무한 범위, 스택, 순서 집합, 목록 등을 구현했습니다.

  2. 모든 유형은 영구 데이터 구조로 구현됩니다.

거짓말이야, 여기 그들의 임무 성명서의 인용구가 있어:

한번 생성되면 불변의 데이터를 변경할 수 없기 때문에 애플리케이션 개발이 훨씬 간단해지고, 방어적인 복사가 필요하지 않으며, 심플한 논리로 고도의 메모화 및 변경 감지 기술을 사용할 수 있습니다.영속적인 데이터는 데이터를 인플레이스 업데이트하지 않고 항상 새로 업데이트된 데이터를 생성하는 변환 API를 제공합니다.

Persistent Data Structures에 대한 링크 기사 및 비디오를 읽어보시기 바랍니다(불변의 js에 대한 내용이기 때문에). 단, 다음과 같은 문장으로 요약합니다.

게임을 만들고 있는데 2D 비행기에 앉아 있는 플레이어가 있다고 가정해 보겠습니다.예를 들어 Bob은 다음과 같습니다.

var player = {
  name: 'Bob',
  favouriteColor: 'moldy mustard',

  x: 4,
  y: 10
};

FP 쿨레이드를 마셨기 때문에 플레이어를 동결하고 싶다(brrr! bob이 스웨터를 받았으면 좋겠다):

var player = Object.freeze({
    name: 'Bob',
    ...
});

이제 게임 루프로 들어갑니다.체크 마크가 울릴 때마다 플레이어의 위치가 바뀝니다.플레이어의 오브젝트가 동결되어 있기 때문에 갱신만 할 수 없기 때문에, 카피합니다.

function movePlayer(player, newX, newY) {
    return Object.freeze(Object.assign({}, player, { x: newX, y: newY }));
}

괜찮고 멋진 복사입니다만, 불필요한 복사가 얼마나 많이 행해지고 있는지 확인해 주세요.체크할 때마다 새 개체를 만들고 개체 중 하나에 반복한 후 그 위에 새 값을 할당합니다.모든 진드기마다, 모든 물건마다.꽤 많이 드셨네요.

Unfound는 다음과 같이 마무리합니다.

var player = Immutable.Map({
    name: 'Bob',
    ...
});

function movePlayer(player, newX, newY) {
    return player.set('x', newX).set('y', newY);
}

또, 「*」마법의 「*」의 영속적인 데이터 구조를 통해, 가능한 한 적은 양의 조작을 실시할 수 있습니다.

마음가짐의 차이도 있다."평범한 오래된 [동결된] javascript 객체"를 사용할 때 기본 액션은 모두 가변성을 가정하는 것이며 의미 있는 불변성(즉, 그 상태가 존재함을 인식하는 불변성)을 달성하기 위해 추가로 작업해야 합니다.그것이 이유의 일부입니다.freeze 하려고 공황 상태에.다른 방법을 시도하면 공황상태에 빠진다.불변js의 불변성은 물론 기본 가정이며 그 위에 멋진 API가 있습니다.

그렇다고 모든 것이 분홍빛과 장밋빛이고 위에 체리를 얹은 것은 아니다.물론 모든 일에는 단점이 있기 때문에, 할 수 있다고 해서 불변의 모든 곳에 벼락치기를 해서는 안 된다.그냥 ,,, 냥냥 sometimesfreeze오브젝트 입력은 [Good Engine is Good enough.헉, 대부분의 경우 그것만으로도 충분합니다.그것은 틈새시장이 있는 유용한 도서관이다. 단지 과대광고에 도취되지 말아라.

벤치마크에 따르면 불변.js는 Object.assign()보다 빠른 쓰기 작업에 최적화되어 있지만 읽기 작업에는 더 느립니다.따라서 응용 프로그램의 유형과 읽기/쓰기 비율에 따라 설명이 달라집니다.벤치마크 결과의 개요를 다음에 나타냅니다.

-- Mutable
Total elapsed = 103 ms = 50 ms (read) + 53 ms (write).

-- Immutable (Object.assign)
Total elapsed = 2199 ms = 50 ms (read) + 2149 ms (write).

-- Immutable (immutable.js)
Total elapsed = 1690 ms = 638 ms (read) + 1052 ms (write).

-- Immutable (seamless-immutable)
Total elapsed = 91333 ms = 31 ms (read) + 91302 ms (write).

-- Immutable (immutable-assign (created by me))
Total elapsed = 2223 ms = 50 ms (read) + 2173 ms (write).

성능 최적화를 도입하기 전에 애플리케이션을 프로파일링하는 것이 이상적이지만, 불변성은 설계 결정을 조기에 내려야 합니다.fromJS() 및 toJS()를 사용하는 플레인 JS 오브젝트와의 상호 운용은 매우 비용이 많이 들기 때문에 unmutable.js를 사용하기 시작할 때 성능상의 이점을 얻으려면 응용 프로그램 전체에서 사용할 필요가 있습니다.

PS: 딥 프리즈된 어레이(1000개의 요소)는 업데이트 속도가 매우 느리고 약 50배 느리므로 개발 모드에서만 딥 프리즈를 사용해야 합니다.벤치마크 결과:

-- Immutable (Object.assign) + deep freeze
Total elapsed = 45903 ms = 96 ms (read) + 45807 ms (write).

둘 다 사물을 깊이 불변하게 만들지는 않는다.

,를 Object.freeze오브젝트/어레이의 새로운 인스턴스를 직접 작성해야 합니다.이러한 인스턴스는 구조적인 공유가 되지 않습니다.따라서 모든 변경과 오래된 컬렉션을 모두 복사해야 합니다.

immutablejs편,, 컬컬컬컬 다컬다다또한 새로운 인스턴스는 변경되지 않은 이전 인스턴스의 일부를 사용하기 때문에 복사 및 가비지 수집이 줄어듭니다.

오브젝트에는 몇 가지 큰 차이가 있습니다.freeze() 및 불변.filength.param

우선 퍼포먼스 비용에 대해 설명하겠습니다.물건.freeze()는 얕습니다.오브젝트는 불변하지만 해당 오브젝트 내의 네스트된 속성과 메서드는 계속 변환될 수 있습니다.오브젝트freeze() 문서에서는 이 문제를 해결하고 "deepFreeze" 기능을 제공하기도 합니다.이 기능은 성능 면에서 훨씬 더 비용이 많이 듭니다.반면에 Unmutable.js는 낮은 비용으로 오브젝트 전체(네스트 속성, 메서드 등)를 불변하게 합니다.

또한 불변 변수 개체를 복제해야 합니다.freeze()는 완전히 새로운 변수를 생성하도록 강제하지만 Unmutable.js는 기존 불변수를 재사용하여 클론을 보다 효율적으로 생성할 수 있습니다.다음은 이 기사에서 인용한 흥미로운 내용입니다.

.set()과 같은 불변의 메서드는 새로운 오브젝트가 오래된 오브젝트의 데이터를 참조할 수 있도록 하기 때문에 클로닝보다 효율적입니다.변경된 속성만 다릅니다.이렇게 하면 항상 모든 것을 딥 클로닝하는 것보다 메모리와 퍼포먼스를 절약할 수 있습니다."

한마디로 Unmutable.js는 오래된 변수와 새로운 변수 간에 논리적인 연결을 함으로써 클로닝의 퍼포먼스를 향상시키고 메모리 내의 frozen 변수 공간을 차지합니다.물건.freeze()는 유감스럽게도 그렇지 않습니다.프리즈 오브젝트에서 새로운 변수를 복제할 때마다 기본적으로 모든 데이터를 새로 씁니다.또, (이상한 이유로) 같은 데이터를 보관 유지하고 있어도, 2개의 불변의 변수 사이에 논리적인 접속은 없습니다.

따라서 성능 측면에서는 특히 프로그램에서 항상 불변의 변수를 사용하는 경우에는 Unbound.js를 선택하는 것이 좋습니다.다만, 퍼포먼스가 전부는 아니고, Imputable.js 를 사용하는 경우는, 몇개의 큰 주의사항이 있습니다.Unmutable.js는 자체 데이터 구조를 사용하기 때문에 디버깅이나 콘솔에 대한 데이터 로깅만 해도 큰 문제가 됩니다.또한 기본적인 JavaScript 기능이 상실될 수 있습니다(예를 들어 ES6 구조 해제 기능을 함께 사용할 수 없습니다).Imputable.js 문서는 이해하기 어렵기 때문에(원래 Facebook 자체에서만 사용하기 위해 작성되었기 때문에), 간단한 문제가 발생하더라도 많은 웹 검색이 필요합니다.

이 두 가지 접근법의 가장 중요한 측면을 다루고 어떤 것이 가장 적합한지 결정하는 데 도움이 되었으면 합니다.

Object.freeze이치노불변.js는 할 수 있다고 생각합니다.

모든 라이브러리와 동일 - 언더스코어, jquery 등을 사용하는 이유

사람들은 다른 사람이 만든 바퀴를 다시 사용하는 것을 좋아합니다:-)

가장 큰 이유는 불변의 업데이트를 지원하는 기능 API를 갖추는 것 외에 Unfoundable.js가 활용하는 구조 공유입니다.강제 불변성이 필요한 애플리케이션(Redux 사용)이 있는 경우 Object만 사용하는 경우.동결하면 모든 '동결'에 대한 복사본을 만들 수 있습니다.이는 시간이 지남에 따라 GC 스레싱으로 이어지기 때문에 효율적이지 않습니다.Unmutable.js를 사용하면 불변에서 반환되는 데이터 구조가 Trys이기 때문에 (오브젝트 풀/구조 공유 모델을 직접 구현할 필요가 없는 대신) 구조 공유를 사용할 수 있습니다.즉, 모든 돌연변이는 여전히 데이터 구조 내에서 참조되므로 GC 스레싱은 최소한으로 유지됩니다.이에 대한 자세한 내용은 Imputable.js의 문서 사이트(그리고 제작자인 Lee Byron이 더 자세히 설명하는 훌륭한 비디오)에 있습니다.

https://facebook.github.io/immutable-js/

언급URL : https://stackoverflow.com/questions/36726138/why-should-i-use-immutablejs-over-object-freeze