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 undefined
doen. 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:
-
Array.isArray()
controleert, niet verwonderlijk, of zijn argument een array is. Dit verwijdert waarden zoalsnull
,undefined
en al het andere dat geen array is.
Merk op dat hierdoor ook array-achtige objectenworden verwijderd, zoals dearguments
-object en DOMNodeList
objecten. Afhankelijk van je situatie is dit misschien niet het gedrag dat je zoekt. -
De voorwaarde
array.length
controleert of de eigenschaplength
van de variabele resulteert in een truthywaarde. Omdat de vorige voorwaarde al vaststelde dat we inderdaad met een array te maken hebben, zijn strengere vergelijkingen zoalsarray.length != 0
ofarray.length !== 0
niet 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
}