Bahan, terjemahan yang kami terbitkan hari ini, didedikasikan untuk dasar-dasar JavaScript dan ditujukan untuk programmer pemula. Ini dapat dianggap sebagai referensi kecil untuk konstruksi dasar JS. Di sini, khususnya, kita akan berbicara tentang sistem tipe data, tentang variabel, tentang array, tentang fungsi, tentang prototipe objek, dan tentang beberapa fitur lain dari bahasa.

Tipe Data Primitif
Tipe data primitif berikut tersedia dalam JavaScript: 
number , 
boolean , 
string , 
undefined , 
null . Harus segera dicatat bahwa, ketika bekerja dengan tipe data primitif, misalnya, dengan literal string, kami, bahkan tanpa melakukan konversi eksplisit, akan dapat mengakses metode dan properti mereka. Intinya di sini adalah bahwa ketika mencoba melakukan operasi seperti itu, literal secara otomatis dilengkapi dengan pembungkus objek yang sesuai.
β Angka
JavaScript hanya memiliki satu jenis angka - ini adalah angka floating point presisi ganda. Ini mengarah pada fakta bahwa hasil perhitungan beberapa ekspresi secara aritmatika salah. Anda mungkin sudah tahu bahwa di JS nilai ekspresi 
0.1 + 0.2 bukan 
0.3 . Pada saat yang sama, ketika bekerja dengan bilangan bulat masalah tersebut tidak diamati, yaitu, 
1 + 2 === 3 .
JavaScript memiliki objek 
Number , yang merupakan pembungkus objek untuk nilai numerik. Objek bertipe 
Number dapat dibuat baik menggunakan perintah dari form 
var a = new Number(10) , atau Anda dapat mengandalkan perilaku otomatis sistem yang dijelaskan di atas. Ini, khususnya, memungkinkan Anda untuk memanggil metode yang disimpan dalam 
Number.prototype sebagaimana diterapkan pada literal numerik:
 (123).toString();  //"123" (1.23).toFixed(1); //"1.2" 
Ada fungsi global yang dirancang untuk mengonversi nilai tipe lain ke tipe numerik. Ini adalah 
parseInt() , 
parseFloat() dan konstruksi 
Number() , yang dalam kasus ini bertindak sebagai fungsi normal yang melakukan konversi jenis:
 parseInt("1")       //1 parseInt("text")    //NaN parseFloat("1.234") //1.234 Number("1")         //1 Number("1.234")     //1.234 
Jika selama operasi dengan angka diperoleh sesuatu yang bukan angka (selama beberapa perhitungan, atau ketika mencoba mengubah sesuatu menjadi angka), JavaScript tidak akan melempar kesalahan, tetapi akan menyajikan hasil operasi seperti itu sebagai nilai 
NaN (Bukan-a-Number, bukan angka). Untuk memeriksa apakah nilai tertentu adalah 
NaN , Anda dapat menggunakan fungsi 
isNaN() .
Operasi aritmatika JS bekerja dengan cara yang cukup akrab, tetapi Anda perlu memperhatikan fakta bahwa operator 
+ dapat melakukan penambahan angka dan rangkaian string.
 1 + 1      //2 "1" + "1"  //"11" 1 + "1"    //"11" 
βStrings
String JavaScript adalah string karakter Unicode. Literal string dibuat dengan melampirkan teks yang akan diapit dengan tanda kutip ganda ( 
"" ) atau tunggal ( 
'' ). Seperti yang telah disebutkan, ketika bekerja dengan string literal, kita dapat mengandalkan pembungkus objek yang sesuai, prototipe yang memiliki banyak metode yang berguna, di antaranya adalah 
substring() , 
indexOf() , 
concat() .
 "text".substring(1,3) //ex "text".indexOf('x')   //2 "text".concat(" end") //text end 
String, seperti nilai-nilai primitif lainnya, tidak dapat diubah. Misalnya, metode 
concat() tidak mengubah string yang ada, tetapi membuat yang baru.
β Nilai logis
Tipe data logis dalam JS diwakili oleh dua nilai - 
true dan 
false . Bahasa dapat secara otomatis mengonversi berbagai nilai ke tipe data logis. Jadi, false, selain nilai logis 
false , adalah nilai 
null , 
undefined , 
'' (string kosong), 
0 dan 
NaN . Segala sesuatu yang lain, termasuk objek apa pun, mewakili makna yang sebenarnya. Dalam operasi logis, segala sesuatu yang dianggap benar dikonversi menjadi 
true , dan segala sesuatu yang dianggap salah dikonversi menjadi 
false . Lihatlah contoh berikut. Sesuai dengan prinsip-prinsip di atas, string kosong akan dikonversi menjadi 
false dan sebagai hasil dari eksekusi kode ini, string 
This is false akan sampai ke konsol.
 let text = ''; if(text) { console.log("This is true"); } else { console.log("This is false"); } 
Benda-benda
Objek adalah struktur dinamis yang terdiri dari pasangan kunci-nilai. Nilai dapat memiliki tipe data primitif, bisa berupa objek atau fungsi.
Objek paling mudah dibuat menggunakan sintaks literal objek:
 let obj = { message : "A message", doSomething : function() {} } 
Properti suatu objek dapat dibaca, ditambahkan, diedit, dan dihapus kapan saja. Inilah cara melakukannya:
- Properti membaca: object.name, object[expression].
- Menulis data ke properti (jika properti yang diakses tidak ada, properti baru dengan kunci yang ditentukan ditambahkan): object.name = value,object[expression] = value.
- Menghapus properti: delete object.name,delete object[expression].
Berikut ini beberapa contohnya:
 let obj = {}; //    obj.message = "A message"; //    obj.message = "A new message"; //   delete object.message; //   
Objek dalam bahasa diimplementasikan sebagai tabel hash. Tabel hash sederhana dapat dibuat menggunakan perintah 
Object.create(null) :
 let french = Object.create(null); french["yes"] = "oui"; french["no"]  = "non"; french["yes"];//"oui" 
Jika objek harus dibuat tidak berubah, Anda dapat menggunakan perintah 
Object.freeze() .
Untuk beralih ke semua properti objek, Anda dapat menggunakan perintah 
Object.keys() :
 function logProperty(name){ console.log(name); //  console.log(obj[name]); //   } Object.keys(obj).forEach(logProperty); 
β Perbandingan nilai tipe dan objek primitif
Dalam pekerjaan praktis dengan nilai-nilai primitif, Anda dapat, sebagaimana telah disebutkan, melihatnya sebagai objek yang memiliki properti dan metode, meskipun mereka bukan objek. Nilai-nilai primitif tidak dapat diubah, struktur internal objek dapat berubah.
Variabel
Dalam JavaScript, variabel dapat dideklarasikan menggunakan kata kunci 
var , 
let dan 
const .
Menggunakan kata kunci 
var , Anda dapat mendeklarasikan variabel, dan jika perlu, inisialisasi dengan nilai tertentu. Jika variabel tidak diinisialisasi, nilainya tidak 
undefined . Variabel yang dideklarasikan menggunakan kata kunci 
var memiliki cakupan fungsional.
Kata kunci 
let sangat mirip dengan 
var , perbedaannya adalah variabel yang dideklarasikan dengan kata kunci 
let memiliki ruang lingkup blok.
Variabel yang dideklarasikan menggunakan kata kunci 
const juga memiliki lingkup blok, yang, mengingat fakta bahwa nilai-nilai variabel tersebut tidak dapat diubah, akan lebih tepat disebut "konstanta". Kata kunci 
const , yang βmembekukanβ nilai variabel yang dideklarasikan menggunakannya, dapat dibandingkan dengan metode 
Object.freeze() , yang βmembekuβ objek.
Jika variabel dinyatakan di luar fungsi, cakupannya adalah global.
Array
Array dalam JavaScript diimplementasikan menggunakan objek. Akibatnya, ketika berbicara tentang array, kami, pada kenyataannya, mendiskusikan objek yang mirip dengan array. Anda bisa bekerja dengan elemen array menggunakan indeksnya. Indeks numerik dikonversi ke string dan digunakan sebagai nama untuk mengakses nilai elemen array. Misalnya, konstruk form 
arr[1] mirip dengan konstruk form 
arr['1'] , dan keduanya akan memberikan akses ke nilai yang sama: 
arr[1] === arr['1'] . Sesuai dengan di atas, array sederhana dideklarasikan oleh perintah 
let arr = ['A', 'B', 'C'] diwakili sebagai objek dari bentuk berikut:
 { '0': 'A', '1': 'B', '2': 'C' } 
Menghapus elemen array menggunakan perintah 
delete meninggalkan lubang di dalamnya. Untuk menghindari masalah ini, Anda dapat menggunakan perintah 
splice() , tetapi bekerja lambat, karena, setelah menghapus suatu elemen, ia memindahkan elemen-elemen yang tersisa dari array, sebenarnya memindahkannya ke awal array, ke kiri.
 let arr = ['A', 'B', 'C']; delete arr[1]; console.log(arr); // ['A', empty, 'C'] console.log(arr.length); // 3 
Metode array memudahkan untuk menerapkan struktur data seperti tumpukan dan antrian:
 //  let stack = []; stack.push(1);           // [1] stack.push(2);           // [1, 2] let last = stack.pop();  // [1] console.log(last);       // 2 //  let queue = []; queue.push(1);           // [1] queue.push(2);           // [1, 2] let first = queue.shift();//[2] console.log(first);      // 1 
Fungsi
Fungsi dalam JavaScript adalah objek. Fungsi dapat ditugaskan ke variabel, disimpan dalam objek atau array, diteruskan sebagai argumen ke fungsi lain, dan dikembalikan dari fungsi lainnya.
Ada tiga cara untuk mendeklarasikan fungsi:
- Deklarasi fungsi klasik (Deklarasi Fungsi atau Pernyataan Fungsi).
- Penggunaan ekspresi fungsional (Function Expression), yang juga disebut literal fungsional (Function Literal).
- Menggunakan sintaks fungsi panah (Arrow Function).
β Deklarasi fungsi klasik
Dengan pendekatan ini untuk mendeklarasikan fungsi, aturan berikut ini berlaku:
- Kata kunci pertama dalam garis deklarasi functionadalahfunction.
- Fungsi harus diberi nama.
- Fungsi dapat digunakan dalam kode sebelum deklarasi karena mekanisme menaikkan deklarasi fungsi ke bagian atas lingkup di mana ia dinyatakan.
Berikut ini deklarasi fungsi klasik:
 function doSomething(){} 
β Ekspresi fungsional
Saat menggunakan ekspresi fungsional, berikut ini harus dipertimbangkan:
- Kata kunci functiontidak lagi menjadi kata pertama dalam baris deklarasi fungsi.
- Nama fungsi adalah opsional. Dimungkinkan untuk menggunakan ekspresi fungsional anonim dan bernama.
- Perintah untuk menjalankan fungsi tersebut harus mengikuti perintah untuk deklarasi mereka.
- Fungsi seperti itu dapat diluncurkan segera setelah deklarasi menggunakan sintaksis IIFE (Ekspresi Fungsi yang Segera Diminta - langsung disebut ekspresi fungsi).
Ekspresi fungsional terlihat seperti ini:
 let doSomething = function() {} 
β Fungsi panah
Fungsi panah, pada kenyataannya, dapat dianggap "gula sintaksis" untuk membuat ekspresi fungsional anonim. Perlu dicatat bahwa fungsi-fungsi tersebut tidak memiliki entitas 
this sendiri dan 
arguments . Deklarasi fungsi panah terlihat seperti ini:
 let doSomething = () = > {}; 
β Cara untuk memanggil fungsi
Fungsinya dapat dipanggil dengan berbagai cara.
Panggilan fungsi normal
 doSomething(arguments) 
Panggilan fungsi dalam bentuk metode objek
 theObject.doSomething(arguments) theObject["doSomething"](arguments) 
Panggilan fungsi konstruktor
 new doSomething(arguments) 
Memanggil fungsi menggunakan metode apply ()
 doSomething.apply(theObject, [arguments]) doSomething.call(theObject, arguments) 
Memanggil fungsi menggunakan metode bind ()
 let doSomethingWithObject = doSomething.bind(theObject); doSomethingWithObject(); 
Fungsi dapat dipanggil dengan argumen lebih atau lebih sedikit daripada jumlah parameter yang ditentukan saat dideklarasikan. Selama fungsi berfungsi, argumen "ekstra" akan diabaikan begitu saja (meskipun fungsi akan memiliki akses ke sana), parameter yang hilang akan mendapatkan nilai yang 
undefined .
Fungsinya memiliki dua parameter semu: 
this dan 
arguments .
β Kata kunci ini
Kata 
this mewakili konteks suatu fungsi. Nilai yang ditunjukkan tergantung pada bagaimana fungsi dipanggil. Berikut adalah arti dari kata kunci 
this tergantung pada bagaimana fungsinya dipanggil (dijelaskan di atas dengan contoh kode, konstruksi yang digunakan di sini):
- Panggilan fungsi yang biasa adalah window/undefined.
- Panggilan fungsi dalam bentuk metode objek adalah theObject.
- Panggilan fungsi dalam bentuk konstruktor adalah objek baru.
- Memanggil fungsi menggunakan metode apply()-theObject.
- Memanggil fungsi menggunakan metode bind()-theObject.
β Argumen kata kunci
Kata kunci 
arguments adalah pseudo-parameter yang memberikan akses ke semua argumen yang digunakan untuk memanggil fungsi. Itu terlihat seperti sebuah array, tetapi bukan sebuah array. Secara khusus, ia tidak memiliki metode array.
 function reduceToSum(total, value){ return total + value; } function sum(){ let args = Array.prototype.slice.call(arguments); return args.reduce(reduceToSum, 0); } sum(1,2,3); 
Alternatif kata kunci 
arguments adalah sintaks baru untuk parameter yang tersisa. Dalam contoh berikut, 
args adalah array yang berisi segala sesuatu yang diteruskan ke fungsi saat dipanggil.
 function sum(...args){ return args.reduce(reduceToSum, 0); } 
ReturnOperator kembali
Fungsi yang tidak memiliki 
return pengembalian akan kembali 
undefined . Menggunakan kata kunci 
return , perhatikan bagaimana mekanisme penyisipan titik koma otomatis bekerja. Misalnya, fungsi berikut tidak akan mengembalikan objek kosong, tetapi nilai yang 
undefined :
 function getObject(){ return { } } getObject() 
Untuk menghindari masalah yang sama, braket keriting pembuka harus ditempatkan pada baris yang sama dengan 
return :
 function getObject(){ return { } } 
Pengetikan dinamis
JavaScript adalah bahasa pengetikan yang dinamis. Ini berarti bahwa nilai spesifik memiliki tipe, tetapi variabel tidak. Selama eksekusi program, nilai dari tipe yang berbeda dapat ditulis ke variabel yang sama. Berikut adalah contoh fungsi yang bekerja dengan nilai dari berbagai jenis:
 function log(value){ console.log(value); } log(1); log("text"); log({message : "text"}); 
Untuk mengetahui tipe data yang disimpan dalam variabel, Anda dapat menggunakan operator 
typeof() :
 let n = 1; typeof(n);   //number let s = "text"; typeof(s);   //string let fn = function() {}; typeof(fn);  //function 
Model eksekusi single-threaded
JavaScript runtime adalah single-threaded. Ini, khususnya, dinyatakan dalam ketidakmungkinan mengeksekusi dua fungsi secara bersamaan (jika Anda tidak memperhitungkan kemungkinan eksekusi kode asinkron, yang tidak kami sentuh di sini). Runtime memiliki yang disebut Peristiwa Antrian, yang menyimpan daftar tugas yang perlu diproses. Akibatnya, masalah kunci sumber daya bersama tidak khas untuk skema eksekusi JS tunggal, oleh karena itu, mekanisme kunci tidak diperlukan di sini. Namun, kode yang termasuk dalam antrian acara harus dijalankan dengan cepat. Jika Anda kelebihan beban dengan pekerjaan berat, di aplikasi browser, utas utama, halaman aplikasi tidak akan menanggapi tindakan pengguna dan browser akan menawarkan untuk menutup halaman ini.
Penanganan pengecualian
JavaScript memiliki mekanisme untuk menangani pengecualian. Ini bekerja sesuai dengan prinsip yang cukup umum untuk mekanisme seperti itu: kode yang dapat menyebabkan kesalahan dieksekusi menggunakan 
try/catch konstruk. Kode itu sendiri ada di blok 
try , kesalahan diproses di 
catch .
Sangat menarik untuk dicatat bahwa kadang-kadang JavaScript, dalam keadaan darurat, tidak menghasilkan pesan kesalahan. Hal ini disebabkan oleh fakta bahwa JS tidak melakukan kesalahan hingga adopsi standar ECMAScript 3.
Misalnya, dalam fragmen kode berikut, upaya untuk mengubah objek "beku" akan gagal, tetapi pengecualian tidak akan dibuang.
 let obj = Object.freeze({}); obj.message = "text"; 
Beberapa kesalahan JS "sunyi" muncul dalam mode ketat, Anda dapat mengaktifkannya menggunakan konstruksi 
"use strict"; .
Sistem prototipe
Dasar dari mekanisme JS seperti fungsi konstruktor, perintah 
Object.create() , kata kunci 
class , didasarkan pada sistem prototipe.
Perhatikan contoh berikut:
 let service = { doSomething : function() {} } let specializedService = Object.create(service); console.log(specializedService.__proto__ === service);  
Di sini, untuk membuat objek 
Object.create() , prototipe di antaranya adalah untuk membuat objek 
service , perintah 
Object.create() digunakan. Akibatnya, ternyata metode 
doSomething() dapat dipanggil dengan mengakses objek specialService. Selain itu, ini berarti bahwa properti 
__proto__ dari objek 
__proto__ menunjuk ke objek 
service .
Sekarang buat objek serupa menggunakan kata kunci 
class :
 class Service { doSomething(){} } class SpecializedService extends Service { } let specializedService = new SpecializedService(); console.log(specializedService.__proto__ === SpecializedService.prototype); 
Metode yang dideklarasikan di kelas 
Service akan ditambahkan ke objek 
Service.prototype . Contoh kelas 
Service akan memiliki prototipe yang sama ( 
Service.prototype ). Semua contoh akan mendelegasikan panggilan metode ke objek 
Service.prototype . Akibatnya, ternyata metode hanya dideklarasikan sekali saja, di 
Service.prototype , setelah itu mereka "diwarisi" oleh semua instance kelas.
β Rantai Prototipe
Objek bisa menjadi "pewaris" objek lain. Setiap objek memiliki prototipe, metode yang tersedia untuknya. Jika Anda mencoba mengakses properti yang tidak ada dalam objek itu sendiri, JavaScript akan mulai mencarinya di rantai prototipe. Proses ini akan berlanjut sampai properti ditemukan, atau sampai pencarian mencapai akhir rantai.
Tentang pemrograman fungsional dalam JavaScript
Dalam JavaScript, fungsi adalah objek kelas satu, bahasa mendukung mekanisme penutupan. Ini membuka jalan untuk menerapkan teknik pemrograman fungsional di JS. Secara khusus, kita berbicara tentang kemungkinan menggunakan fungsi tingkat tinggi.
Penutupan adalah fungsi internal yang memiliki akses ke variabel yang dideklarasikan di dalam fungsi induk, bahkan setelah fungsi induk dijalankan.
Fungsi tingkat tinggi adalah fungsi yang dapat mengambil fungsi lain sebagai argumen, mengembalikan fungsi, atau melakukan keduanya.
Pemrograman fungsional dalam JS dicakup dalam banyak publikasi. Jika Anda tertarik, berikut adalah beberapa bahan pada topik ini yang ditujukan 
untuk fungsi , 
komposisi , 
dekorator , 
penutup, dan 
keterbacaan kode kelas satu yang ditulis dalam gaya fungsional.
Ringkasan
Kekuatan JavaScript terletak pada kesederhanaannya. Memahami mekanisme dasar bahasa memungkinkan pemrogram menggunakan JS untuk lebih efektif menerapkan mekanisme ini dan meletakkan dasar untuk pertumbuhan profesionalnya.
Pembaca yang budiman! Menurut Anda, fitur apa yang dimiliki sebagian besar pemula?
