Jakie są wartości w JavaScript, które są „falsey” , co oznacza, że oceniają one jako fałszywe w wyrażeniach takich jak if(value)
, value ?
i !value
?
Jest już kilka dyskusji na temat celu wartości falsey na Stack Overflow , ale nie ma wyczerpującej pełnej odpowiedzi wymieniającej wszystkie wartości falsey.
Nie mogłem znaleźć żadnej pełnej listy w MDN JavaScript Reference i byłem zaskoczony, że najlepsze wyniki, gdy szukałem pełnej, wiarygodnej listy wartości falsey w JavaScript, to artykuły na blogu, z których niektóre zawierały oczywiste pominięcia (na przykład NaN
), a żaden z nich nie miał formatu takiego jak Przepełnienie stosu, w którym można dodawać komentarze lub alternatywne odpowiedzi w celu wskazania dziwactw, niespodzianek, pominięć, błędów lub zastrzeżeń. Wydawało się, że sensowne jest stworzenie takiego.
źródło
if()
zakładkę na prawdziwość.[[]] == ""
ale[] != []
? Boli mnie głowa ...Odpowiedzi:
Wartości Falsey w JavaScript
false
Number
typu:0
a także-0
,0.0
i forma hex0x0
( dzięki RBT )BigInt
typu:0n
i-0n
(nowy w 2020 roku, dzięki GetMeARemoteJob )""
,''
I``
- ciągi o długości 0null
undefined
NaN
document.all
(tylko w przeglądarkach HTML)document.all
jest przedmiotem falsey, ztypeof
asundefined
. Była to funkcja zastrzeżona przez Microsoft w IE przed IE11 i została dodana do specyfikacji HTML jako „umyślne naruszenie specyfikacji JavaScript” , aby strony napisane dla IE nie przerywały na przykład próby uzyskania dostępudocument.all.something
; to fałsz, ponieważif (document.all)
był popularnym sposobem wykrywania IE przed komentarzami warunkowymi. Zobacz Dlaczego document.all jest fałszywy? dla szczegółów„Falsey” oznacza po prostu, że
ToBoolean
zwraca wewnętrzną funkcję JavaScriptfalse
.ToBoolean
tkwi u podstaw!value
,value ? ... : ...;
iif (value)
. Oto jego oficjalna specyfikacja (projekt roboczy 2020) (jedynymi zmianami od pierwszej specyfikacji ECMAscript w 1997 r. Są dodanie symboli ES6 , które zawsze są zgodne z prawdą iBigInt
wspomniane powyżej:Porównania z
==
(luźna równość)Warto mówić o luźnych porównaniach
==
wartości fałszerstwa , które wykorzystująToNumber()
i mogą powodować pewne zamieszanie z powodu różnic leżących u ich podstaw. Skutecznie tworzą trzy grupy:false, 0, -0, "", ''
wszystkie pasują do siebie==
false == ""
,'' == 0
i dlatego4/2 - 2 == 'some string'.slice(11);
null, undefined
pasuje do==
null == undefined
aleundefined != false
typeof null
wróci'object'
,null
to nie jest obiektem, jest to dawna bug / dziwactwo , że nie została ustalona w celu utrzymania kompatybilności. To nie jest prawdziwy obiekt, a obiekty są zgodne z prawdą (z wyjątkiem „umyślnego naruszenia”,document.all
gdy JavaScript jest zaimplementowany w HTML)NaN
nie pasuje do niczego,==
ani===
nawet do siebieNaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
W przypadku „ścisłej równości” (
===
) nie ma takich grupowań. Tylkofalse
===
false
.Jest to jeden z powodów, dla których wielu programistów i wiele przewodników po stylu (np. Standardjs ) preferuje
===
i prawie nigdy nie używa==
.Naprawdę to docenia
== false
„Prawda” oznacza po prostu, że
ToBoolean
zwraca wewnętrzną funkcję JavaScripttrue
. Zrządzenie JavaScript, żeby mieć świadomość (i kolejny dobry powód, aby wolą===
nad==
): jest to możliwe, to jest wartość nie będzie truthy (ToBoolean
wracatrue
), ale również== false
.Możesz pomyśleć, że
if (value && value == false) alert('Huh?')
jest to logiczna niemożliwość, która nie mogła się wydarzyć, ale tak będzie, ponieważ:"0"
i'0'
- to niepuste ciągi, które są zgodne z prawdą, ale JavaScript==
dopasowuje liczby do równoważnych ciągów (np42 == "42"
.). Od tego0 == false
, czy"0" == 0
,"0" == false
.new Number(0)
inew Boolean(false)
- są przedmiotami, które są zgodne z prawdą, ale==
dostrzegają ich wartości, które== false
.0 .toExponential();
- obiekt o wartości liczbowej równoważnej do0
[]
,[[]]
oraz[0]
(dzięki cloudfeet za link do tabeli równości JavaScript )Niektóre bardziej prawdziwe wartości
To tylko kilka wartości, których niektórzy mogą się spodziewać, że są fałszywi, ale w rzeczywistości są prawdomówni.
-1
i wszystkie niezerowe liczby ujemne' '
," "
,"false"
,'null'
... wszystkie niepuste ciągi, w tym strun, które są po prostu białe znakiWszystko
typeof
, co zawsze zwraca niepusty ciąg, na przykład:typeof null
(zwraca ciąg znaków z'object'
powodu długotrwałego błędu / dziwactwa )typeof undefined
(zwraca ciąg znaków'undefined'
)Każdy obiekt (z wyjątkiem „umyślnego naruszenia”
document.all
w przeglądarkach; pamiętaj, żenull
tak naprawdę nie jest to obiekt, mimo żetypeof
sugeruje inaczej). Włącznie z:{}
[]
function(){}
lub() => {}
(dowolna funkcja, w tym puste funkcje)Error
i każdy przypadekError
new
(w tymnew Number(0)
inew Boolean(false)
)true
,1
,"1"
I[1]
powróttrue
w stosunku do siebie nawzajem==
.źródło
!
,if
i?..:
mają wspólną cechą jest to, że nazywają wewnętrznąToBoolean
funkcję na wartości. Jak zachowują się te wartości w kontekście!
,if
itd już implikowane przez ich nazwy: Są „falsy” wartości. Jestem trochę boi się, że inni będą czytać odpowiedź i myślę : „O tak, w tym kontekście (!
,if
,?...:
), to jest wartość nie jestfalse
, ale!!
jest totrue
” , ale nie rozumie podstawowe pojęcia. Dwa inne punkty: 1)v ? true : false
to tylko pełny sposób!!v
. 2)typeof
zawsze zwraca niepusty ciąg, co jest zgodne z prawdą.typeof null
anitypeof undefined
konkretnie. Można po prostu powiedzieć, że niepuste ciągi są zgodne z prawdą.document.all
to też jest fałsz .x == false
zadzwoni,ToNumber(x)
co jest zupełnie inne niżToBoolean(x)
. Może warto to wyjaśnić. Właśnie zauważyłem, że skomentowałem tę odpowiedź wieki temu: DNie zapomnij o niepustym ciągu,
"false"
który ma wartośćtrue
źródło
:-)
Aby dodać do listy wartości fałszowania @ user568458:
Oprócz liczby całkowitej 0 liczba dziesiętna 0,0, 0,00 lub dowolna taka liczba zerowa jest również wartością fałszowania.
Wydruki kodu powyżej
I am a falsy value
Podobnie reprezentacja szesnastkowa liczby 0 jest również wartością fałszowania, jak pokazano w poniższym fragmencie kodu:
Powyższy fragment kodu ponownie drukuje
I am a falsy value
.źródło
0
,0x0
,0.0
I0.00
są to różne literałami dla tego samego IEEE 754 64-bitowych zmiennoprzecinkową wartość zero.Oprócz tego, od ES2020 mamy nową wartość, która jest fałszem, jest to BigInt zero (0n):
Dzięki temu mamy teraz łącznie 7 wartości „falsy” (bez uwzględnienia document.all, jak wspomniano powyżej, ponieważ jest to część DOM, a nie JS).
źródło