Какой элемент видит метод 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 - так как элемента с таким индексом в массиве уже нет.