javascript denetimi boş değil


134

Aşağıda, bir form değerini aldığımız bir kod parçacığı bulunmaktadır. Daha fazla işlem yapmadan önce değerin boş olup olmadığını kontrol edin.

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

Bunun neden böyle olduğuna dair herhangi bir fikir .. ??


2
CW, soruyu 6+ kullanıcının düzenlediği için gerçekleşti.
SİZ

! == yerine! =
GetBackerZ

Yanıtlar:



146

bu senin için hile yapacak

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

22
teknik olarak bu işe yararken, double not (!!) bir programlama hatasıdır. if(val)Okuması çok daha net olan gerçekten eşdeğeridir . Buna sadık kalacağım (Ujwal, !! val teknik olarak C veya C ++ ile de çalışmalı) javascript 'doğruluk' değerleri için buraya bakın: janosch.woschitz.org/javascript-equality-comparison
Will Buck

2
peki ya eğer (! Boolean (val))
thedjaney

1
!! sadece bir çift negatiftir, yani kelimenin tam anlamıyla if (val.exists) diyor. Yine de görünüşünü seviyorum!
Kurai Bankusu

12
Bu başarısız olur eğer val = 0bu yana !!0yanlış olarak değerlendirildiğini
punkrockpolly

3
Bu basit bir çift negatif değil. Dönüşen bir çift negatif. Temel olarak değişkeni bir mantıksal değere dönüştürüyorsunuz. Sizin değişken olduğu konuda söyleyeceğim ama durumda da söylemek yeterli bir şey var 0, false, null, undefinedya da bazı tür değerin giderir o truebiriyle!, Sen almak için gidiyoruz falseiçin !!. Hiç değilse idareli kullanılmalıdır.
Guy Passy

84

"Null olmadığını" kontrol etmenin 3 yolu vardır. Benim tavsiyem Kesin Değil Versiyonu kullanmaktır.

1. Katı Olmayan Sürüm

if (val !== null) { ... }

Kesin Değil Sürümü "Katı Eşitlik Karşılaştırma Algoritması" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 kullanır . !==Daha hızlı performansa sahip !=Sıkı Eşitlik Karşılaştırma Algoritma değerlerine kalıplaştığı değil çünkü operatör.

2. Katı Olmayan Sürüm

if (val != 'null') { ... }

Katı olmayan sürüm, "Soyut Eşitlik Karşılaştırma Algoritması" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 kullanır . !=Daha yavaş bir performansa sahiptir !==Özet Eşitlik Karşılaştırma Algoritma değerlerini tipleştiriyor çünkü operatör.

3. Çift Değil Versiyon

if (!!val) { ... }

Double Not Versiyonu !!, hem Strict Not Version !==hem de Non-Strict Not Version'dan !=( https://jsperf.com/tfm-not-null/6 ) daha hızlı performansa sahiptir . Ancak, False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ) gibi undefinedve NaNiçine "Falsey" değerleri yazacak ve bu da beklenmedik sonuçlara yol açabilir ve okunabilirliği daha kötüdür çünkü açıkça belirtilmemiştir.null


Bu çok tuhaf. !!valbenim için çalıştı ama val!==nullolmadı. Neden o?
TheLogicGuy

@TheLogicGuy - Veri türü nedir val? console.log(typeof val).
tfmontague

numara. kod diziden "kötü" değerleri kaldırır (null, 0 vb.). İşte kod: pastebin.com/L7Z1BtuL
TheLogicGuy

1
@TheLogicGuy - Asıl probleminizin null ile ilgisi yok. NaN doğru şekilde filtrelemiyor - bu her zaman doğru olacaktır. Bu çalışmalıdır:! (İsNaN (val) && (typeof val! == "tanımsız")). Javascript'te "Gerçek" ve "Falsey" olarak bilinen bir kavram vardır. Double-not operatörü !!, sadece daha fazlasını kaldıracaktır null. O da dönüşecek NaNve undefinedyanlış olacaktır . İşte bu yüzden çift değil operatörü kullanırken diziniz doğru şekilde filtreler !!.
tfmontague

30

Sizi geçişsiz JavaScript doğruluk tablosu garipliği dünyasına götürecek !==gibi kullanın !=.


Özel olarak kontrol etmek istemediğiniz sürece undefinedveya null. Hangi durumda val != nulldönecektir trueiçin undefinedveya nulldeğil gibi diğer Falsey değerleri için 0.
Eric H

8

Katı not equalskarşılaştırma operatörünü kullanmalısınız, !==böylece kullanıcı girdi girerse, "null"o zaman else.


1
Susan Null, adı bir veri giriş formunda kabul edilmezse mutlu olmaz lol
Andez

5

Bunun nedeni büyük olasılıkla değerinin değerden çok valdizge "null"olmasıdır null.


3

Bu iyi çalışmalı ..

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }

2

0'ı geçerli bir değer olarak dahil edebilmek istiyorsanız:

if (!!val || val === 0) { ... }


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.