Typeof null "object" neden boş?


242

Ben 'Web Geliştiricileri için Profesyonel Javascript' Bölüm 4 okuyorum ve beş temel ilkeleri: undefined, null, boolean, number ve string olduğunu söylüyor.

Eğer nullniçin bir ilkel typeof(null)dönüş "object"?

Bu null, referansla geçildiği anlamına gelmez (burada tüm nesnelerin referansla geçtiğini varsayıyorum), bu yüzden ilkel DEĞİLDİR?


50
Cevap: Çünkü spec böyle söylüyor. Bu genellikle bir hata olarak kabul edilir.
SLaks

5
Not, typeof bir işleç değil, bir işleçtir (ve aslında parantezleri ondan sonra gelenleri atlayabilirsiniz), bu nedenle buraya referansla geçme hakkında konuşmak mantıklı değildir. "JavaScript: İyi Parçalar" kitabı aslında 'Korkunç Parçalar' başlıklı Ek A'nın 6. bölümünde null === 'nesne' türünden bahsediyor.
John Sonderson

5
Sanırım 'Korkunç Parçalar'ı okumak istiyorum hah
austinheiman

1
büyük bir hata, anlaşılmaz! :)
Alexander Mills

2
Öyleyse bir değişkenin sahip olduğu değer türünü kontrol etmek için typeof yerine ne kullanmalıyız? Aralarında ne olduğunu bilmek isterim (boolean, string, number, dizi, nesne, fonksiyon, sembol, null, undefined, NaN)
Costa

Yanıtlar:


219

Gönderen davranışı hakkında MDN sayfa typeofoperatörü :

null

// Bu JavaScript'in başlangıcından beri duruyor
typeof null === 'nesne';

JavaScript'in ilk uygulamasında, JavaScript değerleri bir tür etiketi ve bir değer olarak temsil edildi. Nesneler için tür etiketi 0'dır null. NULL işaretçisi olarak gösterildi (çoğu platformda 0x00). Sonuç olarak, null, tip etiketi olarak 0'a sahiptir, bu nedenle "nesne" typeofdönüş değeri. ( başvuru )

ECMAScript için bir düzeltme önerildi (katılma yoluyla), ancak reddedildi . Sonuçta ortaya çıkacaktı typeof null === 'null'.


138
Bu değişikliğin en azından katı moda girmediği bir utanç…
Ingo Bürk

İnsanlar tuhaflıktan yararlanıyor ve bu reddedilmezse birçok kodun değiştirilmesi gerekiyor, sanırım
Cold Cerberus

Kodunu değiştirmek isteyen az sayıdaki insan için, geri kalanını öğrenmek zorunda kalan diğer geliştiricilerden daha mantıklı. Bir kişinin henüz var olmaması, mutlaka önemli olmadığı anlamına gelmez, sadece savunmasız oldukları anlamına gelir.
Seph Reed

insanların bunu niçin null kontrol olarak kullanacaklarını anlamıyorlar. Sezgisel bir anlam ifade etmiyor, o halde neden kullansınlar? Şimdi değişiklik kötü kodlama nedeniyle eklenemez.
Emobe

69

Eğer nullniçin bir ilkel typeof(null)dönüş "object"?

Çünkü spec böyle söylüyor .

11.4.3typeof Operatör

Üretim UnaryExpression : typeof UnaryExpression aşağıdaki gibi değerlendirilir:

  1. Let val değerlendirerek sonucu UnaryExpression .
  2. Eğer Tip ( val ) 'dir Referans sonra,
       a. IsUnresolvableReference ( val ) true olursa , " undefined" döndürün .
       b. Let Val olmak GetValue ( val ).
  3. Tablo 20'ye göre Type ( val ) tarafından belirlenen bir String döndürün .

resim açıklamasını buraya girin


@peter typeof, bir şeye yöntem çağırabileceğiniz konusunda bir şey söylemez .
Matt Ball

2
Bildiğim kadarıyla nullve dışındaki herhangi bir konuda yöntem çağırabilirsiniz undefined.
Matt Ball

4
@peter, bir dize ilkelinde yöntemleri çağıramazsınız, ancak neyse ki dize ilkelleri (ve sayı ilkelleri ve boole ilkelleri), bir özellikle ilkellerden birini kullandığınızda, Dize, Sayı ve Boole sarmalayıcılarında örtülü ve otomatik olarak "otomatik olarak kutlanır". referans operatörü ( .veya [ ]).
Sivri

28

Belirtildiği gibi, spec bunu söylüyor. Ancak JavaScript'in uygulanması ECMAScript spesifikasyonunun yazılmasından önce olduğundan ve spesifikasyon ilk uygulamanın aksaklıklarını düzeltmemeye dikkat ettiğinden, neden ilk etapta bu şekilde yapıldığına dair meşru bir soru var. Douglas Crockford buna hata diyor . Kiro Risk biraz mantıklı olduğunu düşünüyor :

Bunun ardındaki mantık, bunun nullaksine undefined, nesnelerin göründüğü yerlerde sıkça kullanılması (ve hala) olmasıdır. Başka bir deyişle, nullgenellikle bir nesneye boş bir başvuruyu belirtmek için kullanılır. Brendan Eich JavaScript oluşturduğunda, aynı paradigmayı izledi ve "nesneyi" döndürmek mantıklıydı (tartışmalı olarak). Aslında, ECMAScript spesifikasyonu, herhangi bir nesne değerinin kasıtlı yokluğunu temsil eden ilkel değernull olarak tanımlanmaktadır (ECMA-262, 11.4.11).


3
Şimdi videoyu bulamadığım için bunu sadece meraklı insanlar için ve herhangi bir referans olmadan göndereceğim: Crockford, null türünün çözümlenmesinde sıfır değerinin türler dizisindeki sıfır dizinli öğeye nasıl işaret ettiğini açıkladı, bu yüzden bu netti tarayıcıları için JS'nin ayrıştırılması ve yeniden derlenmesi sırasında Microsoft'un yanlışlıkla
yaydığı hataların geliştirilmesi

6

YDKJS kitabından

Bu, JS'de uzun süredir devam eden bir hatadır, ancak muhtemelen asla düzeltilmeyecek olan bir hatadır. Web üzerinde çok fazla kod hataya dayanır ve böylece düzeltmek çok daha fazla hataya neden olur!


1
her şeye güvenme bir kitapta yazılıdır. Bu kitabı gerçekten çok seviyorum, ancak JavaScript için ECMA belirtimi null türünün bir nesne olması gerektiğini belirttiği için bu hatayı düşünemiyorum.
andreasonny83

4

Eğer nullniçin bir ilkel typeof(null)"dönüşü object"?

Kısacası: ECMAScript'te hata var ve tür null

başvuru: https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/null


1
Referansınızın hiçbir yerinde bunun bir hata olduğunu belirtmez.
user2867288

1
Ve spec hiçbir yerde typeof "undefined", "object", "boolean", "number", "string", "function" ve "symbol" dışında bir şey döndürmesi gerektiğini söylemiyor (ECMAScript 2015)
Brad Kent

1

JavaScript'te null "hiçbir şey" değildir. Var olmayan bir şey olması gerekiyordu. Ne yazık ki, JavaScript'te null veri türü bir nesnedir. JavaScript'te typeof null nesnesinin bir hata olduğunu düşünebilirsiniz. Boş olmalıdır.


0

JavaScript'te typeof null, null öğesinin yanlış bir nesne olduğunu düşündüren 'object' tür. Bu bir hata ve ne yazık ki düzeltilemeyen bir hata, çünkü mevcut kodu kıracaktı.


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.