ES6 JavaScript: Fitur Baru yang Wajib Dikuasai

Created at by Aris Munandar

JavaScript telah berkembang jauh dari sekadar bahasa pemrograman yang hanya digunakan untuk membuat elemen halaman web bergerak atau menampilkan alert sederhana. Dalam satu dekade terakhir, JavaScript berubah menjadi bahasa dengan ekosistem besar, digunakan di berbagai lingkungan — dari front-end, back-end, mobile development, hingga desktop app. Transformasi besar ini tidak terjadi begitu saja, melainkan melalui pembaruan standar ECMAScript yang membawa fitur modern, efisien, dan mudah digunakan. Salah satu revolusi terbesar dalam sejarah JavaScript adalah hadirnya ES6 (ECMAScript 2015).

Sebelum ES6 hadir, JavaScript memiliki banyak keterbatasan. Developer harus mengandalkan pola manual seperti function constructor, callback berlapis-lapis, string concatenation yang membingungkan, serta struktur kode yang sulit dikelola dalam skala besar. Kondisi ini menyebabkan JavaScript rentan terhadap bug, sulit di-maintain, dan tidak cocok untuk proyek besar.

Transisi menuju JavaScript modern sebenarnya sudah lama dibutuhkan. Penggunaan JavaScript semakin luas, tidak hanya untuk website sederhana, tetapi juga aplikasi kompleks yang membutuhkan struktur rapi dan fitur lebih canggih. Di sinilah ES6 menjadi angin segar yang mengubah wajah JavaScript sepenuhnya. ES6 memperkenalkan fitur yang membuat JavaScript lebih mudah dipahami, lebih kuat, serta lebih sejalan dengan praktik pengembangan modern.

Baca juga: Modular JavaScript: Menggunakan Import dan Export

Apa Itu ES6 JavaScript?

ES6, atau ECMAScript 2015, adalah pembaruan besar dari standar resmi bahasa JavaScript. ES6 menjadi salah satu rilis paling berpengaruh dalam sejarah JavaScript karena membawa banyak fitur baru yang mengubah cara developer menulis dan mengorganisir kode. Sebelum ES6 hadir, JavaScript telah lama menggunakan standar ECMAScript 5 (ES5) yang dirilis pada tahun 2009. Selama enam tahun itu, penggunaan JavaScript berkembang sangat cepat, namun fitur bahasanya tetap terbatas. Itulah alasan ES6 datang sebagai solusi untuk menyederhanakan, menstabilkan, dan memperkuat JavaScript.

Pada bagian ini, kita akan membahas apa itu ES6, kapan dirilis, kenapa pembaruan ini sangat penting, dan apa saja perubahan besar yang dibawa dibanding versi sebelumnya.

Penjelasan Singkat Standardisasi ECMAScript

JavaScript dikembangkan oleh Netscape pada tahun 1995, tetapi seiring bertambahnya pengguna dan implementasi di berbagai browser, dibutuhkan sebuah standar resmi agar JavaScript memiliki aturan yang sama di semua platform. Dari sinilah lahir ECMA International, organisasi yang menstandarkan bahasa JavaScript dengan nama resmi ECMAScript.

Jadi:

  • JavaScript = implementasi
  • ECMAScript = spesifikasi / standar bahasa

Setiap pembaruan ECMAScript mendefinisikan fitur baru yang nantinya diimplementasikan oleh browser dan engine JavaScript seperti V8 (Chrome), SpiderMonkey (Firefox), atau JavaScriptCore (Safari).

ES6 adalah versi ECMAScript yang membawa lompatan paling besar dalam sejarah JavaScript modern.

Kapan ES6 Dirilis?

ES6 dirilis pada tahun 2015, sehingga sering juga disebut ES2015. Sejak rilis tersebut, komunitas JavaScript berubah cara kerjanya. JavaScript tidak lagi mengikuti pola rilis yang lama (bertahun-tahun sekali), melainkan dirilis setiap tahun.

Setelah ES6/ES2015, ada ES7/ES2016, ES8/ES2017, sampai seterusnya.

Namun, meskipun pembaruan datang setiap tahun, ES6 tetap menjadi pembaruan paling penting karena skala dan jumlah fitur barunya luar biasa besar.

Dampak ES6 pada Development Modern

ES6 memiliki pengaruh yang sangat besar terhadap ekosistem JavaScript saat ini. Mulai dari cara penulisan sintaks, struktur aplikasi, hingga cara developer bekerja sehari-hari.

Beberapa dampaknya:

1. Penulisan kode menjadi lebih modern, ringkas, dan rapi

Fitur seperti arrow function, template literal, dan destructuring membuat kode lebih mudah dibaca dan lebih singkat.

2. Menjadi fondasi untuk framework modern

Framework populer seperti React, Vue, Svelte, Angular, serta library berbasis Node.js seluruhnya memanfaatkan fitur ES6.

Contohnya:

  • React hooks dan functional component heavily menggunakan arrow function.
  • Vue 3 composition API memanfaatkan destructuring dan spread operator.
  • Node.js module system mulai mendukung ES6 Modules.

3. Modularisasi menjadi standar industri

Sebelum ES6, JavaScript tidak punya sistem modul resmi. ES6 memperkenalkan import/export yang membuat struktur project lebih profesional.

4. Kemampuan asynchronous makin mudah ditangani

Promise (diperkenalkan di ES6) menjadi langkah besar untuk meninggalkan callback hell.

5. Developer lebih produktif

Dengan fitur ES6, developer bisa menulis lebih sedikit kode untuk hasil yang sama—atau bahkan lebih baik.

6. Memperluas penggunaan JavaScript di luar browser

Karena ES6 meningkatkan kekuatan bahasa ini secara signifikan, JavaScript semakin sering digunakan di server, IoT, mobile, hingga AI tool.

Perubahan Besar dari Versi Sebelumnya (ES5)

ES6 membawa perubahan besar-besaran, jauh lebih signifikan dibanding pembaruan lain dalam sejarah ECMAScript.

Berikut beberapa perubahan paling penting:

1. Block scope dengan let & const

Sebelumnya, JavaScript hanya punya var yang memiliki function scope. Dengan ES6:

  • let memperkenalkan block scope
  • const memperkenalkan variable immutability

Ini meningkatkan keamanan kode secara signifikan.

2. Arrow Function

Salah satu fitur paling terkenal dari ES6.

Contoh:

const tambah = (a, b) => a + b;Code language: JavaScript (javascript)

Lebih ringkas dibanding syntax lama:

function tambah(a, b) {
    return a + b;
}Code language: JavaScript (javascript)

Arrow function juga memiliki perilaku lexical this, membuatnya sangat berguna.

3. Template Literal

Manipulasi string jadi lebih mudah.

Sebelum ES6:

var pesan = "Halo " + nama + ", selamat datang!";Code language: JavaScript (javascript)

Sesudah ES6:

const pesan = `Halo ${nama}, selamat datang!`;Code language: JavaScript (javascript)

4. Destructuring

Mempermudah ekstraksi data dari object atau array.

5. Spread Operator & Rest Parameter

Menyederhanakan penggabungan array, object, dan parameter function.

6. Class

JavaScript akhirnya punya class syntax seperti bahasa OOP lainnya, meskipun tetap berbasis prototype.

7. Module Import/Export

Fitur modularisasi resmi yang sebelumnya tidak ada.

8. Promise

Mengakhiri callback hell dan menjadi dasar async/await di versi selanjutnya.

Dengan perubahan besar tersebut, ES6 menjadi pondasi kuat yang membawa JavaScript ke era modern. Hampir semua tutorial, framework, dan artikel coding saat ini mengasumsikan bahwa developer sudah menguasai ES6. Itu sebabnya memulai belajar JavaScript modern harus dimulai dari ES6.

Perbedaan var, let, dan const

Salah satu perubahan paling fundamental dalam ES6 adalah hadirnya let dan const sebagai pengganti var. Ketiga keyword ini digunakan untuk mendeklarasikan variabel, namun masing-masing memiliki karakteristik yang berbeda dalam hal scope, hoisting, dan reassignability. Memahami perbedaannya sangat penting karena kesalahan penggunaan dapat menimbulkan bug yang sulit ditemukan—terutama di aplikasi skala besar.

Pada bagian ini, kita akan membahas:

  • Konsep hoisting pada var vs let/const
  • Perbedaan block scope vs function scope
  • Contoh kasus error yang sering terjadi
  • Best practice penggunaan di proyek modern

Konsep Hoisting

Hoisting adalah mekanisme JavaScript yang memindahkan deklarasi variabel dan fungsi ke bagian atas scope sebelum kode dijalankan.

Namun perilakunya berbeda antara var, let, dan const.

Hoisting pada var

  • Di-hoist ke atas
  • Diinisialisasi dengan undefined
  • Dapat digunakan sebelum deklarasi tanpa error (meski hasilnya undefined)

Contoh:

console.log(nama);    // undefined
var nama = "Aris";Code language: JavaScript (javascript)

Hoisting pada let dan const

  • Tetap di-hoist, tetapi masuk ke Temporal Dead Zone (TDZ)
  • Tidak dapat diakses sebelum deklarasi
  • Menghasilkan error jika digunakan sebelum dideklarasikan
console.log(umur);    // ReferenceError
let umur = 25;Code language: JavaScript (javascript)

Dengan kata lain:

  • var → hoisted + initialized
  • let / const → hoisted but not initialized (TDZ)

Block Scope vs Function Scope

Scope menentukan sejauh mana sebuah variabel dapat diakses.

var — function scoped

Variabel hanya dibatasi oleh fungsi, bukan oleh blok {}.

if (true) {
    var x = 10;
}

console.log(x);    // 10Code language: JavaScript (javascript)

let & const — block scoped

Hanya hidup di dalam blok {} tempat deklarasinya.

if (true) {
    let y = 20;
    const z = 30;
}

console.log(y);    // ReferenceError
console.log(z);    // ReferenceErrorCode language: JavaScript (javascript)

Ini membuat let dan const jauh lebih aman digunakan dibanding var.

Contoh Real Case Error

Kesalahan penggunaan var, let, dan const sering menyebabkan bug tak terduga. Berikut contoh kasus nyata.

Kasus 1 — Loop dengan var menyebabkan nilai tidak sesuai

for (var i = 1; i <= 3; i++) {
    setTimeout(() => {
        console.log(i);
    }, 100);
}Code language: JavaScript (javascript)

Output:

4
4
4

Karena i adalah var (function scope), setelah loop selesai nilainya menjadi 4, dan semua callback mengakses nilai akhir tersebut.

Solusi dengan let:

for (let i = 1; i <= 3; i++) {
    setTimeout(() => {
        console.log(i);
    }, 100);
}Code language: JavaScript (javascript)

Output:

1
2
3

Kasus 2 — Reassign const menyebabkan error

const user = "Aris";
user = "Budi";        // TypeErrorCode language: JavaScript (javascript)

Namun object pada const tetap bisa diubah (mutasi boleh, reassignment tidak).

const profile = {
    nama: "Aris",
    umur: 25
};

profile.umur = 30;    // BolehCode language: JavaScript (javascript)

Kasus 3 — Temporal Dead Zone (TDZ)

function tes() {
    console.log(a);   // ReferenceError (TDZ)
    let a = 5;
}Code language: JavaScript (javascript)

TDZ membantu mencegah accidental access terhadap variabel yang belum siap.

Arrow Function JavaScript

Arrow function adalah salah satu fitur ES6 yang paling terkenal dan paling sering digunakan dalam JavaScript modern. Fitur ini tidak hanya membuat penulisan kode menjadi lebih ringkas, tetapi juga membawa perilaku baru pada this yang sangat bermanfaat ketika digunakan dengan benar.

Pada bagian ini kita akan membahas:

  • Sintaks dasar arrow function
  • Perbandingan function biasa vs arrow function
  • Konsep lexical this pada arrow function
  • Kapan sebaiknya menggunakan arrow function

Semua disertai contoh kode yang mudah dipahami.

Sintaks Dasar Arrow Function

Arrow function pertama kali diperkenalkan di ES6 dan memungkinkan penulisan function yang jauh lebih pendek.

Struktur paling sederhana:

const namaFunction = () => {
    // kode di sini
};Code language: JavaScript (javascript)

Contoh paling sederhana:

const sapa = () => {
    console.log("Halo!");
};Code language: JavaScript (javascript)

Arrow function dengan parameter

const kaliDua = (angka) => {
    return angka * 2;
};Code language: JavaScript (javascript)

Arrow function dengan implicit return

Jika hanya satu ekspresi, kurung kurawal dan return bisa dihilangkan:

const kaliTiga = (angka) => angka * 3;Code language: JavaScript (javascript)

Arrow function dengan satu parameter

Kurung parameter boleh dihilangkan:

const tambahSatu = x => x + 1;Code language: JavaScript (javascript)

Tanpa parameter → gunakan ()

const hello = () => "Halo dunia!";Code language: JavaScript (javascript)

Hasilnya membuat kode jauh lebih singkat dan bersih.

Perbandingan Function Biasa vs Arrow Function

Untuk memahami keunggulan arrow function, mari bandingkan dengan function biasa.

Function Biasa

function tambah(a, b) {
    return a + b;
}Code language: JavaScript (javascript)

Menggunakan Arrow Function

const tambah = (a, b) => a + b;Code language: JavaScript (javascript)

Lebih ringkas, lebih modern, dan lebih mudah dibaca.

Function Biasa Mengikat this Secara Dinamis

function User() {
    this.nama = "Aris";

    setTimeout(function () {
        console.log(this.nama);     // undefined
    }, 100);
}Code language: JavaScript (javascript)

Karena function biasa memiliki dynamic this, maka this merujuk ke global object, bukan ke instance User.

Arrow Function Mengikat this Secara Lexical

function User() {
    this.nama = "Aris";

    setTimeout(() => {
        console.log(this.nama);     // "Aris"
    }, 100);
}Code language: JavaScript (javascript)

Arrow function tidak memiliki this sendiri, sehingga otomatis mengambil this dari scope di atasnya.

Lexical This — Perilaku this yang Konsisten

Salah satu fitur paling penting dari arrow function adalah lexical this, yaitu arrow function tidak membuat this baru.

Perilaku Arrow Function:

  • Tidak memiliki this
  • Tidak memiliki prototype
  • Tidak dapat digunakan sebagai constructor (new)
  • Tidak memiliki arguments (gunakan rest parameter)
  • Nilai this diambil dari scope terdekat (lexical)

Contoh paling terkenal — Mengatasi masalah this di callback

Function biasa: salah referensi this

function Timer() {
    this.total = 0;

    setInterval(function () {
        this.total++;     // salah this
    }, 1000);
}Code language: JavaScript (javascript)

Arrow function: this selalu benar

function Timer() {
    this.total = 0;

    setInterval(() => {
        this.total++;     // benar!
    }, 1000);
}Code language: JavaScript (javascript)

Karena lexical this, arrow function menjadi pilihan terbaik untuk callback di:

  • setTimeout
  • setInterval
  • event listener tertentu
  • promise
  • array methods (map, filter, reduce)

Kapan Sebaiknya Menggunakan Arrow Function

Arrow function tidak selalu lebih baik dari function biasa. Ada kasus-kasus tertentu di mana arrow function sangat cocok, dan ada yang sebaiknya tetap menggunakan function klasik.

Mari lihat panduannya.

Gunakan arrow function ketika:

1. Membuat function kecil / helper function

const genap = (n) => n % 2 === 0;Code language: JavaScript (javascript)

2. Menggunakan callback

data.map(item => item.nama);Code language: JavaScript (javascript)

3. Ingin this yang konsisten (lexical this)

setTimeout(() => this.load(), 100);Code language: JavaScript (javascript)

4. Ingin kode lebih ringkas dan mudah dibaca

Jangan gunakan arrow function ketika:

1. Membuat function constructor / class method yang butuh this sendiri

Arrow function tidak cocok:

const User = (nama) => { this.nama = nama; // tidak bisa };

2. Membuat method dalam object yang perlu this dinamis

const obj = {
    nama: "Aris",
    sayHi: () => console.log(this.nama)    // undefined
};Code language: JavaScript (javascript)

Sebaiknya gunakan function biasa.

3. Membutuhkan arguments object

Arrow function tidak memiliki arguments.

const tes = () => {
    console.log(arguments);    // error
};Code language: JavaScript (javascript)

Harus gunakan function biasa jika ingin arguments:

function tes() {
    console.log(arguments);
}Code language: JavaScript (javascript)

Berikut ini adalah tabel perbandingan function biasa dengan arrow function

FiturFunction BiasaArrow Function
Sintakspanjanglebih singkat
thisdynamic thislexical this
Dapat dijadikan constructorYaTidak
Cocok untukmethod, constructorcallback, helper
Memiliki argumentsYaTidak

Dengan memahami arrow function secara menyeluruh—mulai dari sintaks, perbandingan, hingga lexical this—developer dapat menulis kode modern yang lebih bersih, efisien, dan minim bug.

Template Literal JavaScript

Template literal adalah salah satu fitur ES6 yang membuat penulisan string di JavaScript menjadi jauh lebih mudah, rapi, dan fleksibel. Jika sebelumnya kita sering menggunakan tanda kutip tunggal ' ' atau kutip ganda " ", ES6 memperkenalkan backtick ( ““ ) sebagai cara baru untuk membuat string yang lebih dinamis.

Pada bagian ini kita akan membahas tiga hal penting:

  • String interpolation
  • Multiline string
  • Tag function (opsional, namun sangat berguna untuk kasus tertentu)

String Interpolation

String interpolation adalah kemampuan untuk menyisipkan variabel atau ekspresi langsung di dalam string tanpa harus melakukan concatenation manual.

Sebelum ES6:

const name = "Aris";
const age = 25;

const text = "Halo, nama saya " + name + " dan saya berusia " + age + " tahun.";
console.log(text);Code language: JavaScript (javascript)

Setelah ES6 (template literal):

const name = "Aris";
const age = 25;

const text = `Halo, nama saya ${name} dan saya berusia ${age} tahun.`;
console.log(text);Code language: JavaScript (javascript)

Keuntungan string interpolation:

  • Lebih rapi
  • Mengurangi typo saat concatenation
  • Bisa memasukkan ekspresi, bukan hanya variabel

Contoh ekspresi di dalam template literal:

const a = 10;
const b = 5;

const result = `Hasil dari ${a} + ${b} = ${a + b}`;
console.log(result);Code language: JavaScript (javascript)

Multiline String

Sebelum ES6, membuat string lebih dari satu baris sangat menyakitkan. Kita harus menggunakan \n atau memecah menjadi banyak concatenation.

Contoh sebelum ES6:

const message = "Halo!\n" +
    "Ini adalah pesan dengan baris baru.\n" +
    "Menulisnya agak repot sebelum ES6.";Code language: JavaScript (javascript)

Dengan template literal, cukup gunakan backtick:

const message = `
Halo!
Ini adalah pesan dengan baris baru.
Menulisnya jauh lebih mudah dengan template literal.
`;
console.log(message);Code language: JavaScript (javascript)

Kelebihan multiline string menggunakan backtick:

  • Format baris tetap sama seperti yang kita tulis
  • Sangat membantu untuk HTML snippet, email template, atau teks panjang

Contoh HTML template menggunakan template literal:

const html = `
    <div class="card">
        <h2>Produk Terbaru</h2>
        <p>Harga: Rp 150.000</p>
    </div>
`;

console.log(html);Code language: HTML, XML (xml)

Tag Function (Opsional)

Tag function adalah fitur canggih dari template literal. Dengan teknik ini, template literal dapat diolah menggunakan fungsi sebelum menghasilkan output akhir.

Biasanya digunakan untuk:

  • Sanitasi input (mencegah XSS)
  • Memformat data
  • Localization (i18n)
  • Membuat DSL (domain specific language) sederhana

Contoh sederhana tag function:

function highlight(strings, ...values) {
    let result = "";

    strings.forEach((str, index) => {
        const value = values[index]
            ? `<mark>${values[index]}</mark>`
            : "";
        result += str + value;
    });

    return result;
}

const name = "Aris";
const skill = "JavaScript";

const output = highlight`Nama saya ${name} dan saya suka ${skill}`;
console.log(output);Code language: JavaScript (javascript)

Hasilnya:

Nama saya <mark>Aris</mark> dan saya suka <mark>JavaScript</mark>Code language: HTML, XML (xml)

Template literal adalah fitur ES6 yang sangat penting untuk dipelajari karena:

  • Membuat string menjadi jauh lebih mudah ditulis dan dibaca
  • Menghilangkan banyak boilerplate concatenation
  • Membantu penulisan multiline string dengan cara yang natural
  • Menyediakan fitur canggih seperti tagged templates untuk kebutuhan khusus

Setelah memahami template literal, kita siap melanjutkan ke fitur ES6 lainnya yang tidak kalah penting.

Destructuring JavaScript

Destructuring adalah fitur ES6 yang memungkinkan kita mengambil nilai dari array atau properti dari object dan menyimpannya ke dalam variabel dengan cara yang jauh lebih singkat dan rapi. Fitur ini menjadi salah satu hal paling populer dan sering digunakan dalam JavaScript modern—baik dalam frontend, backend, maupun struktur data yang kompleks.

Pada bagian ini kita membahas:

  • Array destructuring
  • Object destructuring
  • Default value
  • Nested destructuring

Array Destructuring

Array destructuring memungkinkan kita mengekstrak beberapa nilai dari sebuah array dalam satu baris.

Sebelum ES6:

const arr = [1, 2, 3];
const a = arr[0];
const b = arr[1];
const c = arr[2];

console.log(a, b, c);Code language: JavaScript (javascript)

Dengan destructuring ES6:

const arr = [1, 2, 3];

const [a, b, c] = arr;

console.log(a, b, c); // 1 2 3Code language: JavaScript (javascript)

Skip nilai tertentu:

const arr = ["A", "B", "C"];

const [first, , third] = arr;

console.log(first, third); // A CCode language: JavaScript (javascript)

Destructuring dengan rest operator:

const numbers = [10, 20, 30, 40, 50];

const [first, second, ...others] = numbers;

console.log(first);   // 10
console.log(second);  // 20
console.log(others);  // [30, 40, 50]Code language: JavaScript (javascript)

Object Destructuring

Object destructuring digunakan untuk mengambil properti dari sebuah objek lalu menyimpannya dalam variabel dengan nama yang sama.

Sebelum ES6:

const user = { name: "Aris", age: 25 };

const name = user.name;
const age = user.age;

console.log(name, age);Code language: JavaScript (javascript)

Dengan destructuring:

const user = { name: "Aris", age: 25 };

const { name, age } = user;

console.log(name, age);Code language: JavaScript (javascript)

Rename saat destructuring

Kadang nama variabel berbeda dengan key objeknya:

const user = {
    fullName: "Aris Munandar",
    age: 25
};

const { fullName: name, age: umur } = user;

console.log(name); // "Aris Munandar"
console.log(umur); // 25Code language: JavaScript (javascript)

Destructuring dengan rest operator pada object

const user = {
    name: "Aris",
    age: 25,
    city: "Bandung",
    job: "Developer"
};

const { name, ...others } = user;

console.log(name);   // "Aris"
console.log(others); // { age: 25, city: 'Bandung', job: 'Developer' }Code language: JavaScript (javascript)

Default Value

Default value sangat berguna ketika data yang diterima mungkin undefined, sehingga kita bisa memberikan nilai fallback.

Default value pada array

const arr = [10];

const [a, b = 20] = arr;

console.log(a); // 10
console.log(b); // 20 (default)Code language: JavaScript (javascript)

Default value pada object

const user = {
    name: "Aris"
    // age tidak ada
};

const { name, age = 30 } = user;

console.log(name); // Aris
console.log(age);  // 30 (default)Code language: JavaScript (javascript)

Nested Destructuring

Destructuring juga dapat dilakukan pada struktur data yang bersarang (nested).

Nested array destructuring

const data = [1, [2, 3]];

const [a, [b, c]] = data;

console.log(a, b, c); // 1 2 3Code language: JavaScript (javascript)

Nested object destructuring

const user = {
    name: "Aris",
    address: {
        city: "Bandung",
        street: "Jl. Asia Afrika"
    }
};

const {
    name,
    address: { city, street }
} = user;

console.log(name);   // Aris
console.log(city);   // Bandung
console.log(street); // Jl. Asia AfrikaCode language: JavaScript (javascript)

Nested object + rename + default

const config = {
    server: {
        host: "localhost"
    }
};

const {
    server: {
        host: hostname,
        port = 8080
    }
} = config;

console.log(hostname); // localhost
console.log(port);     // 8080 (default)Code language: JavaScript (javascript)

Destructuring sangat membantu dalam:

  • Penulisan kode yang lebih pendek dan bersih
  • Pengambilan data dari API yang biasanya memiliki struktur kompleks
  • Penanganan value default yang aman
  • Membuat kode lebih mudah dibaca dan dipelihara

Fitur ini digunakan hampir di semua project modern, mulai dari React, Vue, Node.js, hingga Express.

Spread Operator & Rest Parameter

Spread operator (...) dan rest parameter (...) adalah dua fitur ES6 yang menggunakan simbol yang sama, tetapi memiliki fungsi berbeda tergantung konteksnya.

Keduanya sangat penting dalam JavaScript modern, terutama saat bekerja dengan array, object, dan function.

Spread Operator untuk Array

Spread operator digunakan untuk menyebarkan (expand) elemen array menjadi elemen tunggal. Biasanya dipakai untuk:

  • Menggabungkan array
  • Menyalin array
  • Menambah elemen baru tanpa mengubah array asli (immutability)

Menggabungkan array sebelum ES6:

const a = [1, 2];
const b = [3, 4];

const result = a.concat(b);

console.log(result); // [1, 2, 3, 4]Code language: JavaScript (javascript)

Setelah ES6 dengan spread:

const a = [1, 2];
const b = [3, 4];

const result = [...a, ...b];

console.log(result); // [1, 2, 3, 4]Code language: JavaScript (javascript)

Menyalin array tanpa mengubah data asli

const original = [10, 20, 30];

const copy = [...original];

copy.push(40);

console.log(original); // [10, 20, 30]
console.log(copy);     // [10, 20, 30, 40]Code language: JavaScript (javascript)

Menambahkan elemen ke array secara immutability

const arr = [1, 2, 3];

const newArr = [0, ...arr, 4];

console.log(newArr); // [0, 1, 2, 3, 4]Code language: JavaScript (javascript)

Spread Operator untuk Object

Spread pada object digunakan untuk:

  • Menyalin object
  • Menggabungkan object
  • Menambahkan atau mengubah properti dengan cara yang bersih

Menyalin object

const user = { name: "Aris", age: 25 };

const copy = { ...user };

console.log(copy);Code language: JavaScript (javascript)

Menggabungkan object

const a = { name: "Aris" };
const b = { age: 25 };

const result = { ...a, ...b };

console.log(result); 
// { name: 'Aris', age: 25 }Code language: JavaScript (javascript)

Override properti saat digabung

Properti yang berada paling belakang akan menimpa nilai sebelumnya.

const settings = {
    theme: "light",
    version: 1
};

const updated = {
    ...settings,
    theme: "dark"
};

console.log(updated);
// { theme: 'dark', version: 1 }Code language: JavaScript (javascript)

Menambahkan properti baru

const user = { name: "Aris" };

const updatedUser = {
    ...user,
    country: "Indonesia"
};

console.log(updatedUser);Code language: JavaScript (javascript)

Rest Parameter untuk Function

Rest parameter digunakan ketika kita ingin menerima jumlah argumen yang tidak terbatas ke dalam sebuah function.

Contoh:

function sum(...numbers) {
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4)); // 10Code language: JavaScript (javascript)

Rest parameter selalu berada di posisi terakhir

Salah:

function test(a, ...b, c) {} // ❌ errorCode language: JavaScript (javascript)

Benar:

function test(a, b, ...c) {} // ✔️Code language: JavaScript (javascript)

Rest parameter pada destructuring

Array destructuring:

const [first, ...rest] = [10, 20, 30, 40];

console.log(first); // 10
console.log(rest);  // [20, 30, 40]Code language: JavaScript (javascript)

Object destructuring:

const user = {
    name: "Aris",
    age: 25,
    job: "Developer"
};

const { name, ...info } = user;

console.log(name); // Aris
console.log(info); // { age: 25, job: 'Developer' }Code language: JavaScript (javascript)

Studi Kasus Pemakaian Spread & Rest

Agar lebih mudah memahami konsep ini, berikut beberapa kasus nyata.

Studi Kasus 1 — Mengupdate State ala React

Spread adalah teknik utama dalam manajemen state modern seperti React.

const state = {
    name: "Aris",
    age: 25,
    skill: "JavaScript"
};

const newState = {
    ...state,
    age: 26
};

console.log(newState);Code language: JavaScript (javascript)

Kenapa pakai spread?

Karena tidak mengubah state asli (immutability)—prinsip penting pada UI frameworks.

Studi Kasus 2 — Menggabungkan Data API

Bayangkan kita mendapat dua response API berbeda.

const profile = { name: "Aris", age: 25 };
const stats = { followers: 1200, likes: 300 };

const user = {
    ...profile,
    ...stats
};

console.log(user);Code language: JavaScript (javascript)

Studi Kasus 3 — Membuat Function dengan Argumen Bebas

function logMessages(prefix, ...messages) {
    messages.forEach(msg => console.log(`${prefix}: ${msg}`));
}

logMessages("INFO", "Server started", "Database connected", "Ready!");Code language: JavaScript (javascript)

Studi Kasus 4 — Clone & Modify Array secara Aman

const products = ["Keyboard", "Mouse", "Monitor"];

const newProducts = [...products, "Headset"];

console.log(products);     // tidak berubah
console.log(newProducts);  // array baruCode language: JavaScript (javascript)

Spread operator dan rest parameter adalah fitur wajib dalam JavaScript modern karena:

  • Memudahkan manipulasi array dan object
  • Mendukung konsep immutability
  • Berguna dalam banyak framework seperti React, Vue, Svelte
  • Mempermudah penulisan function dengan argumen fleksibel

Fitur ini sangat sering dipakai dalam development 2024–2025 ke atas, baik frontend maupun backend.

Class ES6 JavaScript

ES6 memperkenalkan class, sebuah cara baru yang lebih bersih dan intuitif untuk menulis konsep Object-Oriented Programming (OOP) dalam JavaScript.

Sebelum ES6, JavaScript menggunakan prototypal inheritance yang sintaksnya cukup rumit bagi pemula. Dengan adanya class, penulisan kode menjadi lebih mudah dipahami—mirip seperti bahasa pemrograman modern lainnya.

Pada bagian ini, kita akan membahas:

  • OOP sederhana dalam JavaScript modern
  • Constructor
  • Method
  • Inheritance (Pewarisan)

OOP Sederhana dalam JavaScript Modern

Class dalam JavaScript bukanlah pengganti prototypal inheritance, tetapi hanya syntactic sugar—artinya class hanyalah cara penulisan yang lebih rapi dan mudah, namun tetap menggunakan prototype di belakang layar.

Contoh object literal biasa:

const user = {
    name: "Aris",
    greet() {
        console.log(`Halo, saya ${this.name}`);
    }
};

user.greet();Code language: JavaScript (javascript)

Namun jika kita ingin membuat banyak object dengan struktur yang sama, object literal menjadi kurang fleksibel.

Di sinilah konsep class berguna.

Constructor

constructor adalah method khusus dalam class yang akan dijalankan setiap kali objek baru dibuat melalui new.

Contoh dasar class dengan constructor:

    class Person {
        constructor(name, age) {
            this.name = name;
            this.age = age;
        }
    }

    const user = new Person("Aris", 25);
    console.log(user);Code language: JavaScript (javascript)

Ketika kita memanggil:

new Person("Aris", 25)Code language: JavaScript (javascript)

maka constructor otomatis mengisi nilai:

  • this.name = "Aris"
  • this.age = 25

Method dalam Class

Method adalah fungsi yang berada di dalam class. Contoh:

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    greet() {
        console.log(`Halo, nama saya ${this.name} dan umur saya ${this.age} tahun.`);
    }

    getBirthYear() {
        return new Date().getFullYear() - this.age;
    }
}

const user = new Person("Aris", 25);
user.greet();
console.log(user.getBirthYear());Code language: JavaScript (javascript)

Kelebihan method di class:

  • Otomatis masuk ke prototype
  • Tidak memenuhi memori karena tidak dibuat ulang untuk setiap instance
  • Lebih rapi dan mudah dibaca

Inheritance (Pewarisan)

Inheritance memungkinkan satu class untuk mewarisi properti dan method dari class lain. Ini sangat penting dalam OOP karena:

  • Mengurangi duplikasi kode
  • Memudahkan pembuatan struktur hierarki
  • Lebih mudah untuk memperluas fungsionalitas dasar
  • Dalam JavaScript, pewarisan dilakukan dengan kata kunci extends.

Contoh Inheritance:

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    greet() {
        console.log(`Halo, saya ${this.name}.`);
    }
}

class Developer extends Person {
    constructor(name, age, programmingLanguage) {
        super(name, age); // memanggil constructor class induk
        this.programmingLanguage = programmingLanguage;
    }

    introduce() {
        console.log(
            `Halo, saya ${this.name}, seorang developer yang menggunakan ${this.programmingLanguage}.`
        );
    }
}

const dev = new Developer("Aris", 25, "JavaScript");
dev.greet();        // dari class Person
dev.introduce();    // dari class DeveloperCode language: JavaScript (javascript)

Penting:

  • super() harus dipanggil sebelum this dalam constructor class turunan
  • Semua method class induk bisa langsung dipakai oleh class turunan

Contoh Studi Kasus: Struktur OOP Sederhana

Misalnya kita membuat sistem data hewan peliharaan:

class Animal {
    constructor(name) {
        this.name = name;
    }

    eat() {
        console.log(`${this.name} sedang makan.`);
    }
}

class Cat extends Animal {
    constructor(name, breed) {
        super(name);
        this.breed = breed;
    }

    meow() {
        console.log(`${this.name} berkata: Meow!`);
    }
}

const kitty = new Cat("Miko", "Persia");
kitty.eat();
kitty.meow();Code language: JavaScript (javascript)

Pada bagian ini kamu telah mempelajari:

  • Konsep dasar class dalam JavaScript modern
  • Cara kerja constructor
  • Cara membuat method
  • Teknik inheritance untuk membangun struktur OOP yang rapi

Fitur class ES6 membuat JavaScript lebih mudah dikelola pada aplikasi besar seperti aplikasi frontend modern, backend Node.js, maupun aplikasi full stack.

Module Import & Export ES6

Salah satu fitur paling berpengaruh dalam ES6 adalah sistem modul (ES Modules / ESM). Modul memungkinkan kita membagi kode menjadi beberapa file yang terpisah dan saling terhubung. Dengan modul, aplikasi menjadi:

  • Lebih rapi
  • Lebih scalable
  • Mudah dirawat
  • Lebih mudah diuji (testable)

ES Modules menghilangkan kebutuhan library lama seperti RequireJS, Browserify, atau sistem modul Node.js versi lama (CommonJS).

Pada bagian ini kita akan membahas:

  1. export default
  2. export named
  3. import alias
  4. dynamic import (ES2020, tapi tetap relevan untuk ESM modern)

Export Default

export default digunakan untuk mengekspor nilai utama dari sebuah modul. Dalam satu file modul, hanya boleh ada satu default export.

Contoh:

// file: utils.js

export default function greet(name) {
    console.log(`Halo, ${name}!`);
}Code language: JavaScript (javascript)

Cara mengimpornya:

// file: app.js

import greet from "./utils.js";

greet("Aris");Code language: JavaScript (javascript)

Ciri khas export default:

  • Tidak perlu menggunakan { } saat import
  • Nama fungsi/variabel dapat diubah bebas saat import

Contoh rename saat import (tetap valid):

import sayHello from "./utils.js";

sayHello("Aris");Code language: JavaScript (javascript)

Export Named

Dengan named export, kita bisa mengekspor beberapa variabel, fungsi, atau class dalam satu file.

Contoh:

// file: math.js

export const PI = 3.14;

export function add(a, b) {
    return a + b;
}

export function subtract(a, b) {
    return a - b;
}Code language: JavaScript (javascript)

Cara import:

import { PI, add, subtract } from "./math.js";

console.log(PI);
console.log(add(5, 3));Code language: JavaScript (javascript)

Ciri khas named export:

  • Import harus menggunakan { }
  • Nama harus sama persis dengan yang diekspor (kecuali memakai alias)
  • Dalam satu modul bisa ada banyak named export

Named export digabungkan:

// file: strings.js

const upper = (text) => text.toUpperCase();
const lower = (text) => text.toLowerCase();

export { upper, lower };Code language: JavaScript (javascript)

Import Alias (Rename Imports)

Alias sangat berguna untuk:

  • Menghindari konflik nama
  • Memperjelas konteks
  • Menyederhanakan nama yang panjang

Contoh alias pada named import:

import { add as tambah, subtract as kurang } from "./math.js";

console.log(tambah(10, 2));
console.log(kurang(10, 2));Code language: JavaScript (javascript)

Alias untuk default export:

Default export dapat diganti nama sesuka hati, tanpa as:

import greet from "./utils.js"; // bebas, greet bukan nama asli di fileCode language: JavaScript (javascript)

Alias pada namespace import (menggabungkan semua):

import * as MathUtil from "./math.js";

console.log(MathUtil.PI);
console.log(MathUtil.add(3, 4));Code language: JavaScript (javascript)

Dynamic Import (import()) — ES2020

Walaupun bukan ES6 langsung, dynamic import adalah bagian penting modul modern.

Dynamic import memungkinkan kita:

  • Memuat modul hanya saat diperlukan (lazy loading)
  • Mengurangi ukuran bundel awal
  • Mengoptimalkan performa aplikasi SPA
  • Memuat modul berdasarkan kondisi

Formatnya menggunakan fungsi import() yang mengembalikan Promise.

Contoh dasar dynamic import:

if (someCondition) {
    import("./math.js").then(module => {
        console.log(module.add(5, 4));
    });
}Code language: JavaScript (javascript)

Dengan async/await:

async function loadMath() {
    const math = await import("./math.js");

    console.log(math.PI);
    console.log(math.add(10, 20));
}

loadMath();Code language: JavaScript (javascript)

Kenapa dynamic import penting?

  • Digunakan oleh React (lazy loading), Vue, dan Next.js
  • Membuat aplikasi besar tetap cepat
  • Cocok untuk memuat library besar yang jarang dipakai

Contoh kasus nyata:

Memuat editor WYSIWYG hanya saat user klik tombol “Edit Article”.

async function loadEditor() {
    const { default: Editor } = await import("./editor.js");
    const editor = new Editor("#content");
}Code language: JavaScript (javascript)

Pada bagian ini kamu telah mempelajari:

  • export default — untuk satu ekspor utama
  • export named — untuk banyak ekspor dalam satu file
  • import alias — lebih fleksibel, bisa rename dan hindari konflik
  • dynamic import() — memuat modul secara dinamis untuk optimasi performa

Semua konsep ini sangat penting dalam JavaScript modern, terutama pada framework modern seperti React, Vue, dan Svelte.

Promise ES6 JavaScript

JavaScript modern sangat identik dengan asynchronous programming, terutama ketika berhubungan dengan API, database, animasi, event, hingga proses yang membutuhkan waktu tertentu. Sebelum ES6 hadir, banyak developer mengandalkan callback, yang sering kali menyebabkan “callback hell” dan kode sulit dibaca.

ES6 memperkenalkan Promise, sebuah mekanisme asynchronous yang lebih rapi, mudah di-maintain, dan menjadi dasar lahirnya fitur modern seperti async/await.

Di bagian ini kita akan membahas:

  • Gambaran asynchronous
  • Promise states
  • then(), catch(), finally()

Gambaran Asynchronous di JavaScript

JavaScript berjalan secara single-threaded, artinya hanya bisa menjalankan satu hal pada satu waktu. Namun, untuk operasi yang membutuhkan waktu (misalnya fetching data), JavaScript menggunakan mekanisme asynchronous agar proses lain tetap berjalan tanpa menunggu.

Contoh sederhana proses asynchronous menggunakan setTimeout():

console.log("Mulai");

setTimeout(() => {
    console.log("Proses berlangsung...");
}, 2000);

console.log("Selesai");Code language: JavaScript (javascript)

Output:

Mulai
Selesai
Proses berlangsung...

Artinya, JavaScript tidak menunggu proses selesai untuk melanjutkan baris berikutnya.

Namun callback seperti di atas sering menimbulkan callback hell ketika proses bertingkat.

Di sinilah Promise membantu.

Apa Itu Promise?

Promise adalah objek yang merepresentasikan proses asynchronous yang akan selesai di masa depan, baik berhasil maupun gagal.

Promise memiliki 3 state utama:

  1. pending
    Proses asynchronous sedang berjalan.

  2. fulfilled (resolved)
    Proses selesai berhasil.

  3. rejected
    Proses selesai tetapi gagal.

Contoh Dasar Promise

const getData = () => {
    return new Promise((resolve, reject) => {
        const success = true;

        setTimeout(() => {
            if (success) {
                resolve("Data berhasil diambil!");
            } else {
                reject("Gagal mengambil data.");
            }
        }, 1500);
    });
};

getData()
    .then(result => {
        console.log(result);
    })
    .catch(error => {
        console.log(error);
    })
    .finally(() => {
        console.log("Proses selesai (success atau error)");
    });Code language: JavaScript (javascript)

then(), catch(), finally()

then()

Digunakan untuk menerima hasil ketika Promise fulfilled.

getData().then(data => {
    console.log("Sukses:", data);
});Code language: JavaScript (javascript)

catch()

Dipanggil ketika Promise berada di state rejected.

getData()
    .catch(err => {
        console.log("Error:", err);
    });Code language: JavaScript (javascript)

finally()

Selalu dipanggil, baik berhasil atau gagal — cocok untuk menutup loading UI.

getData()
    .finally(() => {
        console.log("Selesai apapun hasilnya.");
    });Code language: JavaScript (javascript)

Promise Chaining

Promise bisa dirangkai agar tidak terjebak callback hell.

const step1 = () => {
    return Promise.resolve("Step 1");
};

const step2 = () => {
    return Promise.resolve("Step 2");
};

step1()
    .then(res => {
        console.log(res);
        return step2();
    })
    .then(res => {
        console.log(res);
    })
    .catch(err => {
        console.log("Error:", err);
    });Code language: JavaScript (javascript)

Contoh Real Case: Fetch API

fetch("https://jsonplaceholder.typicode.com/posts/1")
    .then(response => response.json())
    .then(data => {
        console.log("Data:", data);
    })
    .catch(error => {
        console.log("Terjadi error:", error);
    })
    .finally(() => {
        console.log("Fetch selesai");
    });Code language: JavaScript (javascript)

Kesimpulan

ES6 menjadi tonggak penting dalam evolusi JavaScript karena menghadirkan fitur-fitur baru yang membuat proses development lebih modern, efisien, dan terstruktur. Mulai dari let dan const, arrow function, template literal, destructuring, hingga class dan modul, semuanya hadir untuk menjawab kebutuhan developer dalam membangun aplikasi yang scalable dan mudah di-maintain. Standarisasi ECMAScript juga memastikan bahwa JavaScript terus berkembang secara konsisten, mengikuti kebutuhan industri yang semakin kompleks.

Selain itu, fitur asynchronous seperti Promise dan dukungan modul import/export menjadikan JavaScript lebih fleksibel dalam menangani proses real-time dan integrasi API. Dengan menguasai seluruh fitur inti ES6, developer dapat meningkatkan kualitas kode, mempercepat workflow, serta menerapkan praktik modern yang digunakan pada framework besar seperti React, Vue, dan Node.js. ES6 bukan hanya pembaruan bahasa, tetapi pondasi utama JavaScript modern yang digunakan saat ini.

1 JavaScript Dasar

2 JavaScript Menengah

3 JavaScript Lanjutan

Level Lanjutan memperkenalkan fitur modern JavaScript seperti ES6+, arrow function, destructuring, spread operator, template literal, closures, dan konsep scope serta hoisting. Level ini membantu pengguna memahami dasar penting JavaScript modern yang banyak digunakan pada pengembangan web saat ini, sehingga dapat menulis kode yang lebih efisien, bersih, dan mudah dikelola.

4 JavaScript Mahir

5 JavaScript Ahli

Comments

Congrats, you have the opportunity to be the first commenter on this article. Have questions or suggestions? Please leave a comment to start discussion.

Leave comment

Alamat email Anda tidak akan dipublikasikan. Required fields are marked *

news-1701

sabung ayam online

yakinjp

yakinjp

rtp yakinjp

slot thailand

yakinjp

yakinjp

yakin jp

yakinjp id

maujp

maujp

maujp

maujp

sabung ayam online

sabung ayam online

judi bola online

sabung ayam online

judi bola online

slot mahjong ways

slot mahjong

sabung ayam online

judi bola

live casino

sabung ayam online

judi bola

live casino

SGP Pools

slot mahjong

sabung ayam online

slot mahjong

SLOT THAILAND

berita 128000726

berita 128000727

berita 128000728

berita 128000729

berita 128000730

berita 128000731

berita 128000732

berita 128000733

berita 128000734

berita 128000735

berita 128000736

berita 128000737

berita 128000738

berita 128000739

berita 128000740

berita 128000741

berita 128000742

berita 128000743

berita 128000744

berita 128000745

berita 128000746

berita 128000747

berita 128000748

berita 128000749

berita 128000750

berita 128000751

berita 128000752

berita 128000753

berita 128000754

berita 128000755

artikel 128000821

artikel 128000822

artikel 128000823

artikel 128000824

artikel 128000825

artikel 128000826

artikel 128000827

artikel 128000828

artikel 128000829

artikel 128000830

artikel 128000831

artikel 128000832

artikel 128000833

artikel 128000834

artikel 128000835

artikel 128000836

artikel 128000837

artikel 128000838

artikel 128000839

artikel 128000840

artikel 128000841

artikel 128000842

artikel 128000843

artikel 128000844

artikel 128000845

artikel 128000846

artikel 128000847

artikel 128000848

artikel 128000849

artikel 128000850

article 138000756

article 138000757

article 138000758

article 138000759

article 138000760

article 138000761

article 138000762

article 138000763

article 138000764

article 138000765

article 138000766

article 138000767

article 138000768

article 138000769

article 138000770

article 138000771

article 138000772

article 138000773

article 138000774

article 138000775

article 138000776

article 138000777

article 138000778

article 138000779

article 138000780

article 138000781

article 138000782

article 138000783

article 138000784

article 138000785

article 138000816

article 138000817

article 138000818

article 138000819

article 138000820

article 138000821

article 138000822

article 138000823

article 138000824

article 138000825

article 138000826

article 138000827

article 138000828

article 138000829

article 138000830

article 138000831

article 138000832

article 138000833

article 138000834

article 138000835

article 138000836

article 138000837

article 138000838

article 138000839

article 138000840

article 138000841

article 138000842

article 138000843

article 138000844

article 138000845

article 138000786

article 138000787

article 138000788

article 138000789

article 138000790

article 138000791

article 138000792

article 138000793

article 138000794

article 138000795

article 138000796

article 138000797

article 138000798

article 138000799

article 138000800

article 138000801

article 138000802

article 138000803

article 138000804

article 138000805

article 138000806

article 138000807

article 138000808

article 138000809

article 138000810

article 138000811

article 138000812

article 138000813

article 138000814

article 138000815

story 138000816

story 138000817

story 138000818

story 138000819

story 138000820

story 138000821

story 138000822

story 138000823

story 138000824

story 138000825

story 138000826

story 138000827

story 138000828

story 138000829

story 138000830

story 138000831

story 138000832

story 138000833

story 138000834

story 138000835

story 138000836

story 138000837

story 138000838

story 138000839

story 138000840

story 138000841

story 138000842

story 138000843

story 138000844

story 138000845

article 138000726

article 138000727

article 138000728

article 138000729

article 138000730

article 138000731

article 138000732

article 138000733

article 138000734

article 138000735

article 138000736

article 138000737

article 138000738

article 138000739

article 138000740

article 138000741

article 138000742

article 138000743

article 138000744

article 138000745

article 208000456

article 208000457

article 208000458

article 208000459

article 208000460

article 208000461

article 208000462

article 208000463

article 208000464

article 208000465

article 208000466

article 208000467

article 208000468

article 208000469

article 208000470

article 228000356

article 228000357

article 228000358

article 228000359

article 228000360

article 228000361

article 228000362

article 228000363

article 228000364

article 228000365

article 228000366

article 228000367

article 228000368

article 228000369

article 228000370

article 228000371

article 228000372

article 228000373

article 228000374

article 228000375

article 228000376

article 228000377

article 228000378

article 228000379

article 228000380

article 228000381

article 228000382

article 228000383

article 228000384

article 228000385

article 228000386

article 228000387

article 228000388

article 228000389

article 228000390

article 228000391

article 228000392

article 228000393

article 228000394

article 228000395

article 228000396

article 228000397

article 228000398

article 228000399

article 228000400

article 228000401

article 228000402

article 228000403

article 228000404

article 228000405

article 228000406

article 228000407

article 228000408

article 228000409

article 228000410

article 228000411

article 228000412

article 228000413

article 228000414

article 228000415

article 228000416

article 228000417

article 228000418

article 228000419

article 228000420

article 228000421

article 228000422

article 228000423

article 228000424

article 228000425

article 228000426

article 228000427

article 228000428

article 228000429

article 228000430

article 228000431

article 228000432

article 228000433

article 228000434

article 228000435

article 238000461

article 238000462

article 238000463

article 238000464

article 238000465

article 238000466

article 238000467

article 238000468

article 238000469

article 238000470

article 238000471

article 238000472

article 238000473

article 238000474

article 238000475

article 238000476

article 238000477

article 238000478

article 238000479

article 238000480

article 238000481

article 238000482

article 238000483

article 238000484

article 238000485

article 238000486

article 238000487

article 238000488

article 238000489

article 238000490

article 238000491

article 238000492

article 238000493

article 238000494

article 238000495

article 238000496

article 238000497

article 238000498

article 238000499

article 238000500

article 238000501

article 238000502

article 238000503

article 238000504

article 238000505

article 238000506

article 238000507

article 238000508

article 238000509

article 238000510

article 238000511

article 238000512

article 238000513

article 238000514

article 238000515

article 238000516

article 238000517

article 238000518

article 238000519

article 238000520

update 238000492

update 238000493

update 238000494

update 238000495

update 238000496

update 238000497

update 238000498

update 238000499

update 238000500

update 238000501

update 238000502

update 238000503

update 238000504

update 238000505

update 238000506

update 238000507

update 238000508

update 238000509

update 238000510

update 238000511

update 238000512

update 238000513

update 238000514

update 238000515

update 238000516

update 238000517

update 238000518

update 238000519

update 238000520

update 238000521

sumbar-238000396

sumbar-238000397

sumbar-238000398

sumbar-238000399

sumbar-238000400

sumbar-238000401

sumbar-238000402

sumbar-238000403

sumbar-238000404

sumbar-238000405

sumbar-238000406

sumbar-238000407

sumbar-238000408

sumbar-238000409

sumbar-238000410

news-1701