Null ve undefined için JavaScript denetimi ve == ve === arasındaki fark


579
  1. Öyle olmadığını nasıl bir değişken kontrol ederim nullya undefinedarasındaki fark nedir nullve undefined?

  2. Ne arasındaki farktır ==ve ===(o "===" için Google'da arama yapmanın zor)?


10
2. ==ve arasındaki fark burada=== iyi açıklanmıştır .
Özbekjon

1. == yerine == JavaScript iki farklı türde eşitlik operatörü kullanır: === | ! == ve == | ! = Karşılaştırma yaparken her zaman eski seti kullanmak en iyi uygulama olarak kabul edilir. "İki işlenen aynı türde ve değere sahipse, === true üretir ve! == false üretir." - JavaScript: İyi Parçalar Ancak, == ve! = İle çalışırken, farklı türlerle çalışırken sorunlarla karşılaşırsınız. Bu durumlarda, değerleri başarısız bir şekilde zorlamaya çalışırlar. code.tutsplus.com/tutorials/…
jasonleonhard

4
Google'da arama yapabilirsiniz: "sıkı eşitlik operatörü" - çok alakalı sonuçlar getirir
Danield

Burada değişkenin boş veya tanımsız olup olmadığını kontrol etmek için lodash.com/docs#isNil işlevini kullanabileceğiniz birçok yanıtı eklemek için
Kfir Erez

Yanıtlar:


936

Değişken olup olmadığını nasıl kontrol edebilirim nullveya undefined...

Değişken null:

if (a === null)
// or
if (a == null) // but see note below

... ama eğer de geçerlidir olacak ikincisi not aolduğunu undefined.

Öyle mi undefined:

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below

... ama yine, sonuncunun belirsiz olduğunu unutmayın; eğer bu da doğru olacak aolan null.

Şimdi, yukarıdakilere rağmen, bunları kontrol etmenin olağan yolu, falsey oldukları gerçeğini kullanmaktır :

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `NaN`, and [of course] `false`)
}

Bu, ToBoolean tarafından spesifikasyonda tanımlanmıştır .

... ve arasındaki fark nedir nullve undefined?

Her ikisi de genellikle bir şeyin olmadığını göstermek için kullanılan değerlerdir. undefineddaha genel bir değer olup, başka bir değer atanana kadar değişkenlerin varsayılan değeri, işlev çağrıldığında sağlanmayan işlev bağımsız değişkenlerinin değeri ve bir nesneye sorduğunuzda aldığınız değer olarak kullanılır. sahip olmadığı bir mülk için. Ancak tüm bu durumlarda açıkça kullanılabilir. (Bir özelliğe sahip olmayan bir nesne ile değere sahip bir özellik undefinedarasında bir fark vardır; undefinedbir bağımsız değişkenin değerine sahip bir işlevi çağırmak ve bu bağımsız değişkeni tamamen kapalı bırakmak arasında bir fark vardır .)

nullbiraz daha spesifik undefined: Boş bir nesne başvurusu. JavaScript elbette gevşek yazılmıştır, ancak JavaScript'in etkileşime girdiği her şey gevşek yazılmaz. Tarayıcılarda DOM gibi bir API boş, kullandığımız var bir nesne başvurusu ihtiyacı varsa null, değil undefined. Benzer şekilde, DOM'largetElementById işlemi bir nesne başvurusu döndürür - geçerli bir (DOM öğesini bulmuşsa) veya null(eğer yapmamışsa).

İlginçtir (ya da değil), bunlar kendi türleridir. Yani nullNull türündeki undefinedtek değerdir ve Tanımsız türdeki tek değerdir.

"==" ve "===" arasındaki fark nedir

Aralarındaki tek fark ==, değerlerin eşleşmesini sağlamak için tip zorlaması ===yapacak ve olmayacak. Yani örneğin "1" == 1doğrudur, çünkü "1"zorlar 1. Ama "1" === 1bir yanlış türleri eşleşmiyor çünkü. ( "1" !== 1true.) "İlk (gerçek) adım ===" İşlenenlerin türleri aynı mı? " ve cevap "hayır" ise, sonuç olur false. Türler aynıysa, tam olarak ne ==yapar.

Tip baskısı oldukça karmaşık kurallar kullanır ve şaşırtıcı sonuçlar verebilir (örneğin, "" == 0doğrudur).

Daha fazla spec:


122
TJ'nin cevabını damıtmak için, === değer AND tipi aynı demektir.
Slappy

13
@Slappy: :-) @ MUG4N: Evet, doğru. "doğruluksa" if (a) { ... }anlamına gelir a, burada "doğruluk" sıfırdan farklı, sıfırdan farklı, tanımsız, yanlış olmayan, boş olmayan bir dize değeridir. :-)
TJ Crowder

4
Um ... downvoter, bunun neden "yararlı olmadığını" düşündüğünüzle ilgili bazı yararlı geri bildirimleri paylaşmak isterdi (downvote düğmesinin ipucunu alıntılamak için)?
TJ Crowder

2
@ Željko: Sanırım Crockford bu noktada yanılıyor olabilir. nullBir nesne olmadığı , "nesne yok" anlamına gelen bir nesne referansı olduğu doğrudur . De (örneğin, onlar nesne başvurularını sağladığınızda konak sağlanan arayüzlerle kullanılır fakat sağlamak bir yok ne çünkü bu önemlidir node.nextSiblingzaman nodeailesindeki son öğedir veya getElementByIdbu kimliğe sahip herhangi bir öğe olduğu zaman). Ana bilgisayarın bunun için kullandığı teknoloji, JavaScript değişken / özellik türleri hakkında olduğu kadar esnek olmayabilir, bu nedenle null(aksine undefined) obj ref'ye sahip olmak gerekiyordu .
TJ Crowder

2
Crockford'un yanıldığını kabul etmeliyim. typeof null"nesne" nin geri döndürülmesi mantıklıdır. Mantıklı olacak diğer tek değer "null" olacaktır, çünkü kesinlikle farklı bir şey döndürmelidir typeof undefined. null, en azından, onu tutan değişkenin bir tür 'nesne' için kastedildiği anlamına gelen bir null nesne referansını temsil eder. Eğer bir hata olsaydı, iyi bir hataydı. Her neyse, cevapla ilgili olarak, çapraz pencere komut dosyası oluşturma sırasında undefined! == hakkında ipucunu undefinedbilmek, özellikle hata ayıklama amacıyla iyidir.
Triynko

93

Fark incedir.

JavaScript'te bir undefineddeğişken, hiçbir zaman bildirilmeyen veya hiçbir zaman değer atanmayan bir değişkendir. Let Diyelim ki beyan söylemek var a;mesela, o zaman aolacakundefined asla bir değer atanmamış olduğu .

Ama o zaman atarsanız o a = null;zaman aşimdi olacak null. JavaScript'te nullbir nesnedir ( typeof nullbana inanmıyorsanız bir JavaScript konsolunda deneyin ), bu da null değerinin (aslındaundefined bir değerdir).

Misal:

var a;
typeof a;     # => "undefined"

a = null;
typeof null;  # => "object"

Bu işlev argümanlarında faydalı olabilir. Varsayılan bir değere sahip olmak isteyebilirsiniz, ancak null değerinin kabul edilebilir olduğunu düşünebilirsiniz. Bu durumda şunları yapabilirsiniz:

function doSomething(first, second, optional) {
    if (typeof optional === "undefined") {
        optional = "three";
    }
    // do something
}

Eğer atlarsanız optionalparametre doSomething(1, 2) thenisteğe bağlı olacak "three"dize ancak geçmek eğer doSomething(1, 2, null)o zaman isteğe bağlı olacaknull .

Eşit ==ve kesinlikle eşit ===karşılaştırıcılara gelince , birincisi zayıf tiptir, kesinlikle eşittir de değer türlerini kontrol eder. Bu, bunun 0 == "0"doğru olacağı anlamına gelir ; while 0 === "0"değeri bir dize olmadığı için false değerini döndürür.

Bu işleçleri kullanarak undefinedbir null. Örneğin:

null === null            # => true
undefined === undefined  # => true
undefined === null       # => false
undefined == null        # => true

Son durum ilginçtir, çünkü bir değişkenin tanımsız veya boş olup olmadığını kontrol etmenize izin verir ve başka bir şey yoktur:

function test(val) {
    return val == null;
}
test(null);       # => true
test(undefined);  # => true

1
Kyle Simpson, "object" i geri döndüren bir hata olduğunu iddia ediyor: github.com/getify/You-Dont-Know-JS/blob/master/…
bzrk

15

Spec bu soruların tam cevapları için gidilecek yerdir. İşte bir özet:

  1. Bir değişken için xşunları yapabilirsiniz:

    • nullkullanarak doğrudan karşılaştırma olup olmadığını kontrol edin ===. Misal:x === null
    • undefinediki temel yöntemden birini kullanıp kullanmadığını kontrol edin : undefinedveya ile doğrudan karşılaştırma typeof. İçin çeşitli nedenlerle , ben tercih typeof x === "undefined".
    • o biri olup olmadığını kontrol nullve undefinedkullanarak ==ve ortalama bu biraz gizli tip zorlama kuralları güvenerek x == nulltam olarak ne istediğinizi yapar.

  2. Arasındaki temel fark ==ve ===işlenenler farklı türde ise, yani ===her zaman dönecektir falseederken ==kullanarak aynı türden bir veya her iki işlenen dönüştürür kuralları kurşun bazı hafif unintuitive davranışlara. İşlenenler aynı türdeyse (örn. Her ikisi de typeofyukarıdaki karşılaştırmada olduğu gibi dizelerdir ) ==ve ===tam olarak aynı şekilde davranırsa.

Daha fazla okuma:


9

Boş veya tanımsızsa bir değişkeni nasıl kontrol ederim

bir değişkenin geçerli bir değere sahip olup olmadığını kontrol etmeniz yeterlidir:

if(variable)

değişken aşağıdakileri içermiyorsa true değerini döndürür:

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

8

Tanımsız

Bu, değişkenin henüz başlatılmadığı anlamına gelir.

Misal :

var x;
if(x){ //you can check like this
   //code.
}

eşittir (==)

Sadece kontrol değeri veri tipine eşit değildir.

Misal :

var x = true;
var y = new Boolean(true);
x == y ; //returns true

Çünkü sadece değeri kontrol eder.

Katı Eşittir (===)

Değer ve veri tipinin aynı olup olmadığını kontrol eder.

Misal :

var x = true;
var y = new Boolean(true);
x===y; //returns false.

Çünkü veri tipini kontrol eder, x ilkel bir tiptir ve y bir boolean nesnesidir.


4

Reklam 1. null, genel nesnenin bir özelliği için tanımlayıcı değildir undefined .

Reklam 2. ===Kontrol değerleri ve türleri. ==Do not (kullanarak karşılaştırma öncekiyle aynı tip ve yapılan örtük dönüşüm gerektiren .valueOf()ve .toString()). Burada hepsi var ( src ):

Eğer

resim açıklamasını buraya girin

== (olumsuzlaması ! = )

resim açıklamasını buraya girin

=== (olumsuzlaması ! == )

resim açıklamasını buraya girin


1
bahsetmeye değer document.all == nullvedocument.all !== null
bir kullanıcı

1

(Mantıksal) çekiniz bir olumsuzlama (!) İçinse nullve hem JS'yi undefined ( hem de farklı Tarayıcılar size farklı sonuçlar vereceğinden) yakalamak istiyorsanız , daha az kısıtlayıcı karşılaştırmayı kullanırsınız: örneğin:

var ItemID = Item.get_id();
if (ItemID != null)
{
 //do stuff
}

Bu, hem yakalayacaktır nullveundefined


0

Farklı Mantık ile deneyin . Dört (4) koşulun tümünü null değil, boş değil, tanımsız değil ve sıfır değil, yalnızca javascript ve jquery'de bu kodu (! (! (Değişken))) doğrulamak için kontrol etmek için feryat kodunu kullanabilirsiniz.

function myFunction() {
var data;  //The Values can be like as null, blank, undefined, zero you can test

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}

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.