摘要: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,可以指定遇到屬性還是物件的時候遞迴呼叫。
但是沒造過輪子怎麼知道會遇到哪些糟糕的路面呢?(硬是想合理化…)