На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> WeakMap изнутри , подход гения
    Здравствуйте робята :D
    для тех кто не понял как реализуется WeakMap, смотрите анализ от Гения: усеченный, ясный, гениальный :D
    ExpandedWrap disabled
      const MyWeakMap = (() => {
        'use strict';
        const _uid = Symbol();
        return class {
          constructor(){
            this.version = "1.0.0";
          }
          get(key){
            return key[_uid];
          }
          set(key, value){
            key[_uid] = value;
          }
          has(key){
            return (typeof key[_uid] !== "undefined") ? true : false;
          }
          ["delete"](key){
            return delete key[_uid];
          }
        };
      })();
       
      // test
      let map = new MyWeakMap();
      let key1 = {}, value1 = { a: 100 };
      map.set(key1, value1);
      map.has(key1); // true
      map.get(key1); // {a:100}
      value1 = null;
      key1 = null; // key1/value1 is GC-able

    Потом ещё выложу один анализ :D
    Сообщение отредактировано: Cfon -
      Записывать значение в ключ - это сверхгениально, ага :whistle:

      Осталось гениальность довести до совершенства и заменить всякие
      ExpandedWrap disabled
        has(key){
            return (typeof key[_uid] !== "undefined") ? true : false;
        }


      на
      ExpandedWrap disabled
        has(key) {
            return key[_uid] !== 'undefined';
        }
         
        // или
        has(key) {
            return !!key[_uid];
        }
        Цитата Serafim @
        Записывать значение в ключ - это сверхгениально, ага :whistle:
        Осталось гениальность довести до совершенства и заменить всякие
        ExpandedWrap disabled
          has(key){
              return (typeof key[_uid] !== "undefined") ? true : false;
          }

        на
        ExpandedWrap disabled
          has(key) {
              return key[_uid] !== 'undefined';
          }
          // или
          has(key) {
              return !!key[_uid];
          }

        вот еще гениальное решение! :D
        ExpandedWrap disabled
          const MyWeakMap = (() => {
              "use strict";
           
              const definePrivate = (key) => {
                  var ret = {};      
                  Object.defineProperty(key, "valueOf", {
                      value() { return ret; }
                  });
                  return ret;
              }
           
              const getPrivate = (key) => {
                  var ret = key.valueOf();
                  return (ret !== key) ? ret : definePrivate(key);
              };
           
              return class MyWeakMap {
                  constructor(){
                      this.version = '2.0.0';
                  }
                  get(key) {
                      return getPrivate(key).value;
                  }
                  set(key, value) {
                      getPrivate(key).value = value;
                  }
                  has(key) {
                      return 'value' in getPrivate(key);
                  }
                  ["delete"](key) {
                      return delete getPrivate(key).value;
                  }
              }
          })();

        я крут да? ну признайся :blush:
        Сообщение отредактировано: Cfon -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0208 ]   [ 15 queries used ]   [ Generated: 28.03.24, 13:41 GMT ]