Di JavaScript, ada dua nilai yang pada dasarnya mengatakan 'Saya tidak ada' - undefined
dan null
.
Properti yang belum ditetapkan apa pun oleh programmer undefined
, tetapi agar properti menjadi null
, null
harus ditetapkan secara eksplisit padanya.
Saya pernah berpikir bahwa ada kebutuhan null
karena undefined
adalah nilai primitif dan null
sebuah objek. Ini tidak, bahkan jika typeof null
akan menghasilkan 'object'
: Sebenarnya, keduanya nilai-nilai primitif - yang berarti tidak undefined
atau null
dapat kembali dari fungsi konstruktor, karena keduanya akan dikonversi ke obyek kosong (kita harus melempar kesalahan kegagalan kabarkan di konstruktor).
Keduanya juga mengevaluasi false
dalam konteks boolean. Satu-satunya perbedaan nyata yang dapat saya pikirkan adalah bahwa yang satu mengevaluasi NaN
, yang lain ke 0
dalam konteks numerik.
Jadi mengapa ada keduanya undefined
dan null
jika ini hanya membingungkan pemrogram yang salah memeriksa null
saat mencoba mencari tahu apakah properti telah disetel atau belum?
Yang ingin saya ketahui adalah jika ada yang memiliki contoh yang masuk akal di mana perlu menggunakan null
yang tidak bisa diekspresikan menggunakan undefined
.
Jadi konsensus umum tampaknya undefined
berarti 'tidak ada properti seperti itu' sedangkan null
berarti 'properti itu ada, tetapi tidak memiliki nilai'.
Saya dapat menerimanya jika implementasi JavaScript benar-benar akan memberlakukan perilaku ini - tetapi undefined
merupakan nilai primitif yang benar-benar valid, sehingga dapat dengan mudah ditetapkan ke properti yang ada untuk memutuskan kontrak ini. Oleh karena itu, jika Anda ingin memastikan apakah suatu properti ada, Anda harus menggunakan in
operator atau hasOwnProperty()
tetap. Jadi sekali lagi: apa kegunaan praktis dari nilai terpisah untuk undefined
dan null
?
Saya benar-benar menggunakan undefined
saat saya ingin menghapus nilai properti yang tidak lagi digunakan tetapi saya tidak mau delete
. Haruskah saya gunakan null
sebagai gantinya?
sumber
undefined
.In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.
Tidak, hanyaundefined
katakan itu.Jawaban:
Pertanyaannya sebenarnya bukan "mengapa ada nilai null di JS" - ada nilai null di sebagian besar bahasa dan umumnya dianggap sangat berguna.
Pertanyaannya adalah, "mengapa ada nilai yang tidak ditentukan di JS". Tempat utama di mana itu digunakan:
var x;
tetapi tidak menetapkannya,x
memegang tidak terdefinisi;null
pasti akan berhasil dengan baik untuk (1) dan (2) *. (3) harus benar-benar membuang pengecualian segera, dan fakta bahwa itu tidak, alih-alih mengembalikan keanehan iniundefined
yang akan gagal nanti, adalah sumber besar kesulitan debugging.*: Anda juga bisa berargumen bahwa (2) harus menampilkan pengecualian, tetapi kemudian Anda harus menyediakan mekanisme yang lebih baik dan lebih eksplisit untuk argumen default / variabel.
Namun JavaScript awalnya tidak memiliki pengecualian, atau cara apa pun untuk menanyakan suatu objek apakah itu memiliki anggota dengan nama tertentu - satu-satunya cara adalah (dan terkadang masih) mengakses anggota dan melihat apa yang Anda dapatkan. Mengingat bahwa
null
sudah memiliki tujuan dan Anda mungkin ingin menetapkan anggota untuk itu, diperlukan nilai out-of-band yang berbeda. Jadi kami punyaundefined
, itu bermasalah seperti yang Anda tunjukkan, dan itu adalah 'fitur' JavaScript hebat lainnya yang tidak akan pernah bisa kami singkirkan.Iya. Simpan
undefined
sebagai nilai khusus untuk memberi isyarat ketika bahasa lain mungkin mengeluarkan pengecualian.null
umumnya lebih baik, kecuali pada beberapa antarmuka DOM IE di mana pengaturan sesuatunull
dapat menghasilkan kesalahan. Seringkali dalam kasus ini pengaturan ke string kosong cenderung berhasil.sumber
in
operator atauhasOwnProperty
? Karena mereka jauh lebih aman daripadaobj.hello !== undefined
memeriksa apakah suatu properti ada pada suatu objek.Paling baik dijelaskan di sini , tetapi secara ringkas:
undefined adalah ketiadaan tipe dan nilai, dan null adalah ketiadaan nilai.
Selain itu, jika Anda melakukan perbandingan '==' sederhana, Anda benar, hasilnya sama saja. Tapi coba ===, yang membandingkan tipe dan nilai, dan Anda akan melihat perbedaannya.
sumber
null !== undefined
- pertanyaan saya adalah mengapa ada kebutuhan akan dua hal yang mengekspresikan konsep semantik yang sama; juga, tautan Anda menyebutkan bahwa 'null adalah sebuah objek' - itu salah, itu primitif ...typeof
kebohongan - baca spesifikasi atau coba kembalinull
dari konstruktornull
atau42
, buang nilai kembalian dan kembalikan objek yang baru dibuat sebagai gantinyaSaya rasa tidak ada alasan untuk memiliki keduanya
null
danundefined
, karena satu-satunya alasan yang disarankan banyak orang ("undefined
berarti tidak ada variabel / properti seperti itu") tidak valid, setidaknya di JavaScript.undefined
tidak dapat memberi tahu Anda apakah variabel / properti ada atau tidak.Seperti yang Anda lihat, pemeriksaan
foo === undefined
tidak memberi tahu Anda apakahfoo
ada, dan pengaturanobj.bar = undefined
tidak benar-benar dihapusbar
.Mungkin maksud asli penulis JavaScript yang
undefined
harus mewakili "tidak ada". Namun, implementasinya ternyata tidak seperti itu.sumber
undefined
dengannull
dalam contoh kode Anda di atas, dan semua tanggapannya sama. Saya tidak yakin bagaimana ini menjawab pertanyaan itu. Apakah ini dimaksudkan sebagai komentar atas jawaban orang lain?null
danundefined
, karena satu-satunya alasan yang disarankan banyak orang adalah tidak valid.undefined
. Tetapi jika Anda benar-benar menugaskannyaundefined
, itu tidak benarundefined
- benar - itu didefinisikan denganundefined
dan memiliki referensi padanya. Satu-satunya perbedaan antaraundefined
dannull
adalah penggunaan dan tujuan historisnya. Keduanya atom.Sangat mungkin untuk membutuhkan keduanya. Misalnya jika Anda query WMI sangat mungkin untuk memiliki properti kelas kembali yang memiliki nilai null. Mereka didefinisikan, mereka kebetulan memegang nol pada saat itu.
sumber
Saya pikir kesimpulan Anda bahwa JavaScript mendefinisikan
undefined
sebagai "tidak ada properti seperti itu" dannull
sebagai "properti tidak memiliki nilai" adalah benar. Dan dalam bahasa yang dinamis seperti JavaScript, ini adalah perbedaan yang sangat penting. Penggunaan kata bebek berarti kita harus mampu membedakan antara properti yang tidak ada dan yang tidak bernilai. Ini adalah cara utama kami untuk memperoleh informasi tipe. dalam bahasa yang diketik secara statis, ada perbedaan yang pasti antara bidang menjadi nol dan bidang tidak ada. Dalam JavaScript hal ini tidak berbeda. Namun itu diperiksa pada waktu proses, dan dapat dimodifikasi hingga saat itu.Saya harus setuju bahwa penerapannya aneh karena sering kali perbedaannya kabur. Namun menurut saya perbedaan itu penting dalam JavaScript. Dan kemampuan untuk menugaskan
undefined
itu penting.Saya ingat pernah membaca posting blog beberapa waktu lalu tentang RPG online yang ditulis dalam JavaScript. Ini menggunakan contoh di mana objek dibuat sebagai salinan dari instance yang ada daripada prototipe (kelas, fungsi, apa pun), dan kemudian diubah. Ini benar-benar membuat saya memahami betapa hebatnya hal
undefined
itu saat memodifikasi objek yang ada, tetapi saya tidak dapat mengingat siapa yang menulisnya.sumber
Secara semantik mereka memiliki arti yang berbeda. Jenis null memiliki tepat satu nilai dalam domainnya, null dan properti dapat diberi nilai khusus ini. Tidak terdefinisi menunjukkan kurangnya nilai yang telah ditetapkan.
sumber
undefined
baik untuk menetapkan ke properti, jadi kontrak ini (hanya dikembalikanundfined
jika tidak ada properti seperti itu) dapat dengan mudah diputuskan oleh programmer ...Sebagai programmer Java, saya melihat perbedaan besar antara undefined dan null. Coding JavaScript, jangan terlalu banyak, karena JavaScript tidak diketik dengan kuat, dan perbedaan antara undefined dan null dikaburkan oleh konversi otomatis yang sering dilakukan oleh run-time. BTW, saya sering memanfaatkan konversi tersebut; mereka membuat kode JS saya lebih ringkas dan mudah dibaca.
Untuk menjawab pertanyaan Anda, undefined berarti nilai tidak pernah ditetapkan. Secara praktis, ini umumnya mengarah ke bug. Jika yourObject.property tidak ditentukan, itu berarti Anda tidak menyetel properti karena suatu alasan, atau saya mencari sesuatu yang tidak ada sama sekali. Ini adalah masalah nyata saat mengerjakan proyek dengan lebih dari satu pembuat kode.
null berarti "tidak ada nilai" yang ditetapkan secara eksplisit. Secara praktis, Anda memberi tahu saya sesuatu tentang properti, mungkin yang tidak digunakan dalam konteks ini, atau nilai belum ditentukan.
Di Java, upaya untuk mengakses bidang yang tidak ditentukan akan selalu menghasilkan pengecualian. Nyatanya, kompilator dapat dibuat untuk memperingatkan Anda tentang hal ini dalam kode Anda.
sumber
Coba contoh ini:
Saya pikir ada penggunaan yang sangat nyata untuk 2 jenis yang berbeda di sini.
sumber
obj.userid = undefined
, itu akan gagal - lihat edit terakhir untuk pertanyaan sayaApa yang terjadi adalah sifat dinamis javascript.
Hal-hal mungkin tidak ditentukan sehingga bisa ditambahkan di lain waktu. Ini bisa dibilang mengapa javascript sangat kuat dan dapat dikembangkan.
sumber
itu adalah fitur bahasa yang penting jika Anda membungkus program Anda di sekitar paradigma peristiwa javascript.
ini sangat berguna jika Anda berurusan dengan sekumpulan data yang membutuhkan nilai untuk mewakili 'tidak ada' untuk menunjukkan beberapa tindakan yang berbeda dari menggunakan 'tidak ada' untuk menunjukkan tindakan default.
dalam kode di atas kata kunci null dan server tidak ditentukan sangat jelas dan tujuan yang berbeda. pencarian yang tidak ditemukan di objek filter_func_pt yang mengembalikan tidak terdefinisi berarti menambahkan properti ke objek yang dikembalikan sebagaimana adanya, sedangkan nilai null menunjukkan bahwa nilai harus ditahan, dan tidak ditambahkan, dan adanya nilai sebenarnya di dalamnya. case mewakili fungsi yang digunakan untuk mengubah nilai sebelum menambahkannya ke objek ret .
sumber
null itu indah
seperti semua Jenis Live Script lainnya.
Mengapa Anda ingin mengatakan hal yang salah ?!
"null" adalah "Objek kosong" seperti "0" adalah "Nomor kosong" . 0, bukan apa-apa -tetapi itu ada sebagai Type of a Number. null tentu saja juga kosong tetapi "itu" dan itu adalah hal yang didefinisikan dengan baik dari Tipe Objek .
Adalah umum untuk membicarakan hal ini sebagai "tipe", padahal bukan. Sebenarnya mereka adalah "kategori". Tapi itu sudah berakhir sekarang.
Jadi akan tetap untuk mengatakan bahwa "null" adalah Jenis Objek tanpa Jenis. Dan "null" mengatakan "Saya sangat eksis [!], Tapi saya tidak memiliki konten sejenis".
Sedangkan undefined tidak memiliki Type dan Kind dimana undefined kebetulan juga merupakan definisi Type-nya. Jenis tipe yang tidak terdefinisi menjadi tipologi khasnya. Semacam pertanyaan [apakah "tidak ada" dan bagaimana Anda mendefinisikan "tidak ada"?].
Anda telah berhasil mengatakan hal yang salah sekali lagi. Tentu saja tidak, "undefined" bukanlah sebuah Object, itu adalah Token biasa yang kita manusia pahami; tetapi bertentangan dengan null itu - dan ini memberi tahu Anda bahwa: Type-nya benar, tetapi Jenis yang Anda cari tidak terkandung di dalamnya, atau setidaknya -tidak saat ini. Kunjungi kami nanti saat kami memasukkan \ menetapkan beberapa objek \ ke dalamnya.
Itu membuat inti dari perbedaan inti mereka, seperti yang disebutkan: undefined adalah tanda biasa dan karena itu terdiri dari materi 'genetik' yang sama dengan kerabat jauhnya: string, operasi [+ undefined] akan mengubahnya menjadi NaN, demikian pula null tentu saja akan berubah menjadi jenis 0 \ Number yang benar, dan sebagai lawan dari undefined yang akan berubah menjadi string (! Yang tidak kosong!) Dan itulah mengapa ia menghasilkan NaN sebagai gantinya. Dimana: + undefined >> + "undefined" >> NaN. Karena konteks numerik mengharapkan nilai eksplisit.
Sementara konteks Boolean mengharapkan referensi - tidak menemukan apa pun untuk dikonversi dan menghasilkan 'salah'.
Mari kita hentikan sekarang ...
Saya akan mencoba memberi Anda hanya dua contoh empiris dan berharap cukup
// Berarti-properti ada; nilai yang diharapkan adalah Type: Object , dan oElement mendukung event "onclick"!
// berarti - properti itu ada; nilai yang diharapkan adalah Type: String , yang berarti oElement mendukung properti "innerText".
pada kedua kasus -jika Anda menerima "tidak ditentukan" itu berarti bahwa properti tidak ada; tidak didukung atau memiliki implementasi (ua vendor) yang salah.
Tetap dingin dan bersenang-senang.
sumber
setelah membaca diskusi yang luar biasa tentang undefined vs null, sedikit pencarian di google membawa saya ke Mozilla Documentations https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null itu disebutkan - sering null diambil di tempat di mana suatu objek dapat diharapkan tetapi tidak ada objek yang relevan.
Tidak mirip dengan pola objek Null https://en.wikipedia.org/wiki/Null_object_pattern
Jadi saya rasa ini masuk akal untuk memiliki tipe data Null.
Dokumentasi juga disebut sebagai tipe null // "object" (bukan "null" karena alasan lama)
Tidak yakin apa alasan warisannya
sumber