Section Arrays pernah menyinggung dua method pencarian yang mirip: indexOf dan includes. Keduanya mencari nilai dalam array, tetapi halaman MDN keduanya memakai istilah yang berbeda — yang satu menyebut strict equality, yang lain menyebut algoritme SameValueZero. Dua nama itu bukan gaya penulisan. Keduanya adalah nama algoritme yang didefinisikan di dokumen tertinggi bahasa JavaScript: spesifikasi ECMA-262.
Chapter ini memperkenalkan posisi dokumen tersebut, struktur dan istilah dasarnya, serta cara melacak algoritme yang dirujuk MDN. Targetnya bukan membaca spec dari sampul ke sampul, melainkan mampu membuka satu bagian tertentu dan memahaminya saat pertanyaan “kenapa” tidak terjawab di halaman biasa.
Satu Dokumen di Atas Semua Implementasi #
Bahasa JavaScript punya satu dokumen spesifikasi resmi: ECMA-262, disusun oleh komite TC39 di dalam organisasi standar Ecma International. Alamat resminya https://tc39.es/ecma262/ — halaman itu selalu menampilkan draf terbaru yang diperbarui terus-menerus, sedangkan edisi resmi terbit setiap tahun (ES2015, ES2020, ES2025, dan seterusnya).
Alur kebenarannya berlapis dan berurutan:
- TC39 menyetujui fitur dan isinya.
- ECMA-262 mendefinisikan perilaku fitur tersebut secara presisi.
- Engine mengimplementasikan spec — V8 untuk Node.js dan Chrome, SpiderMonkey untuk Firefox, JavaScriptCore untuk Safari.
- MDN mendokumentasikan perilaku itu dengan bahasa yang ramah pembaca.
Bila perilaku engine dan isi MDN tampak bertentangan, dokumen yang menentukan adalah ECMA-262. Dalam praktik, konflik seperti itu jarang terjadi: MDN dan engine bergerak dari dokumen yang sama, sehingga keduanya biasanya bersepakat.
Draf spesifikasi di alamat tersebut bisa dibaca dalam dua tata letak: multipage — satu bagian per halaman, paling nyaman untuk dibaca terpilih — dan singlepage, satu berkas panjang yang cocok untuk pencarian teks dengan Ctrl+F. Isinya identik; pilih yang sesuai cara kerja saat itu.
Membaca Spec Seperti Kamus Hukum #
Spec ditulis untuk mesin dan perancang bahasa, bukan untuk pembaca santai. Untungnya, ia tidak perlu dibaca menyeluruh. Beberapa bagian yang perlu dikenali namanya:
- Notational Conventions — aturan membaca algoritme spec, termasuk tanda singkat di depan pemanggilan operasi. Cukup diketahui ada; tidak perlu dihafal.
- Abstract Operations — kumpulan function internal spec yang dipakai banyak algoritme.
SameValueZerodanIsStrictlyEqualtinggal di bagian ini. - ECMAScript Language Types and Objects — definisi tipe nilai dan apa itu object menurut spec.
- Bagian-bagian selanjutnya — tata bahasa dan perilaku tiap konstruksi; method bawaan seperti
Array.prototype.includesditulis sebagai algoritme bernomor di bagiannya masing-masing.
Istilah dasar yang paling sering muncul bisa dirangkum dalam satu tabel:
| Istilah | Arti di spec | Contoh |
|---|---|---|
| object | kumpulan properti yang dikelola lewat internal method | array, function, { judul: "Panduan Git" } |
| property key | penanda properti, berupa string atau symbol | "judul", Symbol.iterator |
| internal method | mekanisme internal object yang dipanggil engine, ditulis [[...]] | [[Get]] saat properti dibaca, [[Call]] saat function dipanggil |
| abstract operation | function internal spesifikasi yang dipanggil algoritme lain | SameValueZero, IsStrictlyEqual |
Algoritme di spec tersusun sebagai langkah bernomor yang tidak menyisakan ruang tafsir — itulah alasan dua engine yang benar dapat menghasilkan perilaku identik. Halaman Array.prototype.includes di spec, misalnya, berjalan langkah demi langkah dan di tengahnya memanggil SameValueZero untuk membandingkan elemen.
Melacak Dua Algoritme Pencarian Array #
Sekarang kita praktikkan pola di atas pada pertanyaan yang membuka chapter ini. Urutannya empat langkah.
Pertama, permasalahannya: dua method serupa berbeda perilaku terhadap NaN, dan halaman MDN keduanya merujuk istilah yang belum kita pahami. Kedua, mekanisme di baliknya: lewat bagian Specifications halaman Array.prototype.indexOf, kita tiba di algoritme spec yang membandingkan elemen dengan IsStrictlyEqual; halaman Array.prototype.includes mengarah ke algoritme yang memakai SameValueZero. Kedua operasi itu identik untuk nilai biasa dan berbeda dalam satu hal: SameValueZero memperlakukan NaN sama dengan NaN, sedangkan IsStrictlyEqual menolaknya — NaN tidak sama dengan apa pun, termasuk dirinya sendiri.
Ketiga, bukti dalam kode:
// uji-samevaluezero.js — dua algoritme pencarian yang disebut spec ECMA-262
// Jalankan di terminal: node uji-samevaluezero.js
const suhu = [22, 29, NaN, 31];
// indexOf memakai IsStrictlyEqual: NaN tidak pernah sama dengan NaN.
console.log(suhu.indexOf(NaN));
// includes memakai SameValueZero: NaN dianggap sama dengan NaN.
console.log(suhu.includes(NaN));
// Untuk nilai biasa, keduanya menjawab konsisten.
console.log(suhu.indexOf(29), suhu.includes(29));Output yang Dihasilkan:
-1
true
1 trueKeempat, bedah baris-per-barisnya:
- Baris 7 (
suhu.indexOf(NaN)):IsStrictlyEqual(NaN, NaN)bernilaifalsemenurut definisi di spec. Karena itu pencarian gagal dan hasilnya-1, tanda tidak ditemukan. - Baris 10 (
suhu.includes(NaN)):SameValueZeromenganggapNaNsama denganNaN, sehingga elemen ketiga ditemukan dan hasilnyatrue. - Baris 13 (
suhu.indexOf(29), suhu.includes(29)): untuk nilai biasa, kedua algoritme menjawab konsisten —1dantrue. Perbedaan keduanya hanya terlihat padaNaN.
Pesan bab ini bukan “hafalkan dua algoritme itu”. Pesannya: istilah di halaman MDN punya alamat, dan begitu kita terbiasa melacaknya, pertanyaan “kenapa” tingkat bahasa tidak lagi buntu.
TC39 dan Tahapan Proposal #
Fitur baru tidak langsung menjadi bagian bahasa. Setiap usulan melewati proses proposal TC39 dengan lima tahap:
| Stage | Nama | Arti praktisnya |
|---|---|---|
| 0 | Strawman | Gagasan awal; boleh berubah total atau berhenti |
| 1 | Proposal | Kasus pemakaian dan bentuk awal disusun |
| 2 | Draft | Spesifikasi awal ditulis; eksperimen di engine mulai |
| 3 | Candidate | Bentuk hampir final; menunggu umpan balik implementasi |
| 4 | Finished | Teruji di implementasi nyata; masuk draf edisi tahunan |
Daftar semua proposal beserta stagenya dipublikasikan di https://github.com/tc39/proposals — halaman itu adalah peta tercepat untuk mengetahui ke mana bahasa sedang bergerak. Proyek kita beruntung: Node 24 di lingkungan course ini sudah menjalankan fitur ES2025 yang disetujui pada 2025.
Spec memberikan jaminan di atas kertas. Kenyataan di lapangan lebih beragam: engine berbeda, versi berbeda, dan pengguna tidak semuanya memperbarui aplikasinya. Chapter berikutnya membahas cara memeriksa dukungan fitur sebelum kode itu benar-benar dipakai.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
uji-samevaluezero.js
Unduh berkas// uji-samevaluezero.js — dua algoritme pencarian yang disebut spec ECMA-262
// Jalankan di terminal: node uji-samevaluezero.js
const suhu = [22, 29, NaN, 31];
// indexOf memakai IsStrictlyEqual: NaN tidak pernah sama dengan NaN.
console.log(suhu.indexOf(NaN));
// includes memakai SameValueZero: NaN dianggap sama dengan NaN.
console.log(suhu.includes(NaN));
// Untuk nilai biasa, keduanya menjawab konsisten.
console.log(suhu.indexOf(29), suhu.includes(29));