Beberapa hari ini saya sempat dipusingkan dengan variable memory dengan type data array atau object yang digandakan ke variable memory yang lain dengan type data yang sama. Tetapi tidak terikat atau bahasa kerennya passing by value. Dan yang terikat bahasa susahnya passing by reference.
Misalnya begini, saya memiliki variable memory myOldArray=["test1","test2","test3"]. Dan saya ingin isi data pada variable tersebut digandakan ke variable memory baru yaitu myNewArray dengan alasan akan mengacak-acak isi di myNewArray tetapi tidak mempengaruhi isi dari myOldArray.
Bila kita hanya menggunakan cara dibawah ini,
var myOldArray=["test1","test2","test3"]; var myNewArray=myOldArray; myNewArray[0]="test5"; alert(myNewArray[0]+" == "+myOldArray[0]);
hasil dari eksekusi script diatas menghasilkan test5 == test5.
Berarti cara di atas adalah passing by reference bukan passing by value. Karena nila pada myOldArray pada urutan 0 (nol) ikut berubah seiring berubahnya nilai pada myNewArray pada urutan 0 (nol).
Sekarang mari kita coba dengan cara yang kedua,
var myOldArray=["test1","test2","test3"]; var myNewArray=myOldArray.slice(0); myNewArray[0]="test5"; alert(myNewArray[0]+" == "+myOldArray[0]);
hasil dari eksekusi script diatas menghasilkan test5 == test1. Wow… berhasil.
Berarti dengan cara diatas menghasilkan array yang passing by value.
Bagaimana bila arraynya campur aduk dan berlevel-level. Mari kita coba dengan script dibawah ini.
var myOldArray=[{anu1:"isianu1",anu2:"isianu2"},["level 1 array 0","level 1 array 1","level1 array 2"],"test1"];
var myNewArray=myOldArray.slice(0);
myNewArray[0]="test5";
alert(myNewArray[0]+" == "+myOldArray[0]);
hasil dari eksekusi script diatas menghasilkan test5 == [object Object]. Wow… berhasil.
Kemudian saya mencoba membuat function asal-asalan seperti dibawah ini,
var clone=function(source)
{
for(var x in source)
{
this[x]=(typeof(source[x]) == "object") ? new clone(source[x]) : source[x];
}
}
dan dicoba menggunakan data diatas menjadi seperti ini,
var myOldArray=[{anu1:"isianu1",anu2:"isianu2"},["level 1 array 0","level 1 array 1","level1 array 2"],"test1"];
var myNewArray=new clone(myOldArray);
myNewArray[0]="test5";
alert(myNewArray[0]+" == "+myOldArray[0]);
hasil dari eksekusi script diatas menghasilkan test5 == [object Object]. Wow… berhasil juga.
Script saya ini mungkin sudah ada yang bikin. Ngga tau lagi yah. Dunia ini kan luas. Kepala juga banyak. Pasti ada yang mendapatkan permasalahan yang sama dengan saya. Dan menemukan sendiri caranya.
Oh ya. Saya ngetestnya menggunakan Firefox.
Monggo. Terserah anda mau menggunakan yang mana.
Semoga membantu.


[...] – bookmarked by 1 members originally found by Silvermorning on 2008-12-08 Javascript : Clone array/object passing by value http://rindudendam.wordpress.com/?p=19 – bookmarked by 3 members originally found by ktinboulder [...]
[...] ini tergantung dengan script saya terdahulu, yaitu Class FError dan Clone Array. Oh ya, hampir lupa tergantung pula dengan Base.js buah karya Dean [...]