摘要:JavaScript jQuery.extend
JavaScript使用 = 設定變數的時候,對於原生資料型態會產生複本,變動不會影響到原本的值;但對於陣列、物件的指定卻是直接參考原本的物件。
var s1="aa", s2=s1; console.log(s1, s2);//aa aa s2="bb" console.log(s1, s2);//aa bb var a=[1,2,3], b=a console.log(a,b)// [1, 2, 3] [1, 2, 3] b.push(4) console.log(a,b)// [1, 2, 3, 4] [1, 2, 3, 4] b=[] console.log(a,b)// [1, 2, 3, 4] [] b.push(5) console.log(a,b)// [1, 2, 3, 4] [5] //solution var c=Array.prototype.slice.call(a) console.log(a,c)// [1, 2, 3, 4] [1, 2, 3, 4] c.push(6) console.log(a,c)// [1, 2, 3, 4] [1, 2, 3, 4, 6] var o1={1:2, 3:4}, o2=o1 console.log(o1,o2)// Object { 1=2, more...} Object { 1=2, more...} o2[1]=3 console.log(o1,o2)// Object { 1=3, more...} Object { 1=3, more...} //solution function clone_obj(obj){ var copyObj={}; for(var p in obj){ copyObj[p]=obj[p] } return copyObj; } var o3=clone_obj(o1) console.log(o1,o3)// Object { 1=3, more...} Object { 1=3, more...} o3[1]=4 console.log(o1,o3)// Object { 1=3, more...} Object { 1=4, more...}
如果屬性還是物件呢?
var o4={a:{b:'c'}}, o5=clone_obj(o4) console.log(o4.a.b, o5.a.b)// c c o5.a.b='d' console.log(o4.a.b, o5.a.b)// d d
我不要再造輪子了XD,jQuery愛護您的腦細胞。$.extend(true, cloneTo, cloneFrom),jQuery.extend的第一個參數 deep,可以指定遇到屬性還是物件的時候遞迴呼叫。
但是沒造過輪子怎麼知道會遇到哪些糟糕的路面呢?(硬是想合理化…)