JavaScript'teki tüm falsey değerleri


215

Neler Falsey 'olan JavaScript değerleridir bunlar gibi ifadelerde yanlış olarak değerlendirmek, yani if(value), value ?ve !value?


Yığın Taşması üzerindeki falsey değerlerinin amacına ilişkin bazı tartışmalar var , ancak tüm falsey değerlerinin ne olduğunu listeleyen kapsamlı bir cevap yok.

MDN JavaScript Başvurusu'nda tam bir liste bulamadım ve JavaScript'teki falsey değerlerinin tam, yetkili bir listesini ararken en iyi sonuçların, bazıları belirgin eksiklikleri olan blog makaleleri olduğunu bulmak için şaşırdım (örneğin, NaN) ve hiçbirinin tuhaflıkları, sürprizleri, ihmalleri, hataları veya uyarıları belirtmek için yorumların veya alternatif cevapların eklenebileceği Yığın Taşması gibi bir biçimi yoktu. Yani, bir tane yapmak mantıklı görünüyordu.




5
dorey.github.io/JavaScript-Equality-Table harika bir kaynaktır ve if()doğruluk için bir sekme vardır .
cloudfeet

4
Vay canına, gerçekten kullanışlı, teşekkürler! [[]] == ""ama [] != []? Kafam ağrıyor ...
user56reinstatemonica8

: ECMA 262 Şartname bu karşılaştırma kuralları, 11.9.6 yoluyla özellikle sn 11.9.1 ayrıntıları ecma-international.org/ecma-262/5.1/#sec-11.9.3 bu başvuruyu içerecek şekilde cevap güncellenmiş eğer şişme olur , doğru / yanlış tespitlerin nasıl yapılması gerektiğine dair kurallar sağladığından.
Shaun Wilson

Yanıtlar:


367

JavaScript'teki Falsey değerleri

"Falsey", JavaScript'in dahili ToBooleanişlevinin geri döndüğü anlamına gelir false. ToBooleanaltta yatan !value, value ? ... : ...;ve if (value). İşte resmi belirtimi (2020 çalışma taslağı) ( 1997'deki ilk ECMAscript belirtiminden bu yana tek değişiklik , her zaman doğru olan ve yukarıda belirtilen ES6 Sembollerinin eklenmesidir BigInt:

Tanımsız: Yanlış döndürür.  Null: Yanlış döndürür.  Boolean: Dönüş argümanı.  Sayı: Bağımsız değişken +0, -0 veya NaN ise false değerini döndürür;  aksi takdirde true değerini döndürür.  Dize: Bağımsız değişken boş Dize ise (uzunluğu sıfırsa), false değerini döndürür;  aksi takdirde true değerini döndürür.  BigInt: Bağımsız değişken 0n ise false değerini döndürün;  aksi takdirde true değerini döndürür.  Sembol: Doğru dön.  Nesne: Doğru dön.


==(Gevşek eşitlik) ile karşılaştırmalar

Falsy değerlerinin altta yatan farklılıklar nedeniyle bazı karışıklıklara neden olan ve kullanan gevşek karşılaştırmalar== hakkında konuşmaya değer ToNumber(). Etkili üç grup oluştururlar:

  • false, 0, -0, "", '' hepsi birbiriyle eşleşir ==
    • örneğin false == "", '' == 0dolayısıyla4/2 - 2 == 'some string'.slice(11);
  • null, undefined Uyuşuyor ==
    • örneğin null == undefinedamaundefined != false
    • Bu süre olması da bahsetmemiz var typeof nulldönüşleri 'object', nullolan bu uzun süredir devam eden hata / eksikliği olan bir nesne değil uyumluluğu sağlamak amacıyla sabit değildi. Bu gerçek bir nesne değildir ve nesneler doğrudur ( document.allJavascript HTML'de uygulandığında "kasıtlı ihlal" dışında )
  • NaN hiçbir şeyle uyuşmuyor == veya ===hatta kendisi
    • örneğin NaN != NaN, NaN !== NaN, NaN != false,NaN != null

"Katı eşitlik" ( ===) ile böyle bir gruplaşma yoktur. Sadecefalse === false .

Bu, birçok geliştiricinin ve birçok stil kılavuzunun (örn. Standardjs ) tercih etmesinin nedenlerinden biridir.=== ve neredeyse hiç kullanılmamasının== .


Aslında gerçek değerler == false

"Gerçek" basitçe JavaScript'in dahili ToBooleanişlevinin geri döndüğü anlamına gelir true. Javascript bir cilvesi farkında olmak (ve tercih için başka bir sebep ===üzerine ==): Bir değer truthy olmak için bu mümkün ( ToBooleandönertrue de) ancak == false.

Düşünebilirsin if (value && value == false) alert('Huh?') için, asla olamazdı mantıksal olarak imkansızdır, ama olacak:

  • "0"ve '0'- bunlar doğru olmayan boş dizelerdir, ancak Javascript'in ==sayıları eşdeğer dizelerle eşleştirir (örn. 42 == "42"). Çünkü 0 == false, eğer "0" == 0 , "0" == false.
  • new Number(0)ve new Boolean(false)- onlar doğru olan nesnelerdir, ama== değerlerini gören== false .
  • 0 .toExponential(); - sayısal değere eşit bir nesne 0
  • Size doğru olan bir türle sarılmış yanlış eşitlik değeri veren benzer yapılar
  • [], [[]]Ve [0](teşekkürler cloudfeet için JavaScript Eşitlik Masa bağlantı )

Biraz daha doğru değerler

Bunlar, bazı insanların sahtekar olmasını bekleyebilecekleri birkaç değerdir, ancak aslında doğrudur.

  • -1 ve sıfır olmayan tüm negatif sayılar
  • ' ', " ", "false", 'null'... hepsi sadece boşluk vardır dizeleri dahil olmayan boş dizeler,
  • Her typeofzaman boş olmayan bir dize döndüren herhangi bir şey, örneğin:

  • Herhangi bir nesne ( document.alltarayıcılarda "kasıtlı ihlal" dışında ; aksi belirtilmedikçe nullbunun gerçekten bir nesne olmadığını unutmayın typeof). Dahil olmak üzere:

    • {}
    • []
    • function(){}veya () => {}(boş işlevler dahil olmak üzere herhangi bir işlev)
    • Error ve herhangi bir örneği Error
    • Herhangi bir düzenli ifade
    • İle oluşturulan herhangi bir şey new( new Number(0)ve dahil new Boolean(false))
  • Herhangi Bir Sembol

true, 1, "1"Ve [1]geri dönüş truebirbirlerine göre ==.


3
Bilginize, neyi !, ifve ?..:ortak noktası ise iç çağrı olmasıdır ToBooleandeğerine fonksiyonu. Bu değerler bağlamında davranması nasıl !, ifvb zaten adından da anlaşıldığı: Onlar "falsy" değerleridir. Diğerleri cevabı okumak ve düşünmek edeceğini biraz korkuyorum "Ah bu nedenle bu bağlamda ( !, if, ?...:), değeri false, fakat !!, bu kadar true" , ama altta yatan kavramını yok. Diğer iki nokta: 1) v ? true : falsesadece ayrıntılı bir yoldur !!v. 2) typeof her zaman boş olmayan bir dize döndürür, bu doğrudur.
Felix Kling

1
Yani bakarak hiçbir nokta yoktur typeof nullveya typeof undefinedözellikle. Sadece boş olmayan dizelerin doğru olduğunu söyleyebilirsiniz.
Felix Kling

1
Anlıyorum, ancak bunun orijinal soru ile ilgisi yok;) Çok fazla ilişkili ama alakalı olmayan bilgiler eklemek okuyucular için kafa karıştırıcı olabilir.
Felix Kling

5
Ben de document.allbunun sahte olduğunu öğrendim .
Claudiu

3
Gevşek karşılaştırma ile ilgili olarak: Booleans sayılara dönüştürüldüğünden , sadece çok farklı olanı x == falseçağıracaktır . Açıklamaya değer olabilir. Ayrıca daha önce çok önce bu cevaba yorum yaptığımı fark ettim: DToNumber(x)ToBoolean(x)
Felix Kling

3

Olarak "false"değerlendirilen boş olmayan dizeyi unutmayıntrue


8
… Ve bu nedenle istenen bir değer değil mi?
Bergi

5
Touché. falsey olmasını beklediğiniz bir değerdir ve hala farkında olmaya değer değildir ve bence, kapsamlı bir listede bahsetmeyi hak ediyor
MrMcPlad

4
Listeye eklendi ... ama bunu tüm olası doğruluk değerlerinin kapsamlı bir listesine dönüştürmeye çalışmayalım! :-)
Biraz

3

Sadece @ user568458'in sahte değerler listesine eklemek için:

  • 0 tamsayısına ek olarak, 0.0, 0.00 ondalık sayı veya bu tür herhangi bir sıfır sayı aynı zamanda bir yanlış değerdir.

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

    Kod pasajının üstündeki baskılar I am a falsy value

  • Benzer şekilde, 0 sayısının onaltılık temsili ayrıca aşağıdaki kod snippet'inde gösterildiği gibi bir sahte değerdir:

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

    Yukarıdaki kod pasajı tekrar yazdırılır I am a falsy value.


7
JavaScript tam sayı içermiyor. 0, 0x0, 0.0Ve 0.00aynı IEEE-754 64-bit kayan nokta değeri sıfıra için sadece farklı değişmezdir.
fredoverflow

1

Konuya ek olarak, ES2020'den itibaren yeni bir değere sahibiz, falsy, BigInt zero (0n):

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

Böylece bununla birlikte, toplamda 7 "falsy" değerine sahibiz (JS tarafından değil DOM'un bir parçası olduğu için yukarıdaki kullanıcı tarafından belirtildiği gibi document.all dahil değil).


1
Güzel! Teşekkürler, ben henüz bu konuda duymamıştım, bunu yükseltmek için cevabınızı kredilendirme bir link ile büyük listeye ekledik
user56reinstatemonica8
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.