Przejdź do głównej zawartości

Bug #093

🪲 Znajdź buga

let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length)
console.log(arr2.length)
console.log(arr3.length)

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i))

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

let arr1 = Array(5)
let arr2 = [, , , , ,]
let arr3 = ["a", , "b", , "c"]

console.log(arr1.length) // 5
console.log(arr2.length) // 5
console.log(arr3.length) // 5

arr1.forEach((e, i) => console.log(i))
arr2.forEach((e, i) => console.log(i))
arr3.forEach((e, i) => console.log(i)) // 0 2 4

Rozsiane tablice (sparse arrays) to takie, które zawierają puste miejsca (slot'y).

Tablice rezerwują w pamięci miejsce na dane, ale żadnych danych w tych miejscach nie przechowują.

Nie są to wartości undefined czy null. To dosłownie puste miejsca.

Sprawdzenie własności length na takiej rozsianej tablicy zwróci całkowitą liczbę miejsc, które tablica rezerwuje w pamięci.

Wszystkie trzy tablice arr1, arr2, arr3, zwracają wartość length równą 5.

Wywołanie metody forEach() na tych tablicach nie iteruje jednak pustych miejsc.

Dla tablic arr1 i arr2 nie zostaną zwrócone żadne indeksy i z takich iteracji.

Tablica arr3 ma 3 elementy zajęte i 2 puste.

Zgłoszą się tylko zajęte elementy, logując do konsoli indeksy 0, 2, 4.

JavaScript zachowuje się tutaj niespójnie. Część metod pomija puste miejsca, np. forEach(), map(), sort(), ale część traktuje puste miejsca jako wartość undefined, np. entries(), fill(), find().

Przykładowo arr1.find((e, i) => console.log(i))\ zwróciłoby 0, 1, 2, 3, 4.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js