Tulis di depan
Hari ini saya ingin memeriksa pengetahuan tentang tipe simpul dan pengetahuan seperti apa yang ingin saya ringkas. Saya melihat artikel di Google, tetapi tautan aslinya hilang. Saya mengeluarkan artikel ini di snapshot. Jika penulis asli memiliki pertanyaan, silakan hubungi saya!
Artikel ini semuanya didasarkan pada beberapa JS, dan para ahli akan secara otomatis melewatkannya! Saya belum pernah menulis banyak tentang JS sebelumnya, dan aspek ini relatif lemah, jadi saya juga mengalami masalah saat menulis node. Ini adalah suplemen sepengetahuan saya!
teks
Dasar Node.js adalah JavaScript, bahasa skrip. Salah satu fitur umum dari sebagian besar bahasa skrip adalah "tipe lemah".
Tidak seperti PHP, bahkan jika ada variabel baru dalam PHP, tidak perlu menyatakannya, sementara JavaScript masih membutuhkan VAR untuk menyatakannya. VAR ini mencakup semua jenis makna seperti int, string, char, dll. Dalam C ++, dan bahkan fungsi.
Semua konten dalam artikel ini dan artikel berikut diedit menggunakan VIM di Linux atau Cygwin (jika tidak, harap konversi menjadi metode Anda sendiri), dan kemudian lihat hasilnya di bawah baris perintah.
Sintaks dasar
Deklarasi Variabel
Dalam C/C ++, kami mendeklarasikan variabel seperti ini:
`` `C ++
Salinan kode adalah sebagai berikut:
void foo () {}
int a = 0;
char b = 'a';
float c = 1.0f;
void (*d) () = foo; /// <lupa jika itu yang saya tulis, singkatnya, itu adalah penunjuk fungsi
Dan di Node.js terlihat seperti ini:
`` `JavaScript
Salinan kode adalah sebagai berikut:
function foo () {}
var a = 0;
var b = 'a';
var c = 1.0;
var d = foo;
Jadi, apa pun jenis variabelnya, itu diselesaikan dengan var di node.js.
Pernyataan loop
untuk… i
Pernyataan loop ini pada dasarnya sama dengan C/C ++, keduanya
`` `C ++
Salinan kode adalah sebagai berikut:
untuk (int i = 0; i <foo; i ++)
{
// ...
}
Dan karena Node.js adalah tipe yang lemah, hanya perlu:
`` `JavaScript
Salinan kode adalah sebagai berikut:
untuk (var i = 0; i <foo; i ++) {
// ...
}
untuk… di
Ini adalah pernyataan loop berbentuk pasca, mirip dengan foreach PHP.
Misalnya, kami memiliki objek JSON sebagai berikut:
Javascript
Salinan kode adalah sebagai berikut:
var foo = {
"halo": "dunia",
"Node": "JS",
"Blahblah": "bar"
};
Pada saat ini, kita dapat menggunakan ... untuk melingkar melalui:
Javascript
Salinan kode adalah sebagai berikut:
untuk (tombol var di foo) {
console.log (key + ":" + foo [key]);
}
Jika kami mengetikkan perintah berikut di baris perintah:
Salinan kode adalah sebagai berikut:
$ node foo.js
Konten berikut akan ditampilkan di layar:
Salinan kode adalah sebagai berikut:
Halo
: dunia
Node: JS
Blahi: Bar
Kiat: Dari yang di atas, for ... dalam pernyataan digunakan untuk melintasi nama-nama kunci objek, array, dan objek JSON, tanpa memberikan traversal nilai kunci. Jika Anda ingin mendapatkan nilai kunci, Anda hanya bisa mendapatkannya dalam bentuk foo [<nama kunci saat ini>]. Ini masih sedikit berbeda dari php foreach.
Sementara ... lakukan, lakukan ... whill
Saya tidak akan menjelaskan sebanyak ini, itu bukan perbedaan besar dari bahasa lain. Tidak lebih dari itu jika ada deklarasi variabel, cukup untuk menggunakan VAR.
Operator
+, -, *, /
Ini adalah kasus dengan operator ini, orang harus memperhatikan +. Ini dapat bertindak berdasarkan operasi dan operasi numerik. Meskipun bahasa tipe lemah mengatakan bahwa tipe lemah, angka kadang-kadang dapat muncul dalam bentuk string, dan string kadang-kadang dapat muncul dalam bentuk nilai numerik, tetapi bila perlu, Anda masih perlu berbicara tentang jenis apa itu. Kita dapat menggunakan kode berikut untuk melihat hasilnya:
Salinan kode adalah sebagai berikut:
var a = "1";
var b = 2;
console.log (a + b);
console.log (parseint (a) + b);
Di sini Parseint adalah fungsi bawaan dari node.js, yang digunakan untuk menguraikan string ke dalam variabel tipe int.
Hasil eksekusi kode di atas adalah:
Salinan kode adalah sebagai berikut:
12
3
Catatan: Hasil dari konsol pertama. Log adalah 12. Karena A adalah string, B juga ditambahkan sebagai string oleh sistem. Hasilnya adalah bahwa kedua string direkatkan dan menjadi 12. Hasil dari konsol kedua. Log adalah 3 karena kami mengonversi tipe AT ke int pertama, dan menambahkan dua variabel tipe int, yaitu, menambah nilai, dan tentu saja, hasilnya adalah 3.
==, ==,! =,! ==
Berikut adalah titik untuk menjelaskan bahwa ketika panjang operator logis ini adalah 2 (==,! =), Itu hanya menentukan apakah nilai eksternalnya sama, tetapi tidak menentukan jenisnya. menyukai
Salinan kode adalah sebagai berikut:
var a = 1, b = "1";
console.log (a == b);
Hasil outputnya benar. Tetapi jika kita menambahkan tanda yang sama ketika kita membuat penilaian di tengah, maka kita akan membuat penilaian yang ketat. Itu hanya akan benar ketika jenis dan nilainya sama, jika tidak, itu akan salah. Artinya
Salinan kode adalah sebagai berikut:
var a = 1, b = "1";
console.log (a === b);
Ketika, hasil yang dikembalikan salah, karena A adalah tipe int, sedangkan B adalah string.
Ngomong -ngomong, mari kita bicara tentang pernyataan bersyarat. Bahkan, jika di sini tidak berbeda dari bahasa lain, itu hanya masalah dua tanda yang sama dan tiga tanda yang sama untuk beberapa operator logis. Jadi saya tidak akan memberikan banyak pernyataan melelahkan.
tipeof
Di sini saya akan menganggapnya sebagai operator daripada fungsi.
Fungsi operator ini adalah untuk menilai jenis variabel, dan akan mengembalikan string, yaitu nama jenisnya. Anda akan tahu jika Anda menjalankan kode berikut:
Salinan kode adalah sebagai berikut:
function foo () {}
var a = 0;
var b = 'shh ~ sup bunga telur sedang tidur. ';
var c = 1.0;
var d = foo;
var e = {"a": a};
var f = [1, 2, 3];
var g = null;
var h = tidak terdefinisi;
console.log (typeof a);
Console.log (Typeof B);
Console.log (Typeof C);
console.log (typeof d);
console.log (typeof e);
Console.log (TypeOf f);
console.log (typeof g);
console.log (tipe h);
Hasil eksekusi di sini adalah:
Salinan kode adalah sebagai berikut:
nomor
rangkaian
nomor
fungsi
obyek
obyek
obyek
belum diartikan
null, tidak terdefinisi, nan
Dalam JavaScript, ada tiga nilai khusus, seperti yang ditunjukkan pada judul. Setiap orang mungkin terbiasa dengan yang pertama. Ada juga C/C ++, tetapi dikapitalisasi, dan esensinya adalah satu.
`` `C ++
Tentukan null 0
Dalam JavaScript, makna dari ketiga nilai ini berbeda.
### NULL ###
NULL adalah objek khusus, yang kira -kira berarti kosong. Misalnya:
var a = null;
Semua orang bisa memahaminya, jadi saya tidak akan menjelaskannya. Tetapi tidak seperti C/C ++, nol ini tidak sama dengan 0.
### belum diartikan ###
Apa artinya hal ini adalah bahwa variabel ini tidak dinyatakan. Untuk membedakan NULL dengan lebih baik, kode sampel kami adalah sebagai berikut:
`` `JavaScript
Salinan kode adalah sebagai berikut:
var a = {
"foo": null
};
console.log (a ["foo"]);
console.log (a ["bar"]);
Dalam kode di atas, kami membuat nilai ["foo"] kosong, yaitu nol. Dan itu tidak dinyatakan sama sekali, itu bahkan tidak kosong. Setiap orang seharusnya menebak hasil output:
Salinan kode adalah sebagai berikut:
batal
belum diartikan
Nan
Ini adalah nilai kosong, nomor khusus. Nama lengkapnya bukan nomor. Agak aneh. Anda dapat memahaminya sebagai variabel tipe angka yang bukan bentuk numerik, atau variabel tipe angka dengan kesalahan.
Ini sering terjadi ketika kesalahan operasi numerik titik mengambang (seperti membagi dengan 0), atau bahkan pengguna dapat membuat variabel yang sama dengan Nan sendiri untuk mengembalikan nilai kesalahan sehingga semua orang tahu bahwa fungsi tersebut memiliki kesalahan dalam operasi.
Lain -lain kecil
Pernyataan lainnya yang tersisa mirip dengan bahasa lain yang ada, seperti istirahat, beralih, lanjutkan, dll.
Jenis variabel
Bagian ini terutama berbicara tentang objek JavaScript, dan jenis lainnya hampir sama.
Tipe dasar
Tipe dasar yang terkandung dalam node.js hampir sebagai berikut:
nomor
rangkaian
Boolean
array
Tiga jenis pertama dapat ditetapkan secara langsung, dan penugasan array hanyalah penugasan referensi. Jika nilai tertentu diubah dalam variabel baru, nilai variabel lama juga akan berubah. Anda dapat langsung mencoba kode berikut:
Javascript
var foo = [1, 2, 3];
var bar = foo;
bar [0] = 3;
console.log (foo);
Itu menghasilkan:
Javascript
[3, 2, 3]
Dengan kata lain, jika sebuah array disalin ke dalam array baru, itu tidak dapat digunakan untuk secara langsung menetapkan nilai, tetapi harus "disalin secara mendalam".
Di sini kita perlu berbicara tentang tiga cara untuk membuat array.
Tipe pertama:
Javascript
Salinan kode adalah sebagai berikut:
var dog = array baru ();
anjing [0] = "shh ~";
anjing [1] = "Sup Bunga Telur";
anjing [2] = "tidur";
Tipe kedua:
Javascript
Salinan kode adalah sebagai berikut:
var dog = array baru ("shh ~", "sup bunga telur", "tidur");
Tipe Keempat:
Javascript
Salinan kode adalah sebagai berikut:
var dog = [
"Shh ~",
"Sup Bunga Telur",
"Sedang tidur"
];
Saya pribadi lebih suka cara menulis ketiga, yang relatif ringkas.
Objek json
Di sini saya mengambil objek JSON secara terpisah alih -alih mengklasifikasikannya sebagai objek JavaScript. Jika saya pikir saya sedikit menyesatkan, saya dapat melewatkan bagian ini secara langsung.
Perbedaan saya antara objek JSON dan objek JavaScript adalah apakah itu digunakan untuk menyimpan data saja, daripada instantiasi kelas. Bahkan, esensi JSON adalah notasi objek JavaScript.
Untuk informasi lebih lanjut tentang JSON, silakan encyclopedia sendiri.
Mendeklarasikan objek JSON di Node.js sangat sederhana:
Javascript
Salinan kode adalah sebagai berikut:
var dog = {
"Pre": "Shh ~",
"sub": {
"Nama": "Sup Bunga Telur",
"bertindak": "tidur",
"Waktu": 12
},
"Suf": ["Aku berkata", "Ini tidur", "Ini sedang tidur"]
};
Ada dua cara untuk mendapatkan nilai kunci dari nama kunci tertentu dalam objek JSON. Yang pertama adalah menghubungkannya dengan titik -titik, dan yang kedua adalah menggunakan tanda kurung:
Javascript
Salinan kode adalah sebagai berikut:
anjing
.pra;
anjing ["pra"];
Catatan: Saat menggunakan titik -titik di atas, kunci di JSON diikuti langsung. Jika Anda memperlakukan kunci sebagai variabel, Anda hanya dapat mencobanya dengan Dog [Key]: Sekarang Anda dapat mencobanya sendiri dan menggunakan untuk ... untuk melintasi objek JSON di atas. Jangan lupa menggunakan TypeOf ~
Dasar dari suatu kelas (objek)
Sebenarnya, kelas Node.js tidak dapat dianggap sebagai kelas. Bahkan, itu hanya kumpulan fungsi, menambahkan beberapa variabel anggota. Esensinya sebenarnya adalah fungsi.
Namun, demi akal sehat, kita akan menyebutnya "kelas" di kemudian hari, dan yang instantiated disebut "objek".
Karena kelas memiliki banyak fungsi, atau esensinya adalah suatu fungsi, kita dapat berbicara tentang dasar -dasar fungsi ketika kita tidak hati -hati.
Deklarasi dan instantiasi kelas
Mendeklarasikan kelas sangat sederhana, jangan tertawa:
Javascript
fungsi foo () {
// ...
}
Oke, kami telah menulis kelas foo.
Benar atau palsu? Lai nyata.
Tidak percaya? Jika Anda tidak percaya, Anda dapat mengetik kode dan membacanya:
Javascript
var bar = foo baru ();
Jangan melihatnya sebagai fungsi, jika ditulis dalam bentuk seperti itu (baru), itu adalah instantiasi kelas ini.
Dan apa yang disebut foo () sebenarnya adalah konstruktor kelas foo () ini.
Variabel anggota
Ada dua cara bagus untuk mendapatkan variabel anggota.
Yang pertama adalah menggunakan ini. <Variabel Name> di Konstruktor kelas atau konstruktor apa pun. Anda dapat mendeklarasikan variabel anggota kapan saja, dan itu tidak akan mempengaruhi penggunaan di luar. Ngomong -ngomong, bahkan jika Anda menggunakannya saat tidak dinyatakan, akan ada yang tidak terdefinisi untuk mendukungnya. Jadi ini adalah metode pertama:
Salinan kode adalah sebagai berikut:
Javascript
fungsi foo () {
this.hello = "dunia";
}
Catatan: Ini adalah variabel anggota dari kelas panggilan hanya ketika ini ditambahkan, jika tidak, ini hanya variabel lokal dalam fungsi. Penting untuk membedakan apakah ada ruang lingkup tindakan variabel ini.
Metode kedua adalah mendeklarasikannya di luar konstruktor atau fungsi anggota apa pun, dan formatnya adalah <class name> .prototype. <Variable name>:
Javascript
Salinan kode adalah sebagai berikut:
fungsi foo () {
// ...
}
foo.prototype.hello = "world";
Tidak peduli metode mana di atas adalah deklarasi variabel anggota, kita dapat melihat efeknya:
Javascript
Salinan kode adalah sebagai berikut:
var bar = foo baru ();
console.log (bar.hello);
Anda bahkan dapat memodifikasi kelas ini seperti ini:
Javascript
Salinan kode adalah sebagai berikut:
fungsi foo () {
this.hello = "dunia";
}
foo.prototype.hello = "Sup Bunga Telur";
Kemudian gunakan kode di atas untuk mengeluarkannya.
Pikirkan mengapa outputnya adalah dunia alih -alih sup telur.
Konstruktor
Kami telah mengatakan sebelumnya bahwa foo () sebenarnya adalah konstruktor. Maka jelas kita dapat meneruskan parameter ke konstruktor, jadi kita memiliki kode berikut:
Javascript
Salinan kode adalah sebagai berikut:
// Kode 2.1
function foo (halo) {
if (hello === tidak terdefinisi) {
this.hello = "dunia";
} kalau tidak {
this.hello = halo;
}
}
Kami melihat penilaian aneh di atasnya jika (halo === tidak terdefinisi). Apa gunanya penilaian ini? Kemungkinan pertama adalah bahwa pengembang secara khusus mengirim rasa sakit yang tidak terdefinisi. Saat ini, tidak terdefinisi.
Ada situasi lain. Kami mengatakan sejak awal bahwa JavaScript adalah bahasa tipe lemah. Faktanya, ini bukan hanya tipe lemah, tetapi parameter transmisinya juga sangat tidak kaku. Anda dapat melewati lebih atau kurang (selama Anda memastikan bahwa program tidak membuat kesalahan ketika Anda melewati lebih atau kurang atau kurang), pada prinsipnya tidak masalah. Parameter beberapa operan akan diabaikan secara otomatis, sedangkan parameter beberapa operan akan dilengkapi dengan tidak terdefinisi.
Lihat saja kode berikut dan Anda akan mengerti:
Javascript
Salinan kode adalah sebagai berikut:
// Hubungkan kode 2.1 di
var bar1 = foo baru ();
var bar2 = foo baru ("sup bunga telur");
Harap output dua variabel halo batang sendiri, dan Anda akan menemukan bahwa satu adalah dunia dan yang lainnya adalah sup telur. Jelas, ketika BAR1 pertama kami dinyatakan, itu secara otomatis dianggap sebagai oleh Node.js:
Javascript
Salinan kode adalah sebagai berikut:
var bar1 = foo baru (tidak terdefinisi);
Jadi ada pepatah bahwa itu adalah dunia.
Juga dalam konstruktor ini, kami melihat bahwa parameter yang dilewati adalah halo, dan ada variabel anggota di kelas ini yaitu this.hello. Namun, kami telah mengatakan sebelumnya bahwa ruang lingkupnya berbeda ketika ada ini dan ini tidak. Parameter itu hanya digunakan dalam konstruktor, sedangkan yang dengan ini adalah variabel anggota. Gunakan ini untuk membedakan mereka segera, jadi tidak masalah bahkan jika nama yang sama.
Fungsi anggota
Deklarasi Fungsi Anggota
Deklarasi fungsi anggota mirip dengan metode deklarasi kedua dari variabel anggota, yaitu, <class name> .prototype. <Function name> = <fungsi>;
Javascript
Salinan kode adalah sebagai berikut:
// Hubungkan kode 2.1 di
fungsi setHello (halo) {
this.hello = halo;
}
foo.prototype.sethello = setHello;
Bar1.sethello ("Kue Telur");
Karena kode di atas jelas, kami menerapkan fungsi Sethello dari kelas FOO, yang melaluinya kami dapat memodifikasi nilai foo.hello.
Tapi bukankah agak merepotkan untuk menulis seperti ini? Selanjutnya, saya akan berbicara tentang fitur penting dari fungsi JavaScript.
★ Fungsi anonim ★
Sering kali, beberapa fungsi kami hanya dirujuk atau dipanggil di satu tempat, jadi terlalu berharga untuk memberikan nama ini nama, dan tidak perlu, sehingga kami dapat menulis fungsi ini sementara dan secara langsung meminta orang yang merujuknya untuk merujuknya, dan orang yang memanggilnya untuk menyebutnya. Oleh karena itu, fungsi dapat menghilangkan nama fungsi, seperti:
Javascript
Salinan kode adalah sebagai berikut:
fungsi (halo) {
this.hello = halo;
}
Adapun bagaimana cara mengutip atau menyebutnya? Jika kelas di atas perlu dikutip, tertulis seperti ini:
Javascript
Salinan kode adalah sebagai berikut:
foo.prototype.sethello = function (hello) {
this.hello = halo;
}
Metode penulisan ini sama dengan deklarasi fungsi anggota, dan menyimpan banyak kode. Dan pada kenyataannya, pada dasarnya deklarasi fungsi anggota kelas dinyatakan dengan cara fungsi anonim ini.
Adapun bagaimana membuat fungsi anonim dipanggil? Ini biasanya ditulis seperti ini ketika melewati fungsi yang hanya dipanggil oleh fungsi tertentu.
Misalnya, kami memiliki prototipe suatu fungsi:
Javascript
Salinan kode adalah sebagai berikut:
/**
* Kami akan melewati dua variabel A dan B,
* Setelah menghitung nilai A+B, serahkan ke FUNC (NUM)
* Pergi ke Output
*/
fungsi sumab (a, b, func) {
var c = a + b;
func (a, b, c);
}
Misalnya, kami memiliki dua versi fungsi output, satu adalah output Cina dan yang lainnya adalah output bahasa Inggris. Jadi jika kami tidak menggunakan fungsi anonim:
Javascript
Salinan kode adalah sebagai berikut:
fungsi zh (a, b, sum) {
Nilai konsol.log (a + " +" + b + "adalah:" + jumlah);
}
fungsi en (a, b, sum) {
console.log (a + "plus" + b + "adalah" + sum);
}
sumab (1, 2, zh);
sumab (3, 4, en);
Jalankan kode ini sekali, dan outputnya adalah:
Nilai 1 + 2 adalah: 3
3 plus 4 adalah 7
Jika kode seperti itu dalam bentuk fungsi anonim, itu akan menjadi:
Javascript
Salinan kode adalah sebagai berikut:
sumab (1, 2, fungsi (a, b, sum) {
Nilai konsol.log (a + " +" + b + "adalah:" + jumlah);
});
sumab (3, 4, fungsi (a, b, sum) {
console.log (a + "plus" + b + "adalah" + sum);
});
Formulir ini biasanya digunakan dalam fungsi panggilan balik. Mekanisme panggilan balik adalah inti dari Node.js atau JavaScript. Saya akan memperkenalkannya di bab -bab mendatang.
Bagaimana mendeklarasikan fungsi anonim dalam deklarasi fungsi anggota
Meskipun saya telah membicarakannya di bagian sebelumnya, saya hanya akan membicarakannya lagi.
Biasanya, ketika kami mendeklarasikan fungsi anggota kelas, kami menggunakan fungsi anonim untuk menyatakannya, karena bagaimanapun, fungsi itu hanyalah fungsi anggota dari kelas ini dan tidak akan direferensikan atau dipanggil secara terpisah di tempat lain, sehingga kode berikut tersedia:
Javascript
Salinan kode adalah sebagai berikut:
// Hubungkan kode 2.1 di
foo.prototype.sethello = function (hello) {
this.hello = halo;
}
Dengan cara ini, kami memiliki fungsi Sethello di kelas FOO.
2.3.4. Keacakan kelas
Ini omong kosong saya lagi. Yang disebut keacakan kelas berarti bahwa dalam JavaScript Anda dapat memodifikasi kelas Anda di mana saja, yang memiliki kesamaan tertentu dengan Ruby.
Misalnya, String sebenarnya adalah kelas, dengan variabel anggota seperti panjang, dan fungsi anggota seperti IndexOf dan Substr. Tetapi jika kita berpikir bahwa beberapa bagian dari string ini tidak sempurna dan ingin menambahkan metode kita sendiri, maka kita dapat menambahkan fungsi ke tempat yang Anda inginkan, seperti:
Javascript
Salinan kode adalah sebagai berikut:
String.prototype.sb = function () {
var newsstr = "";
untuk (var i = 0; i <this.length; i ++) {
if (i % 2 === 0) newsr += "s";
lain newsr += "b";
}
return Newsr;
};
Arti fungsi ini adalah mengisi string untuk membuatnya menjadi inkarnasi SB.
Mari kita mengujinya:
Salinan kode adalah sebagai berikut:
var str = "SHH ~ Sup Bunga Telur sedang tidur.";
console.log (str.sb ());
Anda akan mendapatkan hasil berikut:
SBSBSBSBSBSBS
Jika Anda mengatakan "SHHH ~ Sup Bunga Telur sedang tidur." Komputer Anda akan memarahi Anda karena bodoh empat kali. (Hancurkan dengan cepat)
3. Terlampir
3.1. Salinan yang dalam
Salin yang disebut dalam adalah membuat array atau objek baru sendiri, dan secara manual menyalin nilai variabel tipe dasar dalam array sumber atau objek satu per satu, alih-alih hanya mengambil referensi ke array atau objek sumber. Jadi ini melibatkan panggilan rekursif atau semacamnya.
Di bawah ini adalah fungsi salinan dalam yang saya terapkan. Anda dapat menulis salah satu dari Anda sendiri dan menambahkannya ke basis pengetahuan Node.js Anda sendiri.
Javascript
Salinan kode adalah sebagai berikut:
function cloneobject (src) {
var dest = {};
untuk (tombol var di src) {
if (typeof src === "objek") dest [key] = cloneObject (src [key]);
lain dest [key] = src [key];
}
Return Dest;
}