Hoe controleer ik of de array leeg is of niet bestaat?

Wat is de beste manier om te controleren of een array leeg is of niet bestaat?

Zoiets?

if(array.length < 1 || array == undefined){
    //empty
}

Antwoord 1, autoriteit 100%

U wilt eerst de controle voor undefineddoen. Als je het andersom doet, zal het een fout genereren als de array niet gedefinieerd is.

if (array === undefined || array.length == 0) {
    // array empty or does not exist
}

Bijwerken

Dit antwoord krijgt behoorlijk wat aandacht, dus ik wil erop wijzen dat mijn oorspronkelijke antwoord, meer dan wat dan ook, de verkeerde volgorde aanging van de voorwaarden die in de vraag worden geëvalueerd. In die zin slaagt het er niet in om verschillende scenario’s aan te pakken, zoals null-waarden, andere soorten objecten met een eigenschap length, enz. Het is ook niet erg idiomatisch JavaScript.

De onfeilbare aanpak
Geïnspireerd door de opmerkingen, is hieronder wat ik momenteel beschouw als de onfeilbare manier om te controleren of een array leeg is of niet bestaat. Het houdt er ook rekening mee dat de variabele mogelijk niet naar een array verwijst, maar naar een ander type object met een eigenschap length.

if (!Array.isArray(array) || !array.length) {
  // array does not exist, is not an array, or is empty
  // ⇒ do not attempt to process array
}

Om het op te splitsen:

  1. Array.isArray()controleert, niet verwonderlijk, of zijn argument een array is. Dit verwijdert waarden zoals null, undefineden al het andere dat geen array is.
    Merk op dat hierdoor ook array-achtige objectenworden verwijderd, zoals de arguments-object en DOM NodeListobjecten. Afhankelijk van je situatie is dit misschien niet het gedrag dat je zoekt.

  2. De voorwaarde array.lengthcontroleert of de eigenschap lengthvan de variabele resulteert in een truthywaarde. Omdat de vorige voorwaarde al vaststelde dat we inderdaad met een array te maken hebben, zijn strengere vergelijkingen zoals array.length != 0of array.length !== 0niet vereist hier.

De pragmatische aanpak
In veel gevallen lijkt het bovenstaande misschien overdreven. Misschien gebruik je een taal van een hogere orde zoals TypeScript die de meeste typecontrole voor je doet tijdens het compileren, of het maakt je echt niet uit of het object eigenlijk een array is, of gewoon array-achtig.

In die gevallen heb ik de neiging om voor het volgende, meer idiomatische JavaScript te gaan:

if (!array || !array.length) {
    // array or array.length are falsy
    // ⇒ do not attempt to process array
}

Of, vaker, het omgekeerde:

if (array && array.length) {
    // array and array.length are truthy
    // ⇒ probably OK to process array
}

Met de introductie van de optionele ketenoperator(Elvis-operator) in ECMAScript 2020, dit kan nog verder worden ingekort:

if (!array?.length) {
    // array or array.length are falsy
    // ⇒ do not attempt to process array
}

Of het tegenovergestelde:

if (array?.length) {
    // array and array.length are truthy
    // ⇒ probably OK to process array
}

Other episodes