JavaScript jQuery.extend

  • 1635
  • 0

摘要: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,可以指定遇到屬性還是物件的時候遞迴呼叫。

但是沒造過輪子怎麼知道會遇到哪些糟糕的路面呢?(硬是想合理化…)