JavaScript sering disebut bahasa paling sederhana untuk pemula, dalam pemrograman yang merupakan yang paling sulit untuk dicapai penguasaannya. Penulis materi, terjemahan yang kami terbitkan, mengatakan bahwa ia tidak bisa tidak setuju dengan pernyataan ini. Masalahnya adalah bahwa JS adalah bahasa yang sangat tua dan sangat fleksibel. Ini penuh dengan konstruksi sintaksis misterius dan fitur usang yang masih didukungnya.

Hari ini kita akan berbicara tentang fitur dan opsi JavaScript yang kurang dikenal untuk aplikasi praktisnya.
JavaScript selalu merupakan sesuatu yang baru
Saya telah bekerja dengan JavaScript selama bertahun-tahun dan saya terus-menerus menemukan sesuatu yang tidak pernah saya duga ada. Di sini saya mencoba untuk membuat daftar fitur-fitur bahasa yang kurang dikenal yang serupa. Dalam mode ketat, beberapa dari mereka tidak akan bekerja, tetapi dalam mode normal mereka benar-benar contoh kode JS. Perlu dicatat bahwa saya tidak menyarankan untuk menyarankan pembaca untuk mengambil semua ini ke dalam layanan. Meskipun apa yang akan saya bicarakan tampaknya sangat menarik bagi Anda, Anda dapat mulai menggunakan semua ini jika Anda bekerja dalam tim dan, secara sederhana, mengejutkan rekan kerja Anda.
→ Kode yang akan kita bahas di
sini dapat ditemukan di
sini.Harap dicatat bahwa saya tidak memasukkan hal-hal seperti meningkatkan variabel, penutupan, objek proxy, pewarisan prototipe, async / menunggu, generator, dan sejenisnya. Meskipun fitur-fitur bahasa ini dapat dikaitkan dengan sulit untuk dipahami, mereka tidak dikenal.
Operator batal
JavaScript memiliki operator
void
unary. Anda mungkin menemukan itu dalam bentuk
void(0)
atau
void 0
. Satu-satunya tujuan adalah untuk menghitung ekspresi ke kanan dan mengembalikan yang
undefined
.
0
sini digunakan hanya karena itu adalah kebiasaan, meskipun ini tidak perlu, dan di sini Anda dapat menggunakan ekspresi yang valid. Benar, operator ini bagaimanapun akan kembali
undefined
.
Mengapa menambahkan kata kunci khusus ke bahasa yang berfungsi mengembalikan
undefined
, jika Anda bisa menggunakan nilai standar
undefined
? Bukan, ada redundansi?
Ternyata, sebelum munculnya standar ES5 di sebagian besar browser, nilai standar
undefined
dapat diberi nilai baru. Katakanlah Anda berhasil menjalankan perintah ini:
undefined = "abc"
. Akibatnya, nilai yang
undefined
mungkin tidak seperti yang seharusnya. Pada masa itu, penggunaan
void
memungkinkan kami untuk memastikan kepercayaan dalam penggunaan yang sebenarnya
undefined
.
Kurung saat memanggil konstruktor adalah opsional
Tanda kurung yang ditambahkan setelah nama kelas, memanggil konstruktor, sepenuhnya opsional (kecuali konstruktor perlu memberikan argumen).
Dalam contoh berikut, ada atau tidaknya tanda kurung tidak memengaruhi operasi program yang benar.
Kurung tidak dapat digunakan dengan IIFE
Sintaks IIFE selalu tampak aneh bagi saya. Mengapa ada semua tanda kurung ini?
Ternyata, tanda kurung hanya diperlukan untuk memberi tahu parser JavaScript bahwa beberapa kode adalah ekspresi fungsional, dan bukan upaya yang salah untuk mendeklarasikan fungsi. Mengetahui fakta ini memungkinkan kita untuk memahami bahwa ada banyak cara untuk menyingkirkan tanda kurung di mana IIFE terlampir, dan pada saat yang sama menulis kode kerja.
Di sini, operator
void
memberi tahu parser bahwa kode yang mengikutinya adalah ekspresi fungsional. Ini memungkinkan untuk menyingkirkan tanda kurung di sekitar deklarasi fungsi. Dan omong-omong, di sini Anda dapat menggunakan operator unary (
void
,
+
,
!
,
-
, dan sebagainya), dan kodenya akan tetap berfungsi. Bukankah itu luar biasa?
Namun, jika Anda seorang pembaca yang penuh perhatian, maka Anda mungkin bertanya-tanya bahwa operator yang tidak waspada mempengaruhi hasil yang dikembalikan dari IIFE. Padahal, apa adanya. Tetapi hal baiknya adalah jika Anda membutuhkan hasil IIFE, yang Anda, misalnya, simpan dalam variabel, maka Anda tidak perlu tanda kurung di sekitar IIFE. Berikut ini sebuah contoh.
Kawat gigi di sekitar IIFE pertama hanya meningkatkan keterbacaan kode tanpa mempengaruhi operasinya.
Jika Anda ingin lebih memahami IIFE, lihat materi
ini .
Konstruksi dengan
Tahukah Anda bahwa JavaScript memiliki konstruk yang mendukung blok ekspresi? Ini terlihat seperti ini:
with (object) statement
Konstruk
with
menambahkan semua properti objek yang diteruskan ke dalamnya dalam rantai lingkup yang digunakan saat menjalankan perintah.
with
mungkin tampak seperti alat yang hebat. Sepertinya ini bahkan lebih baik daripada fitur baru JS untuk
penghancuran objek , tetapi kenyataannya tidak.
Konstruksi
with
sudah usang dan tidak direkomendasikan untuk digunakan. Dalam mode ketat, penggunaannya dilarang. Ternyata
with
blok menyebabkan masalah kinerja dan keamanan.
Konstruktor fungsi
Menggunakan kata kunci
function
bukan satu-satunya cara untuk mendefinisikan fungsi baru. Anda dapat menetapkan fungsi secara dinamis menggunakan
Function
constructor dan operator
new
. Ini tampilannya.
Argumen terakhir yang diteruskan ke konstruktor adalah string dengan kode fungsi. Dua argumen lain adalah parameter fungsi.
Sangat menarik untuk dicatat bahwa
Function
constructor adalah "induk" dari semua konstruktor dalam JavaScript. Bahkan konstruktor
Object
adalah Konstruktor
Function
. Dan konstruktor
Function
asli juga
Function
. Akibatnya, panggilan dari objek
object.constructor.constructor...
dibuat untuk objek JS apa pun dalam jumlah yang cukup akan mengembalikan
Function
constructor sebagai hasilnya.
Properti Fitur
Kita semua tahu bahwa fungsi dalam JavaScript adalah objek kelas satu. Karena itu, tidak ada yang menghentikan kita dari menambahkan properti baru ke fungsi. Ini sangat normal, tetapi ini jarang digunakan.
Kapan ini dibutuhkan?
Bahkan, ada beberapa situasi di mana kemampuan fitur ini mungkin berguna. Pertimbangkan mereka.
▍ Fitur Kustom
Misalkan kita memiliki fungsi
greet()
. Kami membutuhkannya untuk menampilkan pesan sambutan yang berbeda tergantung pada pengaturan regional yang digunakan. Pengaturan ini dapat disimpan dalam variabel eksternal ke fungsi. Selain itu, fungsi tersebut mungkin memiliki properti yang mendefinisikan pengaturan ini, khususnya, pengaturan bahasa pengguna. Kami akan menggunakan pendekatan kedua.
▍Fungsi dengan variabel statis
Berikut adalah contoh serupa lainnya. Misalkan kita perlu mengimplementasikan generator tertentu yang menghasilkan urutan nomor yang dipesan. Biasanya dalam situasi seperti itu, untuk menyimpan informasi tentang nomor yang dihasilkan terakhir, variabel penghitung statis di kelas atau IIFE digunakan. Dengan pendekatan ini, kami membatasi akses ke konter dan mencegah polusi ruang lingkup global dengan variabel tambahan.
Tetapi bagaimana jika kita membutuhkan fleksibilitas, jika kita perlu membaca atau bahkan memodifikasi nilai penghitung seperti itu dan tidak menyumbat ruang lingkup global?
Tentu saja, Anda bisa membuat kelas dengan variabel yang sesuai dan dengan metode yang memungkinkan Anda untuk bekerja dengannya. Atau Anda tidak dapat repot-repot dengan hal-hal seperti itu dan hanya menggunakan properti fungsi.
Properti objek argumen
Saya yakin sebagian besar dari Anda tahu bahwa fungsi memiliki objek
arguments
. Ini adalah objek mirip array yang dapat diakses dalam semua fungsi (dengan pengecualian fungsi panah, yang tidak memiliki objek
arguments
sendiri). Ini berisi daftar argumen yang diteruskan ke fungsi saat dipanggil. Selain itu, ia memiliki beberapa properti menarik:
arguments.callee
berisi tautan ke fungsi saat ini.arguments.caller
berisi referensi ke fungsi yang disebut fungsi saat ini.
Pertimbangkan sebuah contoh.
Standar ES5 melarang penggunaan properti
callee
dan
caller
dalam mode ketat, tetapi mereka masih banyak ditemukan di banyak teks program yang dikompilasi JavaScript, misalnya, di perpustakaan. Karena itu, berguna untuk mengetahui tentang mereka.
Literal Templat Tagged
Tentunya Anda, jika Anda ada hubungannya dengan pemrograman JavaScript, telah mendengar tentang
templat literal . Templat literal adalah salah satu dari banyak inovasi hebat dari standar ES6. Namun, apakah Anda tahu tentang literal templat yang ditandai?
Literal templat yang ditandai memungkinkan pengembang untuk mengontrol bagaimana literal templat berubah menjadi string. Ini dilakukan dengan menggunakan tag khusus. Tag hanyalah nama fungsi pengurai yang menerima larik string dan nilai yang ditafsirkan oleh pola string. Saat menggunakan fungsi tag, diharapkan akan mengembalikan string yang sudah selesai.
Dalam contoh berikut, tag kami,
highlight
, menginterpretasikan data dari templat literal dan menyematkan data ini dalam baris yang sudah jadi, menempatkannya dalam tag
<mark>
HTML untuk memilihnya ketika teks tersebut ditampilkan pada halaman web.
Cara menarik untuk menggunakan fitur ini dapat ditemukan di banyak perpustakaan. Berikut ini beberapa contohnya:
- komponen gaya - untuk digunakan dalam aplikasi Bereaksi.
- es2015-i18n-tag - untuk terjemahan dan internasionalisasi proyek.
- chalk - untuk menampilkan pesan multi-warna ke konsol.
Getters and Setters di ES5
Objek JavaScript, sebagian besar, cukup sederhana. Misalkan kita memiliki objek
user
, dan kami mencoba mengakses properti
age
menggunakan konstruk
user.age
. Dengan pendekatan ini, jika properti ini didefinisikan, kami akan mendapatkan nilainya, dan jika tidak didefinisikan, kami akan
undefined
. Semuanya sangat sederhana.
Tetapi bekerja dengan properti tidak harus begitu primitif sama sekali. Objek JS menerapkan konsep getter dan setter. Alih-alih langsung mengembalikan nilai beberapa properti objek, kita dapat menulis fungsi pengambil kita sendiri, yang mengembalikan apa yang kita anggap perlu. Hal yang sama berlaku untuk menulis nilai baru ke properti menggunakan fungsi setter.
Getters dan setter memungkinkan Anda untuk menerapkan skema canggih untuk bekerja dengan properti. Saat membaca atau menulis properti, Anda dapat menggunakan konsep bidang virtual, Anda dapat memeriksa nilai-nilai bidang, dan ketika menulis atau membaca, beberapa efek samping yang bermanfaat dapat terjadi.
Getters dan setter bukan inovasi standar ES5. Mereka selalu hadir dalam bahasa tersebut. Dalam ES5, hanya alat sintaks yang nyaman telah ditambahkan untuk bekerja dengannya. Detail tentang getter dan setter dapat ditemukan di
sini .
Contoh penggunaan getter termasuk pustaka Node.js
Colors yang populer.
Pustaka ini
memperluas kelas String dan menambahkan banyak metode pengambil untuk itu. Ini memungkinkan Anda untuk mengkonversi string ke versi “berwarna” sehingga string ini kemudian dapat digunakan untuk logging. Ini dilakukan dengan bekerja dengan
properti string.
Operator koma
JS memiliki operator koma. Ini memungkinkan Anda untuk menulis beberapa ekspresi dalam satu baris, dipisahkan oleh koma, dan mengembalikan hasil evaluasi dari ekspresi terakhir. Seperti apa desainnya.
let result = expression1, expression2,... expressionN
Di sini, nilai semua ekspresi akan dihitung, setelah itu nilai ekspresiN akan masuk ke dalam variabel
result
.
Ada kemungkinan bahwa Anda telah menggunakan operator koma
for
loop.
for (var a = 0, b = 10; a <= 10; a++, b--)
Terkadang operator ini sangat berguna ketika Anda perlu menulis banyak ekspresi pada baris yang sama.
function getNextValue() { return counter++, console.log(counter), counter }
Ini bisa berguna saat mendesain fungsi panah kecil.
const getSquare = x => (console.log (x), x * x)
Operator plus
Jika Anda perlu dengan cepat mengubah string menjadi angka, operator plus berguna bagi Anda. Dia mampu bekerja dengan berbagai angka, dan tidak hanya, sepertinya, dengan yang positif. Kita berbicara tentang angka negatif, oktal, heksadesimal, dan angka dalam notasi eksponensial. Selain itu, ia dapat mengubah objek
Date
dan objek perpustakaan Moment.js menjadi cap waktu.
Tanda seru ganda
Perlu dicatat bahwa apa yang kadang-kadang disebut "operator tanda seru ganda" (Bang Bang atau Double Bang) sebenarnya bukan operator. Ini adalah operator NOT logis, atau operator negasi logis yang terlihat seperti tanda seru diulang dua kali. Titik seru ganda baik karena memungkinkan Anda untuk mengubah ekspresi apa pun menjadi nilai boolean. Jika ekspresi, dari sudut pandang JS, benar - setelah memprosesnya dengan tanda seru ganda,
true
akan dikembalikan. Jika tidak,
false
akan dikembalikan.
Operator negasi bitwise
Mari kita hadapi itu: tidak ada yang peduli dengan operator bitwise. Saya tidak berbicara tentang menggunakannya. Namun, operator negasi bitwise dapat digunakan dalam banyak situasi.
Ketika operator ini diterapkan ke angka, itu mengubahnya sebagai berikut: dari nomor
N
ternyata
-(N+1)
. Ungkapan seperti itu memberi
0
jika
N
adalah
-1
.
Fitur ini dapat digunakan dengan metode
indexOf()
ketika digunakan untuk memeriksa keberadaan elemen dalam array atau string, karena metode ini, tidak menemukan elemen, mengembalikan
-1
.
Perlu dicatat bahwa dalam standar ES6 dan ES7, masing-masing, untuk string dan array, metode
includes()
telah muncul. Jelas jauh lebih nyaman untuk menentukan keberadaan elemen daripada menggunakan operator negasi bitwise dan
indexOf()
.
Blok bernama
JavaScript memiliki konsep label, yang dengannya Anda dapat menetapkan nama (label) ke loop. Anda kemudian dapat menggunakan label ini untuk merujuk ke loop yang sesuai saat menerapkan pernyataan
break
atau
continue
. Label juga dapat ditugaskan untuk blok kode biasa.
Loop berlabel berguna saat bekerja dengan loop bersarang. Tetapi mereka juga dapat digunakan untuk mengatur kode dengan mudah di blok atau saat membuat blok di mana kode dapat terputus.
Perhatikan bahwa, tidak seperti beberapa bahasa lain, tidak ada
goto
di JS. Akibatnya, label hanya digunakan dengan pernyataan
break
dan
continue
.
Ringkasan
Pada artikel ini, kita berbicara tentang fitur JavaScript yang kurang dikenal, pengetahuan yang berguna bagi setiap programmer JS, setidaknya untuk siap untuk memenuhi sesuatu yang tidak biasa dalam kode orang lain. Jika topik "JS tidak dikenal" menarik bagi Anda, Anda dapat melihat publikasi kami ini.
Pembaca yang budiman! Jika Anda tahu tentang beberapa fitur JS yang tidak banyak diketahui dan melihat opsi untuk aplikasi praktisnya, silakan beri tahu kami.
