Mempelajari bahasa pemrograman hanya memiliki dua aspek: satu adalah sintaksis dan yang lainnya adalah tipe data. Sintaks bahasa C seperti C tidak lebih dari jika, sementara, untuk, fungsi, operasi aritmatika, dll., Dan bahasa yang berorientasi objek ditambahkan ke objek.
Sintaks hanyalah seperangkat aturan yang telah dibuat oleh desainer bahasa sebelumnya. Tata bahasa dari berbagai bahasa berbeda, tetapi mereka semua memiliki beberapa poin bersama. Bagi mereka yang terbiasa dengan satu atau dua bahasa pemrograman, tata bahasa sering tidak menjadi masalah ketika mempelajari bahasa pemrograman lainnya (tentu saja, jika Anda telah belajar bahasa seperti C, maka pasti akan membutuhkan waktu untuk terlibat dalam LISP untuk pertama kalinya). Fokus pembelajaran sering pada tipe data dan operasi terkait, dan tidak ada pepatah lama: "Struktur Data + Algoritma = Program"! Kedua, sintaks beberapa bahasa itu sendiri memiliki masalah desain (JavaScript bahkan lebih dari itu), jadi kami tidak perlu menggali titik -titik ini. Tentu saja, jika Anda mengklaim sebagai geek, Anda dapat bermain dengannya.
Artikel ini akan memberikan pengantar terperinci untuk tipe data dalam JavaScript.
Tipe lemah vs tipe yang kuat
Mengingat filosofi desain JavaScript, JavaScript dirancang sebagai bahasa yang lemah.
Berbicara tentang hal ini, tidak dapat dihindari untuk berbicara tentang perbedaan antara tipe lemah dan tipe yang kuat.
Beberapa orang secara keliru berpikir bahwa perbedaan antara keduanya adalah bahwa "bahasa yang sangat diketik perlu menunjukkan jenisnya ketika mendeklarasikan variabel, sementara yang diketik lemah tidak menggunakannya." Bahkan, pandangan ini salah. Misalnya, cuplikan kode Java berikut:
Salinan kode adalah sebagai berikut:
String s = "halo";
int l = s.getbytes (). Panjang;
Bagaimana kompiler tahu bahwa. Panjang ekspresi hukum? Ini karena kompiler tahu bahwa tipe data S adalah string. Ketika metode getBytes dari string dipanggil, tipe data dari nilai pengembalian adalah byte [], jadi .length adalah ekspresi hukum.
Perbedaan nyata antara keduanya adalah:
Dalam bahasa yang sangat diketik, jenis setiap ekspresi dapat ditentukan pada waktu kompilasi dan hanya operasi yang berlaku untuk jenis yang diizinkan;
Bahasa tipe yang lemah memungkinkan operasi apa pun untuk dikenakan pada jenis apa pun, tetapi operasi ini dapat melaporkan kesalahan saat runtime.
Tipe data
Menurut spesifikasi ecmascript 5.1, ada enam tipe data dalam JavaScript, yaitu: tidak terdefinisi, nol, boolean, angka, string, dan objek. Lima yang pertama milik tipe dasar, dan yang terakhir milik tipe objek.
Tipe data dasar
Jenis yang tidak ditentukan hanya memiliki satu nilai, yang tidak ditentukan, yang berarti "nilai nol", yang berlaku untuk semua tipe data.
Jenis nol hanya memiliki satu nilai, yang nol, yang berarti "tidak ada objek" dan hanya berlaku untuk tipe objek.
Tipe boolean memiliki dua nilai, benar dan salah
Nilai angka tipe adalah set angka poin floating 64-bit yang mengikuti standar IEEE 754, mirip dengan Java's Double. Tidak ada struktur data integer. Selain itu, ada tiga nilai khusus: NAN, Infinity, -infinity
Nilai string tipe adalah kumpulan karakter unicode terbatas. Harus terlampir dengan 'atau'.
nol dan tidak terdefinisi
Baik nol dan tidak terdefinisi mewakili konsep "tidak bernilai", jika dibedakan secara ketat:
- NULL berarti kosong
- Tidak terdefinisi berarti tidak ada. Nilai ini adalah semua variabel tanpa inisialisasi, parameter yang hilang dalam fungsi, dan tidak ada nilai pengembalian eksplisit.
Dalam bahasa lain, hanya satu nol yang digunakan untuk mewakili nilai nol. Mengapa ada javascript yang tidak terdefinisi? Ini disebabkan oleh alasan historis:
JavaScript mengadopsi sintaks Java, membagi jenis menjadi tipe dasar dan tipe objek. Di Java, NULL digunakan untuk mewakili objek kosong, dan JavaScript mewarisi mereka begitu saja; Dalam bahasa C, nol adalah 0 ketika dikonversi ke angka, dan JavaScript juga mengadopsi metode yang sama:
Salinan kode adalah sebagai berikut:
> Nomor (NULL)
0
> 5 + NULL
5
Dalam Javascript 1.0, belum ada penanganan yang terkecuali. Untuk beberapa pengecualian (tidak ada variabel yang diinisialisasi, parameter yang hilang saat memanggil fungsi, dll.), Mereka perlu ditandai sebagai nilai khusus. Null adalah pilihan yang baik, tetapi Brendan Eich ingin menghindari dua hal berikut:
- Nilai khusus ini seharusnya tidak memiliki atribut referensi, karena itu khusus objek
- Nilai khusus ini tidak boleh dikonversi ke 0, karena tidak mudah untuk mendeteksi kesalahan dalam program
Untuk dua alasan ini, Brendan Eich memilih tidak terdefinisi, yang dapat dipaksa untuk NAN.
Salinan kode adalah sebagai berikut:
> Nomor (tidak ditentukan)
Nan
> 5 + tidak ditentukan
Nan
Hasilnya sangat berbeda saat berhadapan dengan objek JSON:
Salinan kode adalah sebagai berikut:
> Json.parse (null)
batal
> Json.parse (tidak ditentukan)
// Firfox Syntaxerror: json.parse: Karakter tak terduga di baris 1 kolom 1 dari data JSON
// sintakser chrome: token tak terduga u
> Json.stringify (null)
"batal"
> Json.stringify (tidak ditentukan)
belum diartikan
Tipe objek
Sebagai bahasa skrip, JavaScript sendiri memiliki fungsi yang sangat ramping, dan banyak fungsi (membaca dan menulis file, jaringan, dll.) Disediakan oleh lingkungan host. Jembatan antara lingkungan host dan bahasa JavaScript adalah objek. Lingkungan host menyediakan berbagai fungsi dengan menyediakan serangkaian objek yang sesuai dengan sintaks JavaScript.
Dalam artikel ini dalam pemrograman berorientasi objek JavaScript (jika Anda tidak tahu apa itu prototipe, saya sangat merekomendasikan membaca artikel ini), saya telah berulang kali menekankan bahwa objek adalah serangkaian pasangan nilai kunci dalam JavaScript, seperti hashmap di Java. Namun, sifat -sifat objek dalam JavaScript dapat memiliki beberapa deskriptor (deskriptor properti), yang tidak tersedia dalam hashmap.
Deskriptor atribut
Deskriptor atribut dibagi menjadi dua kategori:
Deskriptor Data (Deskriptor Data), berisi serangkaian nilai boolean, untuk menunjukkan apakah atribut memungkinkan modifikasi dan penghapusan.
Accessor Descriptor, termasuk fungsi GET dan atur.
Kedua deskriptor adalah objek, dan keduanya memiliki dua properti Boolean berikut:
Dapat dikonfigurasi digunakan untuk menentukan apakah deskriptor memungkinkan modifikasi dan penghapusan. Default salah.
Enumerable digunakan untuk menentukan apakah akan mengakses properti saat melintasi objek (menggunakan untuk ... di loop atau objek.Keys Method). Default salah.
Selain dua atribut umum di atas, deskriptor data memiliki dua atribut berikut:
- Nilai digunakan untuk menentukan nilai properti ini, default tidak ditentukan
- Writable digunakan untuk menentukan apakah nilai properti memungkinkan perubahan nilai properti. Standarnya false
Ada dua properti untuk deskriptor akses:
- Dapatkan digunakan untuk menentukan aksesor (Getter, pada dasarnya suatu fungsi) saat mengakses properti, dan nilai pengembalian aksesor adalah nilai properti. Default tidak ditentukan
- Set digunakan untuk menentukan evaluator (setter, pada dasarnya fungsi) saat mengakses properti ini. Evaluator menerima parameter. Default tidak ditentukan
Kita dapat menggunakan objek.defineproperty untuk mengatur deskriptor properti objek. Misalnya:
Salinan kode adalah sebagai berikut:
// menggunakan __proto__
Object.defineproperty (obj, 'key', {
__proto__: null, // tidak ada properti yang diwariskan
Nilai: 'statis' // tidak bisa dihiasi
// tidak dapat dikonfigurasi
// tidak dapat ditulis
// sebagai default
});
Dari contoh di atas, kita dapat melihat bahwa deskriptor memiliki karakteristik warisan. Kami secara eksplisit mengatur __proto__ dari objek deskriptor ke null, yang menghindari mewarisi atribut yang sesuai dari objek.prototype. Tentu saja, kita juga dapat secara eksplisit mengatur semua properti deskriptor:
Salinan kode adalah sebagai berikut:
// menjadi eksplisit
Object.defineproperty (obj, 'key', {
Hancur: Salah,
dapat dikonfigurasi: false,
Tulisan: Salah,
Nilai: 'statis'
});
Efek ini sama dengan potongan kode pertama.
Berikut adalah contoh lain dari deskriptor akses:
Salinan kode adalah sebagai berikut:
// Contoh properti objek yang ditambahkan dengan definEproperty dengan deskriptor properti accessor
var bvalue = 38;
Object.defineproperty (obj, 'key', {
get: function () {return bvalue; },
set: function (newValue) {bvalue = newValue; },
Hancur: Benar,
dapat dikonfigurasi: Benar
});
Perlu dicatat bahwa deskriptor akses dan deskriptor data tidak dapat bingung. Salah menulis yang berikut:
Salinan kode adalah sebagai berikut:
// Anda tidak dapat mencoba mencampur keduanya:
Object.defineproperty (obj, 'konflik', {
Nilai: 0x9f91102,
get: function () {return 0xDeadBeef; }
});
// melempar typeError: deskriptor properti tidak boleh menentukan nilai
// atau dapat ditulis saat pengambil atau setter telah ditentukan
tipeof
Jika Anda ingin mengetahui jenis variabel saat runtime, Anda dapat menggunakan operator TypeOF. Nilai pengembalian tipeof adalah sebagai berikut:
Satu hal yang perlu dicatat adalah tipe null == "objek". Menurut standar ecmascript 5.1, tipe nol harus menjadi tipe dasar. Mengapa objek dikembalikan ke sini? Alasannya adalah ini:
Dalam JavaScript 1.0, nilai dalam JavaScript diwakili oleh struktur seperti tag tipe dan nilai aktual. Tipe bendera objek adalah 0, dan nol mewakili pointer nol (0x00) dalam bahasa C, sehingga bendera tipe nol adalah 0.
Di atas adalah seluruh konten artikel ini. Silakan merujuk jika Anda membutuhkannya.