The story of NULL
undefined
, JavaScriptde kesin yokluğu söyleyen bir primitive valuedir. undefined
, 1998 de JavaScript 1.3 e kadar direct olarak erişilebilir değildi. Buda bize null’un o zaman, bir değerin olmadığını açıkça söyleyen bir değer olarak kullanıldığı için tasarlandığını söyler. Initialize olmamış değerler otomatik olarak undefined
değerini alırlar. undefined
ise ECMAScript spesificationslarında tür tiplerinden birisidir.
null
objectlerde kasıtlı istenilen, bırakılan yokluğu ifade eden primitive valuedir. null
da ECMAScript spesificationslarında tür tiplerinden birisidir.
Javascript’te null
Java ile birlikte çalışabilirliği sağlanmak amacıyla tasarlandı. Hem görünüm perspektifinden, hemde programlama perspektifinden ötürü. Hem Brendan Eich hemde diğer geliştiriciler, 2 absence yani yokluk valuesinin olmasından hoşnut olmadıklarını ifade ettiler fakat 1995 de yinede Eich’e Javascripti Javaya benzetme emri verdiler.
Eğer yönetimden “Java gibi yap” emrini almasaydım ve daha fazla zamanım olsaydı (Bu iki sebebi çözmek zordu), “Herşey bir object” mantığına benze bir approach tercih ederdim. Yani Boolean, Number, String sarmalayıcıları yok, undefined
null
yok gibi. Ahh.
Brendan Eich:
Javanın strongly-typed yapısından ötürü null sadece typed variableslara yani type’ı belirli variablelara assign edilebiliyordu. Ve Eich, javadaki null konseptine uyum sağlaması amacıyla null için object prototype chaninin en üstünde özel bir konum seçti. (i.e.(yani) the top of the reference types). Ve null type ını, “object-type primitives” ın bir parçası oalrak dahil etti. Bu yüzden typeof null, ‘null’ değil ‘object’ döner.
Typeof operatörü, 19 Agustos 1996’da JavaScript 1.1 releasesınden kısa bir süre sonra eklendi.
typeof null
=== ‘object’
From the V8 blog:
typeof null
, null
un kendisinin bir type olmasına rağmen null
değil object return eder. Nedenini anlamak için Javascriptteki typesların 2 gruba ayrıldığını düşünün.
1. objects (i.e. the Object type)
2. primitives (i.e. any non-object value)
Bu yüzden null
“no object value” anlamındayken, undefined “no value” anlamındadır. Daha iyi anlamak için aşağıda ki grafiğe bakalım.
Bu düşünce çizgisini takip ederek, Brendan Eich JavaScript’i, Java ruhu içinde, sağ taraftaki tüm değerler, yani tüm objectler ve null
değerler için typeof return ‘object’ yapmak üzere tasarladı. İşte bu niye typeof null
=== ‘object’ niye null
değilin sebebidir.
Bu yüzden Eich, primitive typesların hiyeraşisini Java ile uyumluluk sağlayabilmesi için tasarladı. Buda onu null
için “object-type primitives” larda pozisyonlamasına öncülük etti. Bunu yansıtmak içinde, null
dan sonra Javascripte typeof eklendiğinde, typeof null
un “object” dönmesini seçti.
Javascript geliştiricileri arasında typeof null
=== “object” süprizi, hem null
hemde undefined
a sahip weakly-typed language (JavaScript) ile sadece null
a sahip bir başka strongly-typed language (Java) arasında bir impedance mismatch (or abstraction leak) olarak ifade edildi. Ki Javada null, bir primitive type a değil, kesinlikle bir reference type ına atıfta bulunmak için tasarlanmıştır.
Bunların hepsi mantıklı, açıklanabilir ve savunulabilir. typeof null === "object"
bir bug değil fakat Java ile birlikte çalışabilir olmasının ikinci dereceden bir etkisi.
undefined
ın bir valuenin yokluk durumunu göstermesi ve null
ın özellikle bir objectin yokluk durumunu göstermesi dahil bir dizi geriye dönük akla yatkın hale getirme conventionsı ortaya çıktı.
Brendan Eich in bu konuyla alakalı ilgili konuşmasını görsel olarak aşağıya bırakıyorum.