Tiga cara menulis string
JavaScript memberimu tiga pembatas string. Dua di antaranya bisa saling menggantikan; yang ketiga bisa lebih banyak.
Tanda kutip tunggal dan ganda menghasilkan string yang identik: pilih salah satu dan konsisten (kebanyakan codebase modern memakai tanda kutip tunggal sebagai default atau membiarkan formatter yang memutuskan). Backtick menghasilkan template literal, dan di sinilah hal menarik dimulai: ia mendukung interpolasi dan bisa membentang beberapa baris.
Di balik layar, ketiganya menghasilkan tipe string primitif yang sama. Pembatasnya hanya pilihan sintaks.
Escape sequence dan tanda kutip di dalam string
Di dalam string, backslash memulai escape sequence. Yang umum adalah \n (baris baru), \t (tab), \\ (backslash harfiah), dan \" / \' untuk menyisipkan tanda kutip yang sama dengan pembukanya:
Kamu bisa menghindari sebagian besar escape dengan memakai gaya tanda kutip yang lain: 'She said "hi" and left.' tidak butuh backslash. Pragmatis, bukan dogmatis.
Template literal: kekuatan super backtick
Template literal melakukan dua hal yang tidak bisa dilakukan string biasa. Pertama, ia menyisipkan ekspresi dengan ${...}:
Apa pun di dalam ${...} adalah ekspresi JavaScript, bukan sekadar nama variabel. Aritmetika, pemanggilan fungsi, ternary, bahkan template literal lain, semuanya boleh:
Kedua, template literal bisa membentang beberapa baris tanpa perlu \n:
Baris baru di kode sumber menjadi baris baru di string. Untuk apa pun yang lebih panjang dari label singkat, backtick hampir selalu pilihan yang tepat.
Interpolasi lebih baik daripada concatenation
Sebelum ada template literal, satu-satunya cara menyusun string dinamis adalah operator +:
Keduanya menghasilkan output yang identik. Template literal terbaca seperti kalimat yang sedang disusunnya, sedangkan versi + memaksamu melacak tanda kutip, spasi, dan operator penyambung. Pakai + hanya saat kamu menambahkan satu hal kecil ke string yang sudah ada. Untuk yang lebih panjang, pakai backtick.
String tidak bisa diubah
Setiap method yang terlihat mengubah string sebenarnya mengembalikan string baru:
Kalau kamu ingin perubahannya, kamu harus menyimpan hasilnya di suatu tempat. Ini menjebak pemula yang menulis s.replace("a", "b") dan berharap s berubah. Tidak akan. String di JavaScript seperti angka: nilainya sendiri tidak bisa diubah, hanya variabelnya yang bisa diarahkan ke nilai baru.
Method string yang benar-benar akan kamu pakai
API string lengkapnya besar. Segelintir yang akan kamu pakai setiap hari:
Beberapa catatan yang perlu diingat:
lengthadalah property, bukan method, jadi tanpa tanda kurung.replacedengan string biasa hanya mengganti kecocokan pertama. PakaireplaceAllatau regex dengan flagguntuk mengganti semua kemunculan.slice(start, end)menerima rentang setengah terbuka: karakter di posisiendtidak ikut.- Indeks negatif pada
slicedihitung dari belakang:s.slice(-3)memberi tiga karakter terakhir.
Indeks dan perulangan karakter
String berperilaku seperti array karakter yang hanya bisa dibaca. Kamu bisa mengakses indeksnya dan menelusurinya, tapi tidak bisa melakukan assignment ke sebuah posisi:
for...of menelusuri code point, yang menangani sebagian besar Unicode dengan benar. Memakai indeks (s[i]) menelusuri code unit UTF-16, yang bisa membelah emoji dan karakter non-BMP lain menjadi dua. Untuk teks biasa, keduanya tidak masalah; untuk apa pun yang dibuat pengguna, utamakan for...of atau [...s].
Tagged template literal
Ada satu bentuk lagi yang perlu kamu tahu, walaupun jarang kamu tulis sendiri. Template literal bertag memanggil sebuah fungsi dengan potongan string statis dan nilai yang disisipkan sebagai argumen terpisah:
Fungsi tag-nya yang menentukan seperti apa string akhirnya: ia bisa meng-escape HTML, menyusun SQL dengan aman, meng-compile CSS, atau mem-parse GraphQL. Kamu akan jauh lebih sering melihat pola ini di library (styled-components, graphql-tag, lit-html) daripada menulisnya sendiri. Tapi saat kamu memang butuh pemrosesan string khusus, tag adalah alat paling rapi untuk tugas itu.
Kesalahan umum
Daftar singkat hal yang sering menjebak orang:
- Lupa menyimpan hasil method.
s.trim()tidak melakukan apa-apa kalau berdiri sendiri. - Memakai
+untuk menyambung angka dan string."Age: " + 30 + 5hasilnya"Age: 305", bukan"Age: 35". Template literal menghindari masalah ini:`Age: ${30 + 5}`. - Mencampuradukkan
==dan perbandingan string. Kita akan membahas kesetaraan dengan lengkap nanti, tapi"1" == 1bernilaitruedan"1" === 1bernilaifalse. Utamakan===. - Mengira
lengthsama dengan jumlah karakter. Untuk emoji dan karakter surrogate pair lainnya,"🙂".lengthbernilai 2, bukan 1. Pakai[..."🙂"].lengthatauArray.from(s).lengthsaat kamu butuh jumlah karakter seperti yang dilihat pengguna.
Berikutnya: number dan BigInt
String adalah satu tipe primitif; number adalah tipe lainnya, dan sistem angka JavaScript punya keanehannya sendiri: satu tipe Number untuk bilangan bulat dan desimal, ditambah BigInt untuk saat itu tidak cukup. Itulah halaman berikutnya.
Pertanyaan yang sering diajukan
Apa bedanya tanda kutip dan backtick di JavaScript?
Tanda kutip tunggal (') dan ganda (") sama-sama membuat string biasa dan bisa saling menggantikan. Backtick (`) membuat template literal, yang mendukung interpolasi dengan ${...} dan bisa membentang beberapa baris tanpa karakter escape. Pakai backtick setiap kali kamu menyisipkan variabel atau menulis teks di beberapa baris.
Bagaimana cara memasukkan variabel ke dalam string di JavaScript?
Pakai template literal: bungkus string dengan backtick dan taruh ekspresinya di dalam ${...}. Misalnya, `Hello, ${name}!` mengevaluasi name lalu menyisipkan hasilnya. Kamu bisa menaruh ekspresi apa pun di dalamnya: ${a + b}, ${user.name.toUpperCase()}, bahkan template literal bersarang.
Apakah string di JavaScript immutable?
Ya. Setiap method string (toUpperCase, slice, replace, dan seterusnya) mengembalikan string baru alih-alih mengubah yang asli. Kalau kamu menulis s.toUpperCase() dan tidak menyimpan hasilnya ke mana pun, tidak ada yang berubah. Modelnya sama seperti string di Python atau Java.
Apa itu tagged template literal?
Tagged template literal memanggil sebuah fungsi dengan potongan string dari template dan nilai-nilai yang disisipkan sebagai argumen terpisah: tag`Hello, ${name}` memanggil tag(["Hello, ", ""], name). Library seperti styled-components dan graphql-tag memakai tag untuk mem-parse atau mengubah template sebelum menghasilkan nilai akhirnya.