Nieintuicyjna ewaluacja w Visual Studio Code

0

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

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)):

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

    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ę?

3

:)

> 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
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.

1

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1