Selasa, 09 Agustus 2016

Bug Javascript? Masalah ketika mecopy isi array ke variable lain

Assallamualaikum,

Apakabar kawan,
Kali ini saya mau share sesuatu ya gak begitu terlalu penting sih tapi ini benar2 bikin saya bingung -_- ketika proses development.

Apa itu ?
ok kita mulai aja ya,

Problem :
Ceritanya gini saya mau copy nilai variable ke variable lain untuk menjadi temporary / bakcup. Nah masalah bermula tapi sebelum kita masuk ke masalah tersebut kita lihat yang berikut.



Logika sederhana

var a = 5;
var b = a;
a = 7;

alert(a);
alert(b);

kira-kira berapa nilai a ? lalu berapa nilai b ?
coba disini https://jsfiddle.net/derryberni/zc4dfcn1/

nah benar jawabannya adalah a = 7 dan b = 5.

Lalu bagaimana ketika kita isi variable tersebut disi sebuah array dan mengubah nilainya ?

Contoh :

var a = [0,1,2];
var b = a;
a.splice(0, 1);

alert(a);
alert(b);

Nah berapakah isi dari variable a dan b ? Apa itu splice ?

ini kata w3school => splice adalah fungsi yang digunakan untuk menambah / mengurangi isi sebuah array

Ketika kita melihat contoh diatas sepintas isi dari variable a seharusnya adalah [1,2] dan variable b [0,1,2]

namun apa yang terjadi ?

silahkan dicoba di url berikut :
https://jsfiddle.net/derryberni/5vhgv048/

nah ternyata setelah dirun
variable a : [1,2]
variable b : [1,2]

kenapa ya ?

Berikut penjelasannya

Ketika kita mecopy sebuah nilai variable ke variable lainnya maka memang isinya tercopy ini berlaku bagi tipe data (integer, float dkk), nah ketika array diinisiasi ke sebuah variable kita mengenal istilah *copy by references yang sebenarnya dia tidak benar2 isinya tercopy namun kondisinya menjadi b references a yang mana b mereferensi isi dari a.

Solusinya ?

cukup menambahkan berikut

var a = [0,1,2];
var b = a.slice(0); //tambahkan slice(0)
a.splice(0, 1);

alert(a);
alert(b);

Berikut sample codenya :

https://jsfiddle.net/derryberni/f9e951q4/


Kesimpulannya adalah
Bukanlah bug hanya ketidaktahuan kita terhadap problem tersebut :)

Berikut referensi problem diatas ^_^
http://stackoverflow.com/questions/14170205/splice-is-affecting-previously-copied-variables

Semoga Bermanfaat.
Terimakasih :)