Какой элемент видит метод has для WeakSet?

Есть код:

let messages = [
  { text: "Hello", from: "John" },
  { text: "How goes?", from: "John1" },
  { text: "See you soon", from: "Alice" }
];

let answer = new WeakSet();

answer.add(messages[0]);
answer.add(messages[1]);
answer.add(messages[2]);

messages.shift()

alert("0: " + answer.has(messages[0]));
alert("1: " + answer.has(messages[1]));
alert("2: " + answer.has(messages[2]));

Метод shift() удаляет первый элемент массива, в нашем случае этот { text: "Hello", from: "John" } На экран выводится:

0: true
1: true
2: false

Почему 0: true?

Если вместо метода shift() использовать delete messages[0], то вывод будет правильным:

0: false
1: true
2: true

Если вместо метода shift() использовать метод splice(0, 1), то вывод будет таким:

0: true
1: true
2: false

То есть тоже не правильным.


Ответы (1 шт):

Автор решения: Grundy

Вывод правильный.

Так работают методы .shift и .splice

Элемент массива удаляется, остальные сдвигаются.

То есть, после вызова

messages.shift()

или

messages.splice(0, 1)

В messages останутся следующие элементы:

[
  { text: "How goes?", from: "John1" },
  { text: "See you soon", from: "Alice" }
];

Таким образом ты на самом деле проверяешь наличие первого и второго элемента и под индексом 2 лежит undefined - так как элемента с таким индексом в массиве уже нет.

→ Ссылка