Apa arti tepatnya yang tidak terdefinisi dalam JavaScript? Kenapa ada di sana? Penggunaan apa yang dimilikinya? Bagaimana ini bisa bermanfaat?

11

Dalam JavaScript, kami memiliki sesuatu yang disebut undefined . Saya mengatakan sesuatu, karena saya benar-benar tidak tahu apakah itu kelas dasar, atau variabel bawaan, atau kata kunci, atau apa pun. Saya hanya tahu bahwa itu ada di sana.

Untuk melihatnya dalam aksi, Anda cukup menulis:

undefined;
typeof undefined;

Adakah yang bisa menjelaskan kepada saya mengapa hal ini dimasukkan ke dalam JavaScript? Kami memiliki nullnilai dalam bahasa ini, jadi seharusnya tidak seperti itu null. Dalam bahasa lain, ketika kita tidak tahu nilai properti atau variabel, kita cukup mengaturnya menjadi nol. Di sini kita bisa melakukan hal yang sama.

Bagaimana kita bisa menggunakan hal ini dalam JavaScript?

Saeed Neamati
sumber

Jawaban:

13

Ada DUA hal yang perlu Anda pahami tentang undefined ...

  • yang jenis undefined yang hanya dapat memiliki satu nilai .
  • yang variabel undefined

Sekarang baca yang berikut ini dengan sangat hati-hati ...

  • Ada begitu banyak nilai tipe number(10, 10.01, 1e1). Tetapi hanya ada satu nilai tipe undefined, dan nilai itu disimpan dalam variabel undefined. Nilai yang memiliki representasi NO literal - misalnya, nilai-nilai jumlah 1, 100, 1e-1semua literal dari jumlah jenis, tetapi nilai yang disimpan dalam variabel undefinedtidak memiliki bentuk literal.

  • undefinedadalah variabel, hanya variabel normal, yang JavaScript nyatakan dan berikan nilai tipe undefineddalam lingkup global. Jadi, Anda dapat melakukan semua hal berikut ...

  jenis tidak terdefinisi; // "tidak terdefinisi"

  undefined = 100;
  jenis tidak terdefinisi; // "angka"

  undefined = void 0;
  jenis tidak terdefinisi; // "tidak terdefinisi"

  window.undefined === tidak terdefinisi; // benar
  window.undefined === batal 0; // benar
  
  • jika Anda tidak ingin menggunakan variabel undefined, Anda bisa menghasilkan nilai tipe undefineddengan ekspresi void 0- yang satu-satunya tujuan adalah mengembalikan nilai tipe undefined.

... adakah yang bisa menjelaskan kepada saya mengapa hal ini dimasukkan ke dalam JavaScript ...

TIDAK. Sama seperti tidak ada yang bisa menjelaskan mengapa variabel yang tidak dideklarasikan pergi ke lingkup global alih-alih lokal. Anda hanya perlu melatih diri Anda untuk menggunakannya dengan cerdas alih-alih mencoba mencari pembenaran atas keberadaannya.

... kami memiliki nilai nol ...

Meskipun nullbisa melakukan sesuatu undefined, itu lebih atau kurang terkait dengan objectsdaripada skalar. Memang, JavaScript menganggap nulldirinya sebagai objek - typeof nullmengembalikan "objek".

Menurut pendapat saya, intinya adalah untuk TIDAK mencoba alasan tujuan absolut dari undefineddan null- dan menggunakannya dalam kode Anda secara cerdas, sehingga kode Anda dapat dibaca, dipelihara, dan dapat digunakan kembali.

treecoder
sumber
2
Penjelasan bagus @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, tampaknya JavaScript adalah bahasa yang jauh lebih sedikit daripada menjadi bahasa yang logis dan kita harus terbiasa dengannya, seperti bereksperimen dengan dunia baru.
Saeed Neamati
1
+ msgstr "tujuan utamanya adalah mengembalikan nilai tipe undefined". Sebenarnya voidmengevaluasi ekspresi, mengabaikan nilai kembali dan mengembalikan undefinednilai. Adapun perbedaannya. undefineddigunakan oleh mesin JS untuk mengatakan hal ini tidak memiliki nilai. nulldigunakan oleh ANDA untuk mengatakan hal ini tidak memiliki nilai. Ada perbedaan yang jelas .
Raynos
1
undefined = 100; typeof undefined;mengembalikan "tidak terdefinisi" untuk saya, jika Anda mencoba untuk menetapkan ke nol Anda mendapatkan kesalahan. Hanya ingin mengklarifikasi untuk pembaca masa depan.
Josh Rumbut
6

Maaf untuk menjawab pertanyaan yang lebih lama tetapi alasan Anda membutuhkan keduanya tidak terdefinisi dan null adalah sederhana: dalam bahasa pengetikan bebek berbasis prototipe Anda benar - benar harus membedakan antara "objek ini tidak menentukan nilai untuk X" dan "objek ini mengatakan X adalah tidak ada / null / kosong ".

Tanpa kemampuan ini, tidak ada cara untuk berjalan di rantai prototipe dan karenanya warisan tidak dapat bekerja; Anda harus dapat menentukan bahwa obj.someProp tidak terdefinisi sehingga Anda dapat melihat obj.prototype.someProp, dan meneruskan rantai sampai Anda menemukan nilai. Jika obj.someProp kembali nol, tidak akan ada cara untuk mengetahui apakah itu benar-benar nol atau hanya berarti "lihat prototipe saya". Satu-satunya cara lain untuk mengatasi ini adalah menyuntikkan beberapa sihir kludgy di belakang layar yang mematahkan kemampuan Anda untuk membingungkan dengan rantai prototipe dan melakukan berbagai bit lain dari sihir hitam JS.

Seperti kebanyakan Javascript, ide yang tidak terdefinisi dan nol pada awalnya tampak bodoh dan bodoh, kemudian benar-benar brilian kemudian kembali ke miring dan bodoh tetapi dengan penjelasan yang masuk akal.

Bahasa seperti C # tidak akan dikompilasi jika Anda mengakses properti yang tidak ada dan bahasa dinamis lainnya sering melempar pengecualian saat runtime ketika Anda menyentuh properti yang tidak ada, artinya Anda harus menggunakan konstruksi khusus untuk mengujinya. Kelas Plus berarti ketika suatu objek dipakai Anda sudah tahu rantai pewarisannya dan semua properti yang dimilikinya - di JS saya dapat memodifikasi prototipe 15 langkah ke atas rantai dan perubahan itu akan muncul pada objek yang ada.

russbishop
sumber
3

Ada variabel global undefined, yang diatur ke nilai yang tidak ditentukan. Orang jahat mungkin mengaturnya untuk sesuatu yang lain, jadi mungkin lebih baik untuk tidak mempercayainya.

  • Nilai tidak terdefinisi adalah nilai balik dari suatu fungsi yang tidak mengembalikan nilai.
  • Nilai tidak terdefinisi adalah nilai variabel yang belum ditetapkan.
  • Nilai tidak terdefinisi adalah nilai parameter yang belum dilewati.
  • Nilai tidak terdefinisi adalah nilai properti yang belum ditetapkan.
  • 'undefined' adalah jenis variabel yang tidak dideklarasikan. ( typeof undeclaredVariable == 'undefined'. Mencoba membaca nilai dari variabel yang tidak jelas akan membuat Anda terlempar ReferenceError.)

nullrusak secara halus, karena typeof null == 'object'. Saya tidak tahu mengapa kami memiliki undefineddan null, mungkin beberapa kecelakaan historis.

Sean McMillan
sumber
2

Nah, undefinedadalah nilai sentinel yang diperoleh dengan mengevaluasi sesuatu yang tidak didefinisikan sebagai lawan null, yang merupakan nilai yang didefinisikan dengan tepat untuk mewakili apa-apa .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Jadi misalnya, nilai balik suatu fungsi, yang tidak menentukan nilai balik tidak ditentukan. Nilai properti yang tidak didefinisikan pada objek tidak terdefinisi. Nilai balik dari pernyataan, yang bukan ekspresi tidak terdefinisi (meskipun Anda tidak akan melihat ini terjadi selain di konsol).
Harap dicatat, bahwa Anda dapat membuat fungsi, yang secara eksplisit mengembalikan undefineddan Anda dapat secara eksplisit mendefinisikan properti dengan nilai undefinedpada objek, karena pada akhirnya itu adalah nilai yang valid. Anda akan melakukannya untuk berkomunikasi secara eksplisit, bahwa ada sesuatu yang tidak didefinisikan .

Anda bisa memikirkan hubungan undefineddan nullkarena itu antara NaNdan 0.

back2dos
sumber
"Nilai kembali dari fungsi, yang tidak menentukan nilai kembali tidak terdefinisi", maksud Anda bahwa undefinedadalah void?
Saeed Neamati
@ Saeed: Tidak cukup. voiddalam JavaScript adalah operator unary , yang mengambil argumen apa pun dan mengembalikan nilainya undefined .
back2dos