Soru JavaScript'de boş, tanımsız veya boş değişkenleri kontrol etmek için standart bir işlev var mı?


Değişkenin bir değere sahip olduğunu kontrol eden ve olmadığını garanti eden evrensel bir JavaScript işlevi var mı? undefined veya null? Bu kodu aldım, ancak tüm vakaları kapsadığından emin değilim:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}

1609
2018-04-01 15:14


Menşei


olası kopyası JavaScript'te boş bir dizeyi nasıl kontrol edersiniz? - Dour High Arch
Test için bir keman yaptım: jsfiddle.net/J7m7m/886 - D-Money
Protip, asla yapmayın (truthy statement) ? true : false;. Sadece yap (truthy statement);. - David Baucum
Olası kopya JavaScript'te boş bir dizeyi nasıl kontrol edersiniz? - George Jempty
@GeorgeJempty bir çift değil, çünkü diğer cevap sorar Teller özellikle, bu kişi hakkında soruyor değişkenler. - Madbreaks


Cevaplar:


Sadece kontrol edebilirsiniz eğer değişken bir var truthy değer veya değil. Bunun anlamı

if( value ) {
}

değerlendirecek true Eğer value olduğu değil:

  • boş
  • Tanımsız
  • NaN
  • boş dize ("")
  • 0
  • yanlış

Yukarıdaki liste tüm olasıları temsil eder falsy ECMA- / Javascript'te değerler. İçinde bul Şartname at ToBoolean Bölüm.

Ayrıca, eğer yapmazsanız bilmek bir değişkenin var olup olmadığı (yani eğer beyan) ile kontrol etmelisiniz typeof Şebeke. Örneğin

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

Eğer emin olabilirsin ki değişken en azından beyan edilmişse, truthy Yukarıda gösterildiği gibi değer.

Daha fazla oku: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html


3313
2018-04-01 15:17



Değer, amaçlanan yanlış bir boole ise. Bazen, false boole geçirildiyse işe yaramayacak bir değer yoksa, varsayılan bir değer vermek istersiniz. - TruMan1
@ TruMan1: Böyle bir durumda (mantığınız doğrulamayı belirler) if( value || value === false ). Aynı şey aynı şey için geçerli falsi değerlerAçıkça bunları doğrulamak zorundayız. - jAndy
Değer bir dizi ise hariç. Yorumlanması truthy yanıltıcı olabilir. Bu durumda kontrol etmeliyiz value.length != 0 boş olmayan bir dizi için. - user
Sadece bunu hissetmek istiyorsanız if Yapı sözdizimsel olarak çok ağırdır, üçlü operatörü kullanabilirsiniz. var result = undefined ? "truthy" : "falsy". Veya yalnızca bir boole değerine zorlamak istiyorsanız, !! operatör, ör. !!1 // true, !!null // false. - KFL
Ayrıca, bunun yalnızca boşluk karakterleri içeren dizeleri denetlemeyeceğini de unutmayın. - Christophe Roussy


Değerin undefined veya null olup olmadığını kontrol etmek için ayrıntılı yöntem:

return value === undefined || value === null;

Ayrıca kullanabilirsiniz == operatör ama bu bekler tüm kuralları bil:

return value == null; // also returns true if value is undefined

151
2018-04-01 15:20



Sadece kontrol null veya undefined böyle yapılabilir: if (value == null). Sakın == zorlayan operatör. Böyle kontrol edersen if (value === null || value === undefined), unuttun / Javascript'in nasıl zorlandığını bilmiyorum. webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek
@ChristiaanWesterbeek: sizin amacınız arg == null ile aynı sonuçları üretir arg === undefined || arg === null. Bununla birlikte, son örneği daha okunabilir kabul ediyorum. - Salman A
arg == null benim deneyimimde oldukça yaygındır. - Bryan Downing
return value === (void 0) karşı test etmekten daha güvenli undefined Bu kapsamda meşru bir değişken olabilir, ne yazık ki. - x0n
@Sharky Tanımlanmamış ve kayıt edilmemiş bir değişken arasında bir fark vardır: lucybain.com/blog/2014/null-undefined-undeclared - Christiaan Westerbeek


function isEmpty(value){
  return (value == null || value.length === 0);
}

Bu, gerçek için geri dönecek

undefined  // Because undefined == null

null

[]

""

ve bir işlevden beri sıfır argüman fonksiyonları length bildirilen parametrelerin sayısıdır.

İkinci kategoriye izin vermemek için boş dizeleri kontrol etmek isteyebilirsiniz.

function isEmpty(value){
  return (value == null || value === '');
}

55
2018-04-01 15:19



undefined == null fakat undefined !== null - Ian Boyd
@IanBoyd çünkü == === ile karşılaştırıyorsunuz. bu, undefined == null (true) undefined! = null (false) undefined === null (false) undefined! == null (true) yardımcı olmak ve insanları itmek için biraz daha bilgi vermek daha iyi olurdu doğru yolda. moz doc farkı developer.mozilla.org/en-US/docs/Web/JavaScript/... - Corey Young
@AdamLeggett, doğruluk buna girmez. - Mike Samuel
Affedersiniz, yanlış anlıyorum. - Adam Leggett


Bunun eski bir soru olduğunu biliyorum, ama bu en güvenli kontrol ve tam burada olduğu gibi görmedim.

if (typeof value != 'undefined' && value) {
    //deal with value'
};

Durumları nerede kapsayacak değer asla tanımlanmadı ve bunlardan herhangi biri:

  • boş
  • undefined (undefined değeri, hiç tanımlanmayan bir parametre ile aynı değildir)
  • 0
  • "" (boş dize)
  • yanlış
  • NaN

Not; katı eşitliğe gerek yok typeof değeri! = 'undefined'


26
2017-11-10 16:13



Aşağı oy ile ne var ?! Evde sıkı bir eşitlik fanatiği var. Oh bekle, her zaman sıkı eşitlik kullanmanız söylendi ve her zaman söylediğinizi yapıyorsunuz, değil mi? - guya
Reddetmedim, ama katı eşitlik karşılaştırmasıyla ilgili olarak, genel kural, gerek Kesin karşılaştırmadan daha kesin bir tür dönüşüm kullanılmalıdır. - J.Steve
Yorumunuz için teşekkürler. Bu genel kural gayet iyi. Sadece ppl'nin neden birini kullandığını anlamasını bekliyorum. Her türlü ppl'ye baktığınızda, "her zaman her zaman katı kullanın" - Javascript'teki en önemli şey gibi sizi vaaz etmekten mutluluk duyarız. Çok fazla vaka gördüm eğer (val! == boş)Bu açıkça istenmeyen bir sonuca yol açar. Şüphe duyulduğunda - sıkı kullanın, ama şüphe içinde olmamak daha iyidir. - guya
Bence buradaki nokta, typeof bir dize döndürme operatörü katı eşitlik kontrolünü kullanarak teknik olarak daha doğru, daha spesifik ve daha hızlıdır. Öyleyse, gevşek karşılaştırmayı kullanmanın bir sebebi yok, başka bir şekilde değil. Ayrıca val !== null birçok durumda mükemmel geçerlidir - her zaman yaparım. Uygun olmayan argümanınıza katılıyorum, ancak bunun bunun için kötü bir örnek olduğunu düşünüyorum. Seni troll etmeye çalışmadım. - Bryan Downing
Yorumunuz için teşekkür ederim Bryan, sen ne yapıyorsun biliyorsun çünkü val! == null kullanıyorsun. Bir acemi, falsi olduğu zaman bir geri dönüşe sahip olmak isteyecektir. Ancak, val asla boş bırakılamaz. Sadece “her zaman her zaman sıkı kullanmak” için bu tavsiyeyi dinlemediyse daha az hataya sahip olacaktır. Bunun üretim kodunda olduğunu gördüm. typeof her zaman bir dize döndürür ve hız farkı artacaktır. Yani, yukarıdaki durumda katı kullanımı için tek argüman tutarlılıktır. “Katı eşitliğe gerek yok” dedim. İsterseniz veya kodunuzu daha tutarlı hale getiriyorsa yapamayacağınız anlamına gelmez. - guya


En iyi dereceye sahip ilk cevap yanlıştır. Değer tanımlanmamışsa, modern tarayıcılarda bir istisna atar. Kullanmak zorundasın:

if (typeof(value) !== "undefined" && value)

veya

if (typeof value  !== "undefined" && value)

25
2018-03-19 13:23



eee ... Sanırım bu sanki (değer) yeterliymiş gibi (boş nesneler / diziler hariç). eğer değer 'tanımsız' ise 'if' itirafı geçmez. - Oskar Szura
Bu, tanımlanmamış değişkenleri (değerlendirmede bir ReferenceError'ı atar) tanımlayan değişkenlerle sınırlar. undefined değer. - Qantas 94 Heavy
Bende aynı hatayı aldım. eğer (x), eğer (! x), eğer x (x) undefined ise hata verir. - shaosh
if(value === 0) gameOver();  ;) - Madbreaks
Bu cevap da yanlıştır çünkü yanlış olduğunda geri döner value sıfır, hangisi değil ne arıyor? - Madbreaks


Aşağıdaki işlevi yararlı bulabilirsiniz:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

Veya ES7'de (daha fazla iyileştirme varsa yorum yapın)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

Sonuçlar:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date

"Bağlayıcı işlecinin (: :) ES2016 (ES7) 'nin bir parçası olmadığını veya ECMAScript standardının daha sonraki herhangi bir sürümünün olmadığını unutmayın. Şu anda dile tanıtılmak üzere bir aşama 0 (samancı) önerisi." - Simon Kjellberg. yazar kraliyet yükselişini almak için bu güzel öneriye desteğini eklemek ister.


23
2018-02-12 10:32



+1 türünün nesnesini bilmek yardımcı olur 'Regexp'in', 'dizi' ve 'işlev' - Yash
@Vix, ES7 sürümü neden daha iyi? - GollyJer
Öyle değil, aynı işlevsellik ifade etmek için daha okunaklı yollarla deney yapıyordu: tahribat ataması, operatörü bağlama. - Vix
Bağlama işlecinin (unutmayın)::) ES2016'nın (ES7) bir parçası ya da ECMAScript standardının daha sonraki herhangi bir baskısı değildir. Şu anda dile tanıtılmak üzere bir sahne 0 (samancı) teklifi. - Simon Kjellberg


! boş dizeleri (""), null, undefined, false ve 0 ve NaN sayısını denetleyin. Dize boş ise söyle var name = "" sonra console.log(!name) döner true.

function isEmpty(val){
  return !val;
}

Bu işlev, eğer val olduğu boş, boş, tanımsız, yanlış, sayı 0 veya NaN.


16
2018-01-23 06:56



Değişken boş ise, bu gerçekten söylenmez, çünkü yanlış ve 0 geçerli değerler olabilir ve boş bir değer oluşturmaz. İsEmpty işlevine sahip olmanın değeri, boş beklediğiniz değerlerin doğru olmasını sağlamaktır. benim düşünceme göre boş, tanımsız, NaN ve boş bir dize boş olarak anlamlı olan değerlerdir. - Corey Young
Neden kullanmak isEmpty(val) eğer yapabilirsen !val? - Allen Linatoc
Sana bağlı. Okunabilirliği artırmak için kullanabilirsiniz. Aksi takdirde, çalıştığınız takımı düşündüğünüzde, daha ilerletici kodlayıcı olduklarından, yalnızca !val veya !!val problem alanınıza göre. - Arif