Tutti i valori di falso in JavaScript


215

Quali sono i valori in JavaScript che sono 'falso' , nel senso che valutano come falsi in espressioni come if(value), value ?e !value?


Esistono già alcune discussioni sullo scopo dei valori di falsey su Stack Overflow , ma nessuna esaustiva risposta completa che elenca quali sono tutti i valori di falsey.

Non sono riuscito a trovare alcun elenco completo su Riferimenti JavaScript MDN e sono stato sorpreso di scoprire che i risultati migliori quando cercavo un elenco completo e autorevole di valori di falsi in JavaScript erano articoli del blog, alcuni dei quali presentavano ovvie omissioni (ad esempio, NaN) e nessuno dei quali aveva un formato come Stack Overflow in cui si potevano aggiungere commenti o risposte alternative per evidenziare stranezze, sorprese, omissioni, errori o avvertenze. Quindi, sembrava logico crearne uno.




5
dorey.github.io/JavaScript-Equality-Table è una grande risorsa e ha una if()scheda per la verità.
cloudfeet

4
Caspita, davvero utile, grazie! [[]] == ""ma [] != []? Mi fa male la testa ...
user56reinstatemonica8

L'ECMA 262 Specification dettagli di queste regole di confronto, in particolare sec 11.9.1 attraverso 11.9.6: ecma-international.org/ecma-262/5.1/#sec-11.9.3 Sarebbe swell se hai aggiornato la tua risposta per includere questo riferimento , dal momento che fornisce le regole per il modo in cui (si presume) vengano fatte le determinazioni vero / falso.
Shaun Wilson,

Risposte:


367

Valori di Falsey in JavaScript

  • false
  • Zero del Numbertipo: 0e anche -0, 0.0e forma esagonale 0x0( RBT grazie )
  • Zero di BigInttipo: 0ne -0n(nuovo nel 2020, grazie GetMeARemoteJob )
  • "", ''E ``- stringhe di lunghezza 0
  • null
  • undefined
  • NaN
  • document.all (solo nei browser HTML)

"Falsey" significa semplicemente che la ToBooleanfunzione interna di JavaScript ritorna false. ToBooleansottende !value, value ? ... : ...;e if (value). Ecco le sue specifiche ufficiali (bozza di lavoro del 2020) (le uniche modifiche dalla prima specifica ECMAscript del 1997 sono l'aggiunta dei simboli ES6 , che sono sempre veritieri, e BigInt, di cui sopra:

Non definito: restituisce false.  Null: restituisce false.  Booleano: argomento di ritorno.  Numero: se l'argomento è +0, -0 o NaN, restituisce false;  altrimenti restituisce vero.  String: se l'argomento è la stringa vuota (la sua lunghezza è zero), restituisce false;  altrimenti restituisce vero.  BigInt: se l'argomento è 0n, restituisce false;  altrimenti restituisce vero.  Simbolo: restituisce vero.  Oggetto: restituisce vero.


Confronti con ==(uguaglianza libera)

Vale la pena parlare dei falsi confronti con i== valori falsi , che usano ToNumber()e possono causare confusione a causa delle differenze sottostanti. Formano effettivamente tre gruppi:

  • false, 0, -0, "", '' tutti coincidono con ==
    • ad es false == "". '' == 0e quindi4/2 - 2 == 'some string'.slice(11);
  • null, undefined abbinare con ==
    • ad es. null == undefinedmaundefined != false
    • Vale anche la pena ricordare che mentre typeof nullritorna 'object', nonnull è un oggetto, si tratta di un bug / stranezza di vecchia data che non è stato risolto al fine di mantenere la compatibilità. Non è un oggetto vero e gli oggetti sono veritieri (tranne per quella "violazione intenzionale" document.allquando Javascript è implementato in HTML)
  • NaN non corrisponde a nulla, con ==o ===nemmeno se stesso
    • ad esempio NaN != NaN, NaN !== NaN, NaN != false,NaN != null

Con "uguaglianza rigorosa" ( ===), non esistono tali raggruppamenti. Solo false === false.

Questo è uno dei motivi per cui molti sviluppatori e molte guide di stile (ad esempio standardjs ) preferiscono ===e non usano quasi mai ==.


Valori veri che in realtà == false

"Verità" significa semplicemente che la ToBooleanfunzione interna di JavaScript ritorna true. Un cavillo di Javascript di essere a conoscenza (e un altro buon motivo per preferire ===sopra ==): è possibile per un valore da truthy ( ToBooleanrendimenti true), ma anche == false.

Potresti pensare che if (value && value == false) alert('Huh?')sia un'impossibilità logica che non potrebbe accadere, ma lo farà, per:

  • "0"e '0'- sono stringhe non vuote, che sono veritiere, ma Javascript ==corrisponde numeri con stringhe equivalenti (ad es 42 == "42".). Dal momento che 0 == false, se "0" == 0, "0" == false.
  • new Number(0)e new Boolean(false)- sono oggetti, che sono veri, ma ==vede i loro valori, quali == false.
  • 0 .toExponential(); - un oggetto con un valore numerico equivalente a 0
  • Qualsiasi costruzione simile che ti dia un valore di falso eguaglianza racchiuso in un tipo che è vero
  • [], [[]]E [0](grazie cloudfeet per il collegamento JavaScript uguaglianza Tabella )

Alcuni valori più veritieri

Questi sono solo alcuni dei valori che alcune persone potrebbero aspettarsi di essere falsi, ma in realtà sono veri.

  • -1 e tutti i numeri negativi diversi da zero
  • ' ', " ", "false", 'null'... tutte le stringhe non vuote, tra le stringhe che sono solo gli spazi bianchi
  • Qualsiasi cosa typeof, che restituisce sempre una stringa non vuota, ad esempio:

  • Qualsiasi oggetto (tranne quella "violazione intenzionale" document.allnei browser; ricorda che in nullrealtà non è un oggetto nonostante typeofsuggerisca diversamente). Compreso:

    • {}
    • []
    • function(){}o () => {}(qualsiasi funzione, comprese le funzioni vuote)
    • Error e qualsiasi istanza di Error
    • Qualsiasi espressione regolare
    • Qualsiasi cosa creata con new(incluso new Number(0)e new Boolean(false))
  • Qualsiasi simbolo

true, 1, "1"E [1]il ritorno truein confronto tra loro con ==.


3
A proposito, cosa !, ifed ?..:hanno in comune è che chiamano interno ToBooleanfunzione del valore. Il modo in cui questi valori si comportano nel contesto di !, ifecc. È già implicito nel loro nome: sono valori "falsi". Sono un po 'paura che gli altri leggono la risposta e pensare "Oh, così in questo contesto ( !, if, ?...:), il valore è false, ma con !!, è true" , ma non capisco il concetto di base. Altri due punti: 1) v ? true : falseè solo un modo dettagliato di !!v. 2) restituisce typeof sempre una stringa non vuota, il che è vero.
Felix Kling

1
Cioè non ha senso guardare typeof nullo in typeof undefinedparticolare. Si potrebbe semplicemente dire che le stringhe non vuote sono veritiere.
Felix Kling

1
Vedo, ma questo non ha nulla a che fare con la domanda originale;) Aggiungere troppe informazioni in qualche modo correlate ma non rilevanti potrebbe creare confusione per i lettori.
Felix Kling

5
Ho appena imparato che document.allè anche falsa .
Claudiu,

3
Per quanto riguarda il confronto libero: poiché i booleani vengono convertiti in numeri, x == falsechiamerà ToNumber(x)che è molto diverso da ToBoolean(x). Vale la pena spiegare. Ho anche notato che ho già commentato questa risposta anni fa: D
Felix Kling,

3

Non dimenticare la stringa non vuota "false"che valutatrue


8
... e quindi non è un valore falso, che è stato chiesto?
Bergi,

5
Touché. è un valore che potresti aspettarti di essere falso e non lo è, il che vale ancora la pena conoscere e, penso, merita di essere menzionato in un elenco completo
MrMcPlad

4
Aggiunto all'elenco ... ma non proviamo a trasformarlo in un elenco completo di tutti i possibili valori di verità! :-)
Ci

3

Solo per aggiungere all'elenco di @ user568458 i valori falsi:

  • Oltre al numero intero 0, anche il numero decimale 0,0, 0,00 o qualsiasi altro numero zero è un valore falso.

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    Stampe sopra lo snippet di codice I am a falsy value

  • Allo stesso modo la rappresentazione esadecimale del numero 0 è anche un valore errato, come mostrato nello snippet di codice seguente:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }

    Lo snippet di codice sopra viene nuovamente stampato I am a falsy value.


7
JavaScript non ha numeri interi. 0, 0x0, 0.0E 0.00sono solo diversi letterali per lo stesso IEEE-754 virgola mobile valore zero a 64 bit.
fredoverflow,

1

Oltre all'argomento, a partire da ES2020 abbiamo un nuovo valore che è falso, è BigInt zero (0n):

0n == false // true
-0n == false // true

Quindi, con questo, ora abbiamo 7 valori "falsi" in totale (escluso document.all come menzionato dall'utente sopra poiché fa parte di DOM e non di JS).


1
Bello! Grazie, non ne avevo ancora sentito parlare, l'ho aggiunto alla grande lista con un link che accredita la tua risposta per averlo sollevato
user56reinstatemonica8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.