Saya telah menemukan bahwa beberapa orang menyebut JavaScript sebagai bahasa yang "diketik dengan lemah secara dinamis", tetapi beberapa bahkan mengatakan "tidak diketik"? Benarkah itu?
sumber
Saya telah menemukan bahwa beberapa orang menyebut JavaScript sebagai bahasa yang "diketik dengan lemah secara dinamis", tetapi beberapa bahkan mengatakan "tidak diketik"? Benarkah itu?
JavaScript tidak diketik:
(sumber: no.gd )
Bahkan Brendan Eich mengatakan demikian. Di Twitter, dia membalas utas yang terkait dengan pertanyaan ini:
... tipe akademis menggunakan "tanpa tipe" yang berarti "tidak ada tipe statis" ...
Jadi masalahnya adalah ada beberapa definisi berbeda dari untyped .
Satu definisi telah dibicarakan di salah satu jawaban di atas - runtime tidak menandai nilai dan hanya memperlakukan setiap nilai sebagai bit. JavaScript melakukan nilai tag dan memiliki perilaku berbeda berdasarkan tag tersebut. Jadi JavaScript jelas tidak cocok dengan kategori ini.
Definisi lainnya adalah dari Teori Bahasa Pemrograman (hal akademis yang dimaksud Brendan). Dalam domain ini, tanpa tipe berarti semuanya termasuk dalam satu jenis .
Mengapa? Karena bahasa hanya akan menghasilkan program jika dapat membuktikan bahwa jenisnya selaras (alias korespondensi Curry-Howard ; jenis adalah teorema, program adalah bukti). Artinya dalam bahasa yang tidak diketik:
Berbeda dengan bahasa yang diketik:
Jadi begitulah , di PLT, untyped berarti diketik secara dinamis dan diketik berarti diketik secara statis . JavaScript jelas tidak diketik dalam kategori ini.
Lihat juga:
1. 2. 3.
untuk bahasa yang tidak diketik tidak cocok dengan JavaScript. Tidak hanya ada satu jenis - ada sekitar 4 - 5. Jadi, bagaimana cara menunjukkan JavaScript tidak diketik?kuat / lemah dapat dipikirkan dalam kaitannya dengan bagaimana kompilator, jika berlaku, menangani pengetikan.
Ketik yang lemah berarti kompilator, jika berlaku, tidak memaksakan pengetikan yang benar. Tanpa interjeksi compiler implisit, instruksi akan error selama run-time.
Diketik dengan kuat berarti ada kompiler, dan ia ingin Anda melakukan cast eksplisit dari string ke integer .
Dalam kedua kasus, beberapa fitur kompiler dapat secara implisit mengubah instruksi selama waktu kompilasi untuk melakukan konversi untuk Anda, jika dapat menentukan bahwa itu adalah hal yang benar untuk dilakukan.
Sejauh ini, JavaScript dapat dikategorikan sebagai Not-Strongly-Typed. Itu berarti itu diketik lemah atau tidak diketik.
dinamis / statis dapat dianggap dalam kaitannya dengan bagaimana instruksi bahasa memanipulasi tipe.
Diketik secara dinamis berarti jenis nilai diterapkan, tetapi variabel hanya mewakili nilai apa pun dari jenis apa pun.
Diketik secara statis berartijenis variabel diberlakukan dengan kuat, dan jenis nilai kurang diberlakukan.
Sejauh ini, JavaScript dapat dikategorikan sebagai Not-Statically-Typed. Juga, tampaknya Dynamically Typed, jika diketik sama sekali. Jadi kita perlu melihat apa arti Mengetik.
Typed berarti bahasanya membedakan antara tipe yang berbeda seperti string , number , boolean , object , array , null , undefined ,dan sebagainya. Juga setiap operasi terikat pada tipe tertentu. Jadi Anda tidak bisa membagi integer dengan string .
Untyped berarti operasi membagi integer dengan string akan menghasilkan perlakuan empat byte pertama dari string sebagai integer . Ini karena operasi tanpa tipe berlangsung langsung pada bit, tidak ada tipe yang harus diamati. Hasilnya akan menjadi sesuatu yang sangat tidak terduga:
Karena JavaScript berperilaku sesuai dengan definisi Typed, maka JavaScript haruslah. Dan karena itu harus Dynamically Typed, dan Weakly Typed.
Jika ada yang mengklaim JavaScript adalah Untyped, itu hanya untuk teori akademis, bukan untuk aplikasi praktis.
sumber
JavaScript diketik dengan lemah . Ini pasti bukan "tidak diketik" tetapi sifatnya yang lemah ketik memungkinkan banyak fleksibilitas dalam hal konversi implisit.
Perlu diingat bahwa JavaScript juga diketik secara dinamis. Metode pengetikan ini memungkinkan apa yang dikenal sebagai "mengetik bebek" .
Sebagai perbandingan, pertimbangkan bahwa JavaScript tidak diketik dengan kuat dan juga tidak diketik secara statis. Terkadang memahami apa yang tidak dapat membantu Anda melihat apa itu dengan lebih baik.
sumber
Bagi penulis, JavaScript juga diklasifikasikan sebagai Dynamically typed . Wiki menyatakan bahwa bahasa yang diketik secara dinamis adalah jenis yang diperiksa pada saat runtime alih-alih dalam kompiler sementara Diketik Lemah mengacu pada kemampuan untuk mengubah jenis dengan cepat dalam kode Anda. Jadi ya, keduanya diketik secara dinamis DAN diketik Lemah.
sumber
Masalah di sini yang membingungkan banyak programmer adalah definisi seperti ini tidak distandarisasi di suatu tempat. Istilah bahasa pemrograman tanpa tipe bersifat ambigu. Apakah itu merujuk pada bahasa yang tidak memiliki tipe data atau bahasa yang merupakan varian tanpa tipe kalkulus lambda ?
JavaScript / ECMAScript memiliki sistem tipe dan semua domain fungsinya akan menerima tipe spesifikasi Referensi apa pun. Jadi itu berarti JavaScript memiliki satu tipe data, pada kenyataannya. Itu adalah masalah implementasi yang lebih penting bagi programmer JavaScript yang sangat mahir. Rata-rata programmer JavaScript hanya peduli dengan tipe data bahasa abstrak yang telah ditentukan oleh ECMAScript.
Dalam konteks programmer sehari-hari, bukan peneliti atau ilmuwan komputer teoretis, istilah untyped adalah istilah yang keliru karena kebanyakan orang tidak melakukan lambda kalkulus. Jadi istilah tersebut membingungkan banyak orang dan sepertinya menyatakan bahwa JavaScript tidak memiliki tipe data yang sama sekali tidak benar. Siapapun yang pernah menggunakan
typeof
tahu bahwa JavaScript memiliki tipe data bahasanya sendiri:hasil
ECMAScript mendefinisikan jenis berikut untuk bahasa:
undefined
,null
,string
,boolean
,number
,object
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Penunjukan yang lebih akurat untuk JavaScript akan diketik secara implisit, diketik secara dinamis, atau diketik dengan lemah / longgar (atau beberapa kombinasinya), di mana JavaScript menggunakan pemaksaan tipe dalam beberapa kasus yang membuat tipe tersirat karena Anda tidak harus secara eksplisit menentukan jenis variabel Anda. Itu berada di bawah ketikan lemah karena, tidak seperti beberapa bahasa yang membedakan antara float dan integer dll, ia hanya menggunakan satu
number
jenis untuk mencakup semua angka, dan menggunakan jenis paksaan yang disebutkan sebelumnya [Bagian 9 dari Spesifikasi ECMAScript] , sangat kontras dengan a bahasa yang diketik dengan kuat akan memiliki tipe data yang sangat spesifik (misalnya, Anda harus menentukanint
ataufloat
).Definisi bahasa yang diketik secara statis dan dinamis tidak terstandarisasi, namun begitu juga dengan ukuran byte ketika komputer mulai berkembang. Pengetikan statis dan dinamis paling sering mengacu pada keberadaan fitur bahasa tertentu. Salah satunya adalah pemeriksaan jenis pada waktu proses , atau yang disebut pemeriksaan jenis dinamis . Jika Anda telah menggunakan JavaScript, Anda sudah tahu bahwa itu pasti menunggu hingga waktu proses untuk memeriksa jenis, itulah sebabnya Anda mendapatkan
TypeError
pengecualian selama eksekusi kode Anda. Contoh di siniSaya pikir jawaban pilihan teratas membingungkan polimorfisme fungsi JavaScript dengan fungsi yang akan menerima apa pun secara harfiah (seperti varian Lambda Calculus yang tidak diketik) yang merupakan Kekeliruan Asosiasi .
sumber
Ingatlah bahwa JavaScript memungkinkan Anda untuk menanyakan apa itu
typeof(your_variable)
, dan membandingkan tipe:5==="5"
pengembalianfalse
. Jadi saya rasa Anda tidak bisa menyebutnya tanpa tipe.Ini secara dinamis dan (diperkirakan) diketik dengan lemah. Anda mungkin ingin tahu itu menggunakan pengetikan Bebek (lihat tautan andrew) dan menawarkan OOP melalui Prototyping alih-alih kelas dan warisan.
sumber
String a = "blah";
atauvar a:String = 'blah';
(yaitu variabel yang diketik) sama sekali. Itulah mengapa tidak diketik.Sementara itu diketik (Anda dapat bertanya "typeof someVar" dan mempelajari jenis spesifiknya, ini sangat lemah.
Diberikan:
Anda bisa mengatakan bahwa a adalah string. Namun, jika Anda kemudian menulis:
b adalah int sama dengan 15, jadi a bertindak seperti int. Tentu saja, Anda kemudian dapat menulis:
dan c akan sama dengan "5Hello World", jadi a lagi-lagi bertindak seperti string.
sumber
b
sederajat510
: ideone.com/BRcSW7