실제 사용하는 며칠입니까 ES6 위크마프?

실제 사용된 '에서 소개된' 데이터 구조를 며칠입니까 위크마프 ECMAScript 6?

이후 해당 키를 매핑해야 약한 tcpg 고정 참조입니다 수 있는 가치 (value) 은 그동안 삽입됨 매핑해야 약한 것으로 결코 사라지는 deltamove 핵심 아직 살아 있다, 이 일은 곧바로 사용할 수 있는 t # 39, 또는 다른 사항은요 캐시합니다 can& 테이블뿐 일반적으로 사용하는 등 취약한 약한 참조를 매핑하며 값뿐만 .용

이 날 것으로 보인다.

weakmap.set(key, value);

.is 운행에서어떠한 이 단순한 하며 "고 말했다.

key.value = value;

어떤 구체적인 활용 사례 놓친 거지?

질문에 대한 의견 (15)
해결책

근본적으로

  • 위크마프스 방법을 제공하지 확장하십시오 객체에는 간섭하지 않고 외부에서 collection.* 쓰레기요 할 때마다 확장하십시오 can& 객체를 하지만 외부 소스에서 - a, t # 39 때문에 밀봉되 -또는 위크마프 적용할 수 있습니다.

(사전) 는 위크마프 지도가 있는 keys 약해 - 즉, 만약 모든 표현은 key 손실됩니다 수 없고 더 값 - 에 대한 참조를 value 쓰레기요 수집되었습니다. # 39 let& s show 를 통해 설명하고, 이 첫 번째 사례, 좀 마지막으로 스크립트종료 실수 있습니다.

39 m, s, API 를 사용하여 I& let& # 39 라고 날 수 있는 특정 객체에는:

var obj = getObjectFromLibrary();

이제 나는 객체에는 사용하는 방법입니다.

function useObj(obj){
   doSomethingWith(obj);
}

난 로렌아줌마가 추적할 수 있는 방법 및 보고 몇 번이나 N 번 이상의 경우 특정 개체 발생) 라고 불렸다. 소박하게 매핑해야 사용할 수 있도록 한 것 같은데.

var map = new Map(); // maps can have object keys
function useObj(obj){
    doSomethingWith(obj);
    var called = map.get(obj) || 0;
    called++; // called one more time
    if(called > 10) report(); // Report called more than 10 times
    map.set(obj, called);
}

이 기능은 있지만 아직 메모리 누수 - 이제 추적할 수 있는 모든 단일 라이브러리란 객체에는 라이브러리 함수에 전달된 계속 판매업체에서 에서 객체에는 기술입니까 쓰레기요 수집되었습니다. 'A' 위크마프 대신 사용할 수 있습니다.

var map = new WeakMap(); // create a weak map
function useObj(obj){
    doSomethingWith(obj);
    var called = map.get(obj) || 0;
    called++; // called one more time
    if(called > 10) report(); // Report called more than 10 times
    map.set(obj, called);
}

그리고 메모리 누수가 우리 곁을 떠났다.

활용 사례

활용 사례를 몇 가지 다른 방식으로 인해 메모리 누수 및 활성화되었는지 위크마프 의해 '의 다음과 같습니다.

  • 개인 데이터에 액세스할 수 있도록 특정 객체에 대한 유일한 확증하노라 유지할 수 있는 사람들과 참조입니다 맵 (map). 애드혹 외곽진입 다가오고 있지만 개인 심볼에는 that& # 39 의 제안을 통해 좀 더 오래 지금부터.
  • 그 과정에 대한 데이터를 변경하지 않고 라이브러리 개체 유지 또는 오버헤드에.
  • 대한 데이터를 계속 존재할 수 없는 문제가 발생할 수 있는 다양한 유형의 객체에는 적은 수의 객체에는 숨겨져 있는 클래스뿐만 JS v-max 엔진을 사용하여 동일한 유형의 객체에는.
  • 항상 같은 브라우저에 대한 데이터를 호스트 객체에는 DOM 노드들을.
  • 추가에는 충족되었으며 객체에는 기능마저도 외부에서 (이미터의 예에서는 이벤트 같은 다른 답).

# 39 에 보면 Let& 실제 사용

외부에서 객체를 확장하는 데 사용할 수 있습니다. # 39 의 열거하십시오 let& 실용적인 (real) 을 만들고, 일종의 적응했다는 점) 의 현실 세계 에서 노엘가이스트 (예:

39 의 말하도다 let& you& # 39, re node. js - 이제 운영까지도 추적할 수 있고 '약속하나요' 객체에는 = 그러나 현재 거절됨 약속을 지키고 싶은 모든 것을 할 수 없는 경우에 수집됩니다 not 그들을 구하사 쓰레기요 타임코드가 참조입니다 그들에게.

지금 # 39, t_ _don& 추가할 수 있어 you& 특성는 넷윈을 객체에는 명백하네 이유 # 39, re 한다. 자꾸 이런 약속은 참조에서는 다시 일어날 수 있는 메모리 누수가 you& # 39, re 때문에 가비지 컬렉션 없으므로. 그럼 # 39, t, t # 39 don& 경우 렉시한테서 참조입니다 can& 대한 추가 정보를 저장 개별 공약. Id 를 포함하는 모든 구성표가 절약합니다 약속하나요 본질적으로 고말은 참조입니다 필요한 것이다.

입력하십시오. 위크마프스

위크마프스 짓궂군요 작업자쪽에서 keys 약하다. 열거하십시오 모든 맵 또는 해당 값을 얻을 수 있는 방법이 없기 때문이다. 인할지 매핑해야 있겠느뇨 따라 데이터를 저장할 수 있고, 주요 언제 그렇게 수집됩니다 키 값을 쓰레기요 된다.

즉, 주어진 약속하나요 저장할 수 있는 개체 수는 스테이드 그것에 대해 리스토어와 쓰레기요 수집되었습니다. 나중에 받는 경우 정보기술 (it) 과 관련된 객체에 대한 참조가 있으시면 보고하십시오 상태를 확인할 수 있습니다.

이것은 구현하는 데 사용되는 [처리되지 않은 거부 후크] (https://github.com/iojs/io.js/issues/256) 에 따라 페트카 안토노프 [이] (https://iojs.org/api/process.html # process_event_unhandledrejection):

process.on('unhandledRejection', function(reason, p) {
    console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
    // application specific logging, throwing an error, or other logic here
});

우리가 계속 정보를 알 수 있는 공약을 내걸고 때 거절됨 약속하나요 처리되었습니다.

해설 (8)

이 오토메이티드 실제 시나리오에서 바이어스됨 및 사용할 수 없는 것으로 보인다. # 39 는 don& 정보기술 (it) 을 읽어 보십시오, 실제 실험을 보다 다른 사항은요 옵션을 표시됨과 나을 수밖에 없다.

이를 사용할 수 있는 览侩 荤례 리스너에 사전, I have a 동료가 그 누가 그랬지. 모든 것은 아주 도움됐네 때문에 리스너에 타겟팅 된 것은 바로 이와 같은 방식으로 업무를 수행하는 것을. '굿바이' 리스테네스터슨.

하지만 보다 추상적인 '에서' 에 대한 관점, 특히 강력한 위크마프 아무것도 할 수 없는 경우, 기본적으로 구체화 액세스하려면 don& # 39 이름공간이 멤버를 격리합니다 때문에 이미 묵시적 성격상 이 구조의. # 39 m, 아주 잘 할 수 있는 몇 가지 주요 메모리 향상 i& 교체하십니까 어색한 예비형 객체에는 키 (비록 해체하면서 높여줍니까 작동합니까 당신꺼에요).

다음 지정하십시오. 읽기 전에

이제 나의 가장 좋은 방법은 정확히 알고 있지 않은 나는한다 강조하십시오 문제를 해결을 할 수 있다 벤햐민 그루에누스바움 지적했다 (체크아웃하려고 그의 답변은 it& # 39 위에 있지 않은 경우, s 내거냐 p), 이 문제를 해결할 수 있는 '일반' 매핑해야 않았을 만큼 유출 주요 강점은 ', 즉' 위크마프 좋았을 거라는 것이 없는 점을 감안하면 렉시한테서 참조입니다 가비지 컬렉션 간섭을 받지 않습니다.

다음은 내 동료가 실제 코드를 (덕분에 그를 의 공유)

3, [전체 소스 여기서요] 에 대한 얘기를 내가 리스너에 관리 it& # 39 위 (사양 에 대해 걸릴 수도 있습니다)

var listenableMap = new WeakMap();

export function getListenable (object) {
    if (!listenableMap.has(object)) {
        listenableMap.set(object, {});
    }

    return listenableMap.get(object);
}

export function getListeners (object, identifier) {
    var listenable = getListenable(object);
    listenable[identifier] = listenable[identifier] || [];

    return listenable[identifier];
}

export function on (object, identifier, listener) {
    var listeners = getListeners(object, identifier);

    listeners.push(listener);
}

export function removeListener (object, identifier, listener) {
    var listeners = getListeners(object, identifier);

    var index = listeners.indexOf(listener);
    if(index !== -1) {
        listeners.splice(index, 1);
    }
}

export function emit (object, identifier, ...args) {
    var listeners = getListeners(object, identifier);

    for (var listener of listeners) {
        listener.apply(object, args);
    }
}
해설 (6)

'' 만족스럽게 위크마프 캡슐화 및 정보 은폐

'' 위크마프 잔인하니 ES6 대해서만 사용할 수 있습니다. A '의 쌍' 은 취합은 위크마프 키와 값을 있는 주요 객체여야 합니다. 다음 예에서는 저희에게는힘과 구축하십시오 위크마프 '' 두 개의 항목:

var map = new WeakMap();
var pavloHero = {first: "Pavlo", last: "Hero"};
var gabrielFranco = {first: "Gabriel", last: "Franco"};
map.set(pavloHero, "This is Hero");
map.set(gabrielFranco, "This is Franco");
console.log(map.get(pavloHero));//This is Hero

당사는 '세트 ()' 방식을 사이의 연관을 정의하십시오 객체와 다른 항목 (문자열으로 emc 의 경우). 당사는 '프레젠테이션이든 ()' 방식을 읽어들입니다 관련된 항목 객체를. 흥미로운 것은 '는 것은 약한 부분을 위크마프 참조입니다 지도를 키를 쥐고 있다. 이 경우, 즉 약한 참조입니다 객체인지 파기됨 위크마프 ',' 에서 전체 엔트리여야 쓰레기요 모음기 거역한다면 분리하십시오 카타시안 확보함으로써 메모리.

var TheatreSeats = (function() {
  var priv = new WeakMap();
  var _ = function(instance) {
    return priv.get(instance);
  };

  return (function() {
      function TheatreSeatsConstructor() {
        var privateMembers = {
          seats: []
        };
        priv.set(this, privateMembers);
        this.maxSize = 10;
      }
      TheatreSeatsConstructor.prototype.placePerson = function(person) {
        _(this).seats.push(person);
      };
      TheatreSeatsConstructor.prototype.countOccupiedSeats = function() {
        return _(this).seats.length;
      };
      TheatreSeatsConstructor.prototype.isSoldOut = function() {
        return _(this).seats.length >= this.maxSize;
      };
      TheatreSeatsConstructor.prototype.countFreeSeats = function() {
        return this.maxSize - _(this).seats.length;
      };
      return TheatreSeatsConstructor;
    }());
})()
해설 (1)

내가 사용하는 '의' 에 대해 불변 객체로 걸릴 수 있는 기능을 위크마프 캐시에는 worry-free 메모이제이션 그들의 매개변수입니다.

메모이제이션 () 는 이 값을 계산한 다음, 캐시, 라고 돌림무늬 운행에서어떠한 &quot don& 계산할 수 있도록 # 39 이 again&quot 없다;;).

39 의 here& 예:

<! - begin 스니핏: js 숨기십시오: 진정한 콘솔: 진정한 바벨. &gt 거짓값 -;

// using immutable.js from here https://facebook.github.io/immutable-js/

const memo = new WeakMap();

let myObj = Immutable.Map({a: 5, b: 6});

function someLongComputeFunction (someImmutableObj) {
  // if we saved the value, then return it
  if (memo.has(someImmutableObj)) {
    console.log('used memo!');
    return memo.get(someImmutableObj);
  }

  // else compute, set, and return
  const computedValue = someImmutableObj.get('a') + someImmutableObj.get('b');
  memo.set(someImmutableObj, computedValue);
  console.log('computed value');
  return computedValue;
}

someLongComputeFunction(myObj);
someLongComputeFunction(myObj);
someLongComputeFunction(myObj);

// reassign
myObj = Immutable.Map({a: 7, b: 8});

someLongComputeFunction(myObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

끝 - &lt 스니핏 >;!

몇 가지 사항을 참고:

  • 이무터블.j스 객체에는 새 객체를 반환할 때 (새로운 각오로 포인터입니다) 에 키 값을 사용하여 그러한 수정하십시오 솔리드로 위크마프 같은 계산됩니까 보장하고 있다. 이 때문에 일단 내용은 매우 유용합니다 위크마프 객체에는 교체품으로 사용할 키) 가 쓰레기요 수집됨 도왔으매 높여줍니까 계산됩니까 가치에 대해 WeakMap.*
해설 (1)

& # # # # # # 120302 120321 120306 120288, & # 120302 120305,,, & # 120321, & # 120302,,,

메타데이터 요소를 있겠느뇨 매핑하므로 저장하는 데 사용할 수 있어 코드에 대해 간섭하지 않고 쓰레기 수집 (dom 또는 직장 동료 화가. 예를 들어, 숫자 인덱스화할 포락선으로 사용할 수 있는 모든 요소에 웹 페이지.

& # # # # # # 120309 120321 120310 120298, & # 120322 120316,,,, & # 120321 비트& & & # # # # # 120312 120302 120306 120298, & # 120302 120288,,, & # 120317, & # 120320,,, & # 120316, & # 120319. & # # # # # 120312 120302 120306 120298, & # 120306 120294,,, & # 120321, & # 120320,,,:

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 거짓값 바벨. &gt 거짓값 -;

var elements = document.getElementsByTagName('*'),
  i = -1, len = elements.length;

while (++i !== len) {
  // Production code written this poorly makes me want to cry:
  elements[i].lookupindex = i;
  elements[i].elementref = [];
  elements[i].elementref.push( elements[Math.pow(i, 2) % len] );
}

// Then, you can access the lookupindex's
// For those of you new to javascirpt, I hope the comments below help explain 
// how the ternary operator (?:) works like an inline if-statement
document.write(document.body.lookupindex + '<br />' + (
    (document.body.elementref.indexOf(document.currentScript) !== -1)
    ? // if(document.body.elementref.indexOf(document.currentScript) !== -1){
    "true"
    : // } else {
    "false"
  )   // }
);

끝 - &lt 스니핏 >;!

& # # # # # # 120315 120310 120320 120296, &, &, &, & 120308. & # # # # # 120312 120302 120306 120298, & # 120302 120288,,, & # 120317, & # 120320,,, & # & # 120315, & # 120305 120302;; & # # # # # 120312 120302 120306 120298, & # 120306 120294,,, & # 120321, & # 120320,,,:

<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 거짓값 바벨. &gt 거짓값 -;

var DOMref = new WeakMap(),
  __DOMref_value = Array,
  __DOMref_lookupindex = 0,
  __DOMref_otherelement = 1,
  elements = document.getElementsByTagName('*'),
  i = -1, len = elements.length, cur;

while (++i !== len) {
  // Production code written this greatly makes me want to 😊:
  cur = DOMref.get(elements[i]);
  if (cur === undefined)
    DOMref.set(elements[i], cur = new __DOMref_value)

  cur[__DOMref_lookupindex] = i;
  cur[__DOMref_otherelement] = new WeakSet();
  cur[__DOMref_otherelement].add( elements[Math.pow(i, 2) % len] );
}

// Then, you can access the lookupindex's
cur = DOMref.get(document.body)
document.write(cur[__DOMref_lookupindex] + '<br />' + (
    cur[__DOMref_otherelement].has(document.currentScript)
    ? // if(cur[__DOMref_otherelement].has(document.currentScript)){
    "true"
    : // } else {
    "false"
  )   // }
);

끝 - &lt 스니핏 >;!

& # # # # 및 120295 120309, & 120306;; & # # # # # 120307 120307 120310 120279, & # 120319 120306,,, & # 120306, & # & 120315, & # &, & # 120306 비트& 120304;; 거의 차이를 보일 수 있지만, 사실은 더 이상 별도로 위크마프 버전이, 귀신을 주된 차이점은 두 개의 코드 (위 그림 참고). 첫 번째 코드 조각을 매핑하며 코드 저장소를 참조입니다 있겠느뇨 스니핏 없이 모든 요소 사이의 어떤 길을 DOM. 이렇게 하면 DOM 요소를 기술입니까 쓰레기요 수집되었습니다. '마테오파우 (i, 2) % 렌]' 등과 같은 괴짜 없는 것 같아 보일 수 있습니다, 하지만 다시 사용하게 된다. dom 은 많은 운영 코드를 참조입니다 튀어오름 all over the 문서. 지금은 모든 요소가 있겠느뇨 수 있기 때문에, 두 번째 코드 부분을 참조들이 일러주라하셨으니 너희에의 노드입니다 제거하시겠습니까 브라우저는 노드입니다 사용하지 않는 것을 확인할 수 있습니다 (코드에 의해 도달했음 수 없습니다) 및 카타시안 삭제되지는 메모리. 왜 메모리 사용량, 메모리 앵커 이유에 대해 걱정을 해야 한다는 거죠 (첫 번째 요소는 메모리에 있는 비사용률 스니핏 같은 코드) 는 메모리 사용량이 늘어날수록 더 많은 데이터를 있지만브라우저에 gc 시도_횟수 (수 있도록 노력할 것을 막기 위해 메모리를 확보하십시오 있지만브라우저에 충돌) 는 느린 브라우징, 때로는 있지만브라우저에 산산조각나요

이 경우, 난 내 스스로 한 경우와 폴리필 추천합니까 라이브러리 (늑대굴에서 여기서요 @ 깃허브). 아주 가벼운 library 가 정보기술 (it) 의 다른 폴리필스 너무 복잡한 방법으로 프레임워크와도 없이 단순히 폴리필 얻을 수도 있습니다.

사람들이 날 경우 시작 꺄오! - &lt, 만일의 사태에 대비해 우리 섹스한거요 어리석은 것. 내가 말 그대로 느낄 수 없는 경우, 아마도 이러한 사례가 많기 때문에 실용적인 응용 프로그램 프로젝트를 수행됨을 DOM 에 동적으로 웹 페이지를 내지는 수정하십시오 어떻게든지해서 빨리 구식이 정적으로 생성할지 참조입니다 또는 다른 하고 있다. 그러나 이는 , 운영본 코드 예제를 사용하여 이를 데 없는 단지 기술입니까 확보하십시오 집중식으로 WeakMaps.-&gt.

~ 즐거운 코딩!

해설 (6)