Przejdź do głównej zawartości

Set w przeciwieństwie do Array to zbiór unikalnych wartości.

Wielkość zbioru set1 będzie wynosiła 3 elementy, mimo że na pierwszy rzut oka elementy wydają się nie być unikalne i zbiór powinien zawierać tylko 1 element.

W przypadku obiektów (w tym tablic) każdy traktowany jest jako unikalny element, bo o unikalności świadczą adresy referencyjne z pamięci RAM.

Gdybyśmy na początku przypisali tablicę do zmiennej np. poprzez \ const table = ["a", "b", "c"], to kilkukrotnie dodając ją poprzez referencję tj. set1.add(table), tablice nie duplikowałyby się w zbiorze i finalnie set1.size zwróciłoby wartość 1.

W set2 metoda join(), łączy elementy z tablic (domyślnie za pomocą przecinka), tym samym tworząc wartości prymitywne typu ciąg znaków.

Wartości prymitywne są porównywane poprzez wartość, a nie referencję, więc finalnie set2.size zwraca 1 jako łączą ilość elementów zbioru.

Aby nieco ułatwić sobie zrozumienie działania unikalności elementów w Set, można posłużyć się operatorem unikalnego porównania.

Jeśli któryś z elementów porównywany z innym elementem za pomocą operatora === zwróci prawdę, to znaczy, że taki element już jest w zbiorze i kolejny nie zostanie dodany.

["a","b","c"] === ["a","b","c"] zwróci false, więc elementy zostają dodawane do zbioru jako unikalne.

Wyjątkiem jest NaN, który jako jedyny w porównaniu z samym sobą zwraca fałsz, ale mimo to Set nie pozwala na umieszczenie więcej niż jednej wartości NaN w zbiorze.

Ostatni przykład set3.size zwraca wielkość zbioru jako 4 elementy, ponieważ bezpośrednie przekazanie ciągu znaków do funkcji konstruktora Set rozbija ciąg znaków na zbiór pojedynczych znaków.

Ciąg znaków można więc zapisać również jako ["t","r","a","l","a","l","a","l","a"].

Widać wtedy wyraźnie, że niektóre znaki się powtarzają, przez co zostają zignorowane i finalnie zbiór składa się jedynie z 4 unikalnych elementów ["t","r","a","l"].