ES6 Maps vs WeakMaps. Есть ли разница в скорости, производительности или исполнении в данном примере? [Дубликат]

Js - однопоточная.

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

73
задан Bergi 2 April 2015 в 15:51
поделиться

5 ответов

Из на той же странице, раздел «Почему слабая карта?» :

Опытный программист JavaScript заметит, что этот API может быть реализован в JavaScript с двумя массивы (один для ключей, один для значений), разделяемый четырьмя API-методами. Такая реализация будет иметь два основных неудобства. Первый - это поиск O (n) (n - количество ключей на карте). Второй - проблема утечки памяти. С помощью вручную написанных карт массив ключей будет содержать ссылки на ключевые объекты, не позволяя им собирать мусор. В native WeakMaps ссылки на ключевые объекты хранятся «слабо», что означает, что они не предотвращают сбор мусора, если не будет никакой другой ссылки на объект.

Из-за того, что ссылки являются слабых, ключи WeakMap не перечислимы (т. е. нет метода, предоставляющего вам список ключей). Если они были, список будет зависеть от состояния сбора мусора, введя недетерминизм.

[И поэтому у них также нет свойства size]

< blockquote>

Если вы хотите иметь список ключей, вы должны сохранить его самостоятельно. Существует также предложение ECMAScript с целью введения простых множеств и карт, которые не будут использовать слабые ссылки и будут перечислимы.

- это будет "normal" Map s . Не упомянутые в MDN, но в соглашении гармонии , у них также есть items, keys и values методы генератора и реализуют интерфейс Iterator .

43
ответ дан Bergi 24 August 2018 в 10:24
поделиться

Они ведут себя по-разному, когда объект, на который ссылаются их ключи / значения, удаляется. Давайте возьмем приведенный ниже пример кода:

var map = new Map();
var weakmap = new WeakMap();

(function(){
    var a = {x: 12};
    var b = {y: 12};

    map.set(a, 1);
    weakmap.set(b, 2);
})()

Вышеупомянутый IIFE выполняется, мы больше не можем ссылаться на {x: 12} и {y: 12}. Сборщик мусора идет вперед и удаляет указатель клавиши b из «WeakMap», а также удаляет {y: 12} из памяти. Но в случае «Карты» сборщик мусора не удаляет указатель с «Карты», а также не удаляет {x: 12} из памяти.

Резюме: WeakMap позволяет сборщику мусора выполнять свою задачу но не Карта.

Ссылки: http://qnimate.com/difference-between-map-and-weakmap-in-javascript/

75
ответ дан KShirish 24 August 2018 в 10:24
поделиться
1
ответ дан Ravi Sevta 24 August 2018 в 10:24
поделиться

Возможно, следующее объяснение будет более понятным для кого-то.

var k1 = {a: 1};
var k2 = {b: 2};

var map = new Map();
var wm = new WeakMap();

map.set(k1, 'k1');
wm.set(k2, 'k2');

k1 = null;
map.forEach(function (val, key) {
    console.log(key, val); // k1 {a: 1}
});

k2 = null;
wm.get(k2); // undefined

Как вы видите, после удаления клавиши k1 из памяти мы все равно можем получить доступ к ней внутри карты. В то же время удаление ключа k2 WeakMap также удаляет его из wm по ссылке.

Вот почему WeakMap не имеет перечислимых методов типа forEach, потому что нет такой вещи, как список WeakMap ключи, это просто ссылки на другие объекты.

54
ответ дан Rax Wunter 24 August 2018 в 10:24
поделиться

Другое отличие:

Ключи WeakMaps относятся только к типу Object. Примитивные типы данных как ключи не допускаются (например, символ не может быть ключ WeakMap). [/ Д2]

также не может строка, число или логическое значение можно использовать в качестве клавиши WeakMap. A Map может использовать примитивные значения для ключей.

w = new WeakMap;
w.set('a', 'b'); // Uncaught TypeError: Invalid value used as weak map key

m = new Map
m.set('a', 'b'); // Works
29
ответ дан Trevor Dixon 24 August 2018 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: