Senin, 27 April 2020

Penggunaan This dalam Arrow Function di Javascript

Perbedaan karakteristik dari arrow function dan regular function selanjutnya ada pada penggunaan keyword this. Penjelasan dari this sendiri menyusul di materi class. Namun kita akan bahas sedikit mengenai ini untuk menggambarkan perbedaan ketika this digunakan oleh arrow function dan regular function.
Jika sebuah regular function dipanggil dengan menggunakan keyword new. Maka nilainya akan menjadi objek, contohnya:

  1. function People(name, age, hobby) {

  2.     this.name = name;

  3.     this.age = age;

  4.     this.hobby = hobby;

  5. }

  6.  

  7. const programmer = new People("John", 18, ["Coding", "Read book", "Ping-pong"]);

  8.  

  9. console.log(programmer.name);

  10. console.log(programmer.age);

  11. console.log(programmer.hobby);

  12.  

  13. /* output:

  14. John

  15. 18

  16. [ 'Coding', 'Read book', 'Ping-pong' ]

  17. */


Objek yang dibuat menggunakan function dengan keyword new, sama halnya seperti kita membuat objek seperti menggunakan objek literals { }.

  1. const programmer = {

  2.     name: "John",

  3.     age: 18,

  4.     hobby: ["Coding", "Read book", "Ping-Pong"]

  5. }

  6.  

  7. console.log(programmer.name);

  8. console.log(programmer.age);

  9. console.log(programmer.hobby);

  10.  

  11. /* output:

  12. John

  13. 18

  14. [ 'Coding', 'Read book', 'Ping-pong' ]

  15. */


Pada objek, this keyword mengembalikan nilai objeknya sendiri. this dapat digunakan untuk mengelola properti pada objeknya. Namun jika fungsi dipanggil tanpa menggunakan keyword new, this akan memiliki nilai global object (Window jika di browser).
Sedangkan fungsi yang dibuat dengan menggunakan gaya arrow tidak akan pernah memiliki nilai this, yang artinya kita tidak pernah bisa membuat objek menggunakan arrow function. Jika kita menggunakan this pada arrow function maka nilai this tersebut merupakan nilai objek di mana arrow function itu berada.
Perhatikan kedua contoh kode berikut:

  1. function People(name, age, hobby) {

  2.     this.name = name;

  3.     this.age = age;

  4.     this.hobby = hobby;

  5. }

  6.  

  7.  

  8. // menambahkan introMyself ke People

  9. People.prototype.introMyself = function () {

  10.     // this -> People

  11.     setTimeout(function() {

  12.        // this -> ??

  13.         console.log(`Hello! Nama saya ${this.name}, umur saya ${this.age}.`)

  14.         console.log(`Hobby saya adalah ${this.hobby}`)

  15.     }, 300)

  16. }

  17.  

  18.  

  19. const programmer = new People("John", 18, ["Coding", "Read book", "Ping-pong"]);

  20. programmer.introMyself();

  21.  

  22.  

  23. /* output:

  24. Hello! Nama saya undefined, umur saya undefined.

  25. Hobby saya adalah undefined

  26. */




  1. function People(name, age, hobby) {

  2.     this.name = name;

  3.     this.age = age;

  4.     this.hobby = hobby;

  5. }

  6.  

  7.  

  8. // menambahkan introMyself ke People

  9. People.prototype.introMyself = function () {

  10.     // this -> People

  11.     setTimeout(() => {

  12.         // this -> People

  13.         console.log(`Hello! Nama saya ${this.name}, umur saya ${this.age}.`)

  14.         console.log(`Hobby saya adalah ${this.hobby}`)

  15.     }, 300)

  16. }

  17.  

  18.  

  19. const programmer = new People("John", 18, ["Coding", "Read book", "Ping-pong"]);

  20. programmer.introMyself();

  21.  

  22.  

  23.  

  24.  

  25. /* output:

  26. Hello! Nama saya John, umur saya 18.

  27. Hobby saya adalah Coding,Read book,Ping-pong

  28. */


Fungsi yang dituliskan di dalam setTimeout() dipanggil tanpa new. Itu berarti nilai dari this jika digunakan di dalam fungsi tersebut adalah global object. Itulah mengapa output akan menghasilkan nilai undefined ketika properti nameage, dan hobby dipanggil.
Berbeda ketika kita menuliskan arrow function di dalam setTimeout(), nilai this memiliki nilai objek sesuai dengan konteksnya (People). Arrow function akan sangat berguna untuk kasus seperti ini

Regular function vs Arrow Function Javascript

Regular function dapat berupa function declaration atau function expression, namun arrow function hanya berupa function expression saja. Itu sebabnya arrow function memiliki nama lengkap “arrow function expressions”.

  1. // function declaration

  2. function sayHello(greet) {

  3.     console.log(`${greet}!`);

  4. }

  5.  

  6.  

  7. // function expression

  8. const sayName = function (name) {

  9.     console.log(`Nama saya ${name}`)

  10. }



  1. // function expression

  2. const sayHello = greet => console.log(`${greet}!`);

  3. const sayName = name => console.log(`Nama saya ${name}`);



Karena arrow function merupakan sebuah expression, maka ia hanya dapat digunakan untuk disimpan pada variabel (seperti contoh kode di atas), sebagai argumen pada sebuah fungsi, dan sebagai nilai dari properti objek.



  1. const sayName = name => console.log(`Nama saya ${name}`);




  1. ["Dimas", "Widdy", "Buchori"].forEach(name => console.log(`Nama saya ${name}`));




  1. const user = {

  2.     introduce: name => console.log(`Nama saya ${name}`)

  3. }



Contoh Arrow Function Expression Javascript

Arrow function mirip seperti regular function secara perilaku, namun penulisannya jauh berbeda. Sama seperti namanya, fungsi didefinisikan dengan menggunakan tanda panah (=>) dan tentu penulisan fungsi dengan arrow ini akan lebih singkat.
Untuk gambaran awal, perhatikan penulisan regular fungsi sebagai callback berikut:

  1. const upperizedNames = ["Dimas", "Widy", "Buchori"]

  2.     .map(function(name) {

  3.         return name.toUpperCase();

  4. });

  5.  

  6. console.log(...upperizedNames);

  7.  

  8. /* output:

  9. DIMAS WIDY BUCHORI

  10. */


Sedangkan menggunakan arrow function akan tampak seperti ini:

  1. const upperizedNames = ["Dimas", "Widy", "Buchori"]

  2.     .map(name => name.toUpperCase());

  3.  

  4. console.log(...upperizedNames);

  5.  

  6. /* output:

  7. DIMAS WIDY BUCHORI

  8. */


Pada kasus fungsi yang dituliskan dalam satu baris dengan arrow function kita dapat menghapus kata function, tanda kurung, tanda kurawal, kata return, dan semicolon (;). Kita hanya perlu menambahkan tanda panah (=>) di antara parameter dan kode fungsinya.
202003121515581fc4405ca9a25eada9cbaf9598bf18e1.gif
Lihat betapa sederhananya jika kita menggunakan arrow function

Function Parameter

Pada penggunaan arrow function kita melihat bahwa variabel yang diletakan sebelum tanda panah (=>) adalah merupakan parameter dari fungsi. 

  1. // name merupakan parameter dari fungsi

  2. const sayName = name => console.log(`Nama saya ${name}`);


Namun penulisan tersebut hanya berlaku jika fungsi memiliki satu parameter saja. Lantas bagaimana jika kita ingin membuat fungsi yang memiliki lebih dari satu parameter atau tanpa sebuah parameter? Hal itu sangat biasa dilakukan bukan? 
Pada arrow function jika terdapat dua atau lebih parameter fungsi kita perlu membungkusnya dengan tanda kurung seperti ini: 

  1. const sayHello = (name, greet) => console.log(`${greet}, ${name}!`);

  2.  

  3. sayHello("Dimas", "Selamat Pagi")

  4.  

  5. /* output:

  6. Selamat Pagi, Dimas!

  7. */


Namun jika kita sama sekali tidak membutuhkan parameter, biarkan saja tanda kurung tersebut kosong.

  1. const sayHello = () => console.log("Selamat pagi semuanya!");

  2.  

  3. sayHello()

  4.  

  5. /* output:

  6. Selamat pagi semuanya!

  7. */


Atau beberapa developer biasanya mengubah tanda kurung menjadi garis bawah (_) agar penulisannya lebih simpel.

Block Body Function

Fungsi merupakan mini program sehingga sangat mungkin terdapat lebih dari satu logika di dalamnya. Seperti yang kita ketahui bahwa logika-logika pada pemrograman terdiri dari banyak expression ataupun statement
Pada contoh kode arrow function sebelumnya kita hanya menuliskan satu buah expression sehingga penulisannya bisa sangat ringkas. Namun bagaimana jika dalam sebuah fungsi terdapat banyak logika di dalamnya? Apakah bisa dituliskan menggunakan arrow function? Jawabannya tentu bisa!
Sama seperti regular function, arrow function sebenarnya tidak benar-benar menghilangkan tanda kurung kurawal ({ }) dalam penulisannya. Tanda kurung kurawal pun berfungsi sama seperti regular function yakni menampung body function di mana tempat logika fungsi dituliskan. Penulisan tanda kurung kurawal menjadi opsional ketika body fungsi hanya terdiri dari satu expression atau statement saja.
Jika kita butuh lebih dari satu baris dalam body function, kita bisa menuliskannya seperti ini:

  1. const sayHello = language => {

  2.     if(language.toUpperCase() === "INDONESIA") {

  3.         return "Selamat Pagi!";

  4.     } else {

  5.         return "Good Morning!";

  6.     }

  7. }

  8.  

  9. console.log(sayHello("Indonesia"));

  10.  

  11. /* output:

  12. Selamat Pagi!

  13. */


Selain itu juga, kita perlu menuliskan kembali keyword return agar fungsi tersebut dapat mengembalikan nilai

Contoh Rest parameter Dalam Javascript

Rest parameter juga dituliskan menggunakan three consecutive dots (...). Dengan rest parameter, kita dapat menggabungkan beberapa elemen menjadi satu array. Tentu teknik ini sangat bermanfaat ketika kita hendak membuat sebuah variadic function.
Sebagai contoh penggunaanya, mari kita buat sebuah variadic function yang berfungsi untuk menjumlahkan seluruh nilai argument fungsi yang diberikan.

  1. function sum(...numbers) {

  2.     var result = 0;

  3.     for(let number of numbers) {

  4.         result += number

  5.     }

  6.     return result;

  7. }

  8.  

  9. console.log(sum(1,2,3,4,5));

  10.  

  11. /* output

  12. 15

  13. */


Rest parameter juga dapat digunakan pada array destructuring, di mana kita dapat mengelompokkan nilai-nilai array yang terdestruksi pada variabel dalam bentuk array yang lain. Sedikit bingung? Mari lihat contoh kode berikut ini:

  1. const refrigerator = ["Samsung", 50, 2, "milk", "cheese", "egg", "butter"];

  2.  

  3. const [manufacture, weight, door, ...items] = refrigerator;

  4.  

  5. console.log(manufacture);

  6. console.log(weight);

  7. console.log(door);

  8. console.log(items);

  9.  

  10.  

  11. /* output:

  12. Samsung

  13. 50

  14. 2

  15. [ 'milk', 'cheese', 'egg', 'butter' ]

  16. */


Pada kode di atas nilai dari array refrigerator dimasukkan ke individual lokal variabel menggunakan array destructuring. Variabel manufactureweightdoor diberikan nilai index tiga pertama dari array refrigerator, namun variabel items di mana kita menggunakan rest parameter, akan diberikan sisa nilai yang ada sebagai array

Contoh Spreading Operator di Javascript

Spreading operator dituliskan dengan three consecutive dots (....). Sesuai namanya “Spread”,



Inti nya spread operator adalah pelebur array menjadi beberapa elemen yang berbeda

fitur baru ES6 ini digunakan untuk membentangkan nilai array atau lebih tepatnya iterable object menjadi beberapa elements. Mari kita lihat contoh kode berikut:

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2.  

  3. console.log(favorites);

  4.  

  5. /* output:

  6. [ 'Seafood', 'Salad', 'Nugget', 'Soup' ]

  7. */


Pada kode tersebut hasil yang dicetak adalah sebuah array (ditunjukkan dengan tanda [ ]), karena memang kita mencetak nilai favorites itu sendiri. Nah, dengan menggunakan spread operator kita dapat membentangkan nilai – nilai dalam array tersebut.

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2.  

  3. console.log(...favorites);

  4.  

  5. /* output:

  6. Seafood Salad Nugget Soup

  7. */


Terlihat kan perbedaanya? Mengapa bisa demikian? Spread operator bekerja seperti meleburkan nilai array menjadi beberapa elemen sesuai dengan panjang nilai array-nya, sehingga jika kita menuliskan kode seperti ini:

  1. console.log(...favorites);


Sama seperti kita menuliskan kode seperti ini:

  1. console.log(favorites[0], favorites[1], favorites[2], favorites[3]);


Spread operator ini cocok sekali digunakan sebagai nilai parameter pada variadic functions, seperti console.log() atau Math.max().

  1. /* Math.max() -> Mencari nilai terbesar */

  2. const numbers = [12, 32, 90, 12, 32];

  3.  

  4. // Sama seperti kita menuliskan

  5. // console.log(Math.max(numbers[0], numbers[1], numbers[2], numbers[3])

  6.  

  7. console.log(Math.max(...numbers));

  8. /* output

  9. 90

  10. */


Spread operator dapat digunakan untuk menggabungkan dua buah array dalam objek array baru. Jika tidak menggunakan spread operator ini maka hasilnya seperti ini:

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2. const others = ["Cake", "Pie", "Donut"];

  3.  

  4. const allFavorites = [favorites, others]

  5.  

  6. console.log(allFavorites);

  7.  

  8. /* output:

  9. [[ 'Seafood', 'Salad', 'Nugget', 'Soup' ], [ 'Cake', 'Pie', 'Donut' ]]

  10. */


Sayang sekali, nilai array tidak akan tergabung. Alih-alih menggabungkan nilainya, variabel allFavorite menjadi objek array baru yang menampung dua array di dalamnya. Nah lantas bagaimana jika kita mencoba menggunakan spread operator?

  1. const favorites = ["Seafood", "Salad", "Nugget", "Soup"];

  2. const others = ["Cake", "Pie", "Donut"];

  3.  

  4. const allFavorites = [...favorites, ...others]

  5.  

  6. console.log(allFavorites);

  7.  

  8. /* output:

  9. [ 'Seafood', 'Salad', 'Nugget', 'Soup', 'Cake', 'Pie', 'Donut' ]

  10. */


Yups, dengan menggunakan spread operator nilai dari dua array tersebut berhasil tergabung. 

Belajar Babel Loader Javascript ES6

Apa itu  babel  atau  babel.js ? Babel merupakan sebuah transpiler yang bertugas untuk mengubah sintaks JavaScript modern (ES6+) menjadi sin...