Mengapa typeof null "objek"?

242

Saya sedang membaca 'Javascript Profesional untuk Pengembang Web' Bab 4 dan ini memberi tahu saya bahwa lima jenis primitif adalah: tidak terdefinisi, null, boolean, angka dan string.

Jika nullprimitif, mengapa typeof(null)kembali "object"?

Bukankah itu berarti nulldilewatkan dengan referensi (saya berasumsi di sini semua objek dilewatkan dengan referensi), maka membuatnya BUKAN primitif?

thetrystero
sumber
50
Jawab: Karena spec mengatakan demikian. Ini umumnya dianggap sebagai kesalahan.
SLaks
5
Catatan, typeof adalah operator, bukan fungsi (dan sebenarnya Anda dapat menghilangkan tanda kurung di sekitar yang datang setelah itu), jadi tidak masuk akal untuk berbicara tentang lewat dengan referensi di sini. Buku "JavaScript: The Good Parts" sebenarnya menyebutkan fakta bahwa typeof null === 'object' di bagian A.6 dari lampiran A berjudul 'Awful Parts'.
John Sonderson
5
Saya pikir saya ingin membaca 'Awful Parts' hah
austinheiman
1
kesalahan besar, tak terduga! :)
Alexander Mills
2
Jadi apa yang harus kita gunakan daripada typeof untuk memeriksa jenis nilai yang dimiliki suatu variabel? Saya ingin tahu apa itu antara (boolean, string, angka, array, objek, fungsi, simbol, null, tidak terdefinisi, NaN)
Costa

Jawaban:

219

Dari halaman MDN tentang perilaku typeofoperator :

null

// Ini berdiri sejak awal JavaScript
typeof null === 'objek';

Dalam implementasi pertama JavaScript, nilai-nilai JavaScript direpresentasikan sebagai tag jenis dan nilai. Tag tipe untuk objek adalah 0. nulldirepresentasikan sebagai penunjuk NULL (0x00 di sebagian besar platform). Akibatnya, nol memiliki 0 sebagai tag jenis, maka nilai pengembalian "objek" typeof. ( referensi )

Perbaikan diusulkan untuk ECMAScript (melalui opt-in), tetapi ditolak . Itu akan menghasilkan typeof null === 'null'.

Deepak Ingole
sumber
138
Sayang perubahan ini setidaknya tidak membuatnya menjadi mode ketat ...
Ingo Bürk
Orang-orang telah mengambil keuntungan dari kekhasan itu, dan banyak kode di luar sana harus diubah jika ini tidak ditolak, saya kira
Cold Cerberus
Lebih masuk akal bagi segelintir orang yang masih hidup yang menginginkan ini untuk mengubah kode mereka, daripada pengembang lainnya selama sisa waktu harus mempelajarinya. Hanya karena seseorang belum ada, tidak berarti mereka tidak penting, itu hanya berarti mereka tidak berdaya.
Seph Reed
tidak masuk akal mengapa orang akan menggunakan ini sebagai cek nol. Itu tidak masuk akal, jadi mengapa mereka menggunakannya? Sekarang perubahan tidak dapat ditambahkan karena pengkodean yang buruk.
Emobe
69

Jika nullprimitif, mengapa typeof(null)kembali "object"?

Karena spek mengatakan demikian .

11.4.3 The typeofOperator

Produksi UnaryExpression : typeof UnaryExpression dievaluasi sebagai berikut:

  1. Biarkan val menjadi hasil evaluasi UnaryExpression .
  2. Jika Jenis ( val ) adalah Referensi , maka
       a. Jika IsUnresolvableReference ( val ) benar , kembalikan " undefined".
       b. Biarkan val menjadi GetValue ( val ).
  3. Kembalikan String yang ditentukan oleh Jenis ( val ) sesuai Tabel 20.

masukkan deskripsi gambar di sini

Matt Ball
sumber
@peter tidak typeofmemberi tahu Anda tentang apakah Anda dapat memanggil metode pada sesuatu.
Matt Ball
2
Sepengetahuan saya, Anda dapat memanggil metode selain dari nulldan undefined.
Matt Ball
4
@ Peter Anda tidak dapat memanggil metode pada string primitif, tetapi untungnya string primitif (dan primitif bilangan dan primitif boolean) secara implisit dan otomatis "kotak otomatis" dalam pembungkus String, Number, dan Boolean ketika Anda menggunakan salah satu primitif dengan properti operator referensi ( .atau [ ]).
Runcing
28

Seperti yang telah ditunjukkan, spec mengatakan demikian. Tetapi karena implementasi JavaScript sebelum penulisan spesifikasi ECMAScript, dan spesifikasinya berhati-hati untuk tidak memperbaiki kelemahan implementasi awal, masih ada pertanyaan yang sah tentang mengapa itu dilakukan dengan cara ini sejak awal. Douglas Crockford menyebutnya kesalahan . Kiro Risk menganggap itu agak masuk akal :

Alasan di balik ini adalah bahwa null, berbeda dengan undefined, dulu (dan masih) sering digunakan di mana objek muncul. Dengan kata lain, nullsering digunakan untuk menandakan referensi kosong ke suatu objek. Ketika Brendan Eich menciptakan JavaScript, ia mengikuti paradigma yang sama, dan masuk akal (bisa dibilang) mengembalikan "objek". Faktanya, spesifikasi ECMAScript mendefinisikan nullsebagai nilai primitif yang merepresentasikan ketidaksengajaan dari setiap nilai objek (ECMA-262, 11.4.11).

chryss
sumber
3
Karena saya tidak dapat menemukan sekarang video saya akan memposting ini hanya untuk orang-orang yang ingin tahu dan tanpa referensi: Crockford menjelaskan bagaimana nilai nol pada penyelesaian jenis nol menunjuk ke elemen diindeks nol pada array jenis, jadi ini jelas mengembangkan bug yang disebarkan oleh orang-orang Microsoft secara tidak sengaja ketika mendekompilasi dan mengkompilasi ulang JS untuk browser mereka
Áxel Costas Pena
6

Dari buku YDKJS

Ini adalah bug yang sudah lama ada di JS, tetapi bug yang kemungkinan besar tidak akan pernah diperbaiki. Terlalu banyak kode di Web bergantung pada bug dan dengan demikian memperbaikinya akan menyebabkan lebih banyak bug!

Faisal Ashfaq
sumber
1
jangan percaya semuanya tertulis dalam buku. Saya sangat suka buku itu, namun, saya tidak dapat menganggap itu bug karena spesifikasi ECMA untuk JavaScript menyatakan bahwa jenis null harus berupa objek.
andreasonny83
4

Jika nullprimitif, mengapa typeof(null)kembali " object"?

singkatnya: ini bug dalam ECMAScript, dan tipenya seharusnya null

referensi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

pekerjaan
sumber
1
Tidak ada dalam referensi Anda yang menyatakan bahwa itu adalah bug.
user2867288
1
Dan tidak ada dalam spesifikasi yang mengatakan typeof harus mengembalikan apa pun kecuali "tidak terdefinisi", "objek", "boolean", "angka", "string", "fungsi", dan "simbol" (ECMAScript 2015)
Brad Kent
1

Dalam JavaScript null adalah "tidak ada". Seharusnya sesuatu yang tidak ada. Sayangnya, dalam JavaScript, tipe data null adalah objek. Anda dapat menganggapnya sebagai bug dalam JavaScript yang tipenya null adalah objek. Itu harus nol.

Farzana Khan
sumber
0

Dalam JavaScript, typeof null adalah 'objek', yang secara tidak benar menyatakan bahwa null adalah objek. Ini adalah bug dan sayangnya tidak bisa diperbaiki, karena akan merusak kode yang ada.

Slim Coder
sumber