Nieintuicyjna ewaluacja w Visual Studio Code

Nieintuicyjna ewaluacja w Visual Studio Code
Silv
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

Mam funkcję w JavaScripcie, która w skrócie wygląda tak:

Kopiuj
static every2D(array2D, fn) {
        if (!(Array.isArray(array2D) && array2D.every(arr => Array.isArray(arr)))) {
            throw new TypeError(`The value is not a 2D array: ${array2D}`);
        }
        ... // cośtam
}

Nieważne co robi – ważny jest warunek w instrukcji if. Podczas debugowania w Visual Studio Code ewaluuję wyrażenia array2D oraz array2D.every(arr => Array.isArray(arr)) i otrzymuję takie wyjście:

  • Dla wyrażenia array2D.every(arr => Array.isArray(arr)):

    Kopiuj
    array2D.every(arr => Array.isArray(arr))
    true
    
  • Dla wyrażenia array2D:

    Kopiuj
    array2D
    Array(5) […, Array(5), Array(5), Array(5), Array(5)]
    length:5
    __proto__:Array(0) [, …]
    0:undefined
    1:Array(5) [exports.Cell, exports.Cell, exports.Cell, …]
    2:Array(5) [exports.Cell, exports.Cell, exports.Cell, …]
    ... // dalsze elementy tablicy
    

Dla mnie jest tu oczywiste, że tablica nie zawiera wyłącznie tablic. Czemu więc wyrażenie z every powyżej mówi, że zawiera? Może czegoś nie widzę?

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 134
3

:)

Kopiuj
> a = []
[]
> Array.isArray(a)
true
> a[1] = []
[]
> a
[ , [] ]
> a.every(arr => Array.isArray(arr))
true
> a[2] = 'test'
'test'
> a
[ , [], 'test' ]
> a.every(arr => Array.isArray(arr))
false
Silv
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

Dzięki! Dla formalności, per dokumentacja MDN funkcji every:

callback is invoked only for array indexes which have assigned values. It is not invoked for indexes which have been deleted, or which have never been assigned values.

Ciekaw jestem, jak silnik JavaScriptu rozróżnia między elementem usuniętym (lub?i nieprzypisanym) a o wartości undefined.

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
1

@Silv z racji, że tablica jest obiektem, to zwyczajnie sprawdza czy arr.hasOwnProperty(id) === true.

Silv
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

Ciekawe! Nie podałeś źródła, ale brzmi to sensownie. Dzięki. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.