引用類型和對象拷貝

引用類型有哪些?非引用類型?

  • 基本類型
    Number、String、Boolean、Null、Undefined
  • 引用類型
    Array、Function、Object、RegExp

如下代碼輸出什么?為什么

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  //false,兩個操作數都是對象,但它們指向的不是同一個對象
console.log(obj1 = obj2);  //a:1,b:2,兩個變量相互復制引用類型時,指針會指向同一對象
console.log(obj1 == obj2);  //true, 由于兩個變量引用的都是同一個對象,所以返回真

如下代碼輸出什么? 為什么

var a = 1
var b = 2
var c = { name: '饑人谷', age: 2 }
var d = [a, b, c]

var aa = a
var bb = b
var cc = c
var dd = d

a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3

console.log(aa)   //aa=1 , 非引用類型,只復制操作數的值而非地址
console.log(bb)   //bb=2 , 非引用類型,只復制操作數的值而非地址
console.log(cc)   //name:'hello',age: 3 , c是引用類型,所以cc與c指向同一個對象,從而改變對象屬性后,另一個也發生相應變化。
console.log(dd)  //a=1 b=2 name:'hello' age=3 , d也是引用類型,在下面重新對a,b賦值之前d已經完成了對a,b變量值的復制,所以之后的賦值對d不造成影響;由于c是引用類型,所以數組中的c與變量c所指的對象為同一對象(指向同一地址),改變會同時發生。

如下代碼輸出什么? 為什么

var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
  ++n
}
function f2(obj){
  ++obj.age
}

f1(a) 
f2(c) 
f1(c.age) 
console.log(a)   //a=1, a是基本類型,調用函數f1時,a作為參數,只是將變量值復制給n,所以n++對其無影響
console.log(c)   //name: 'jirengu',age: 3 , c是引用類型,調用函數f2時,將整個c對象當做參數復制過去,使得函數中的參數與c指向同一個對象,所以對其age屬性加一操作會改變變量c對象的age屬性值;而調用函數f1時只是將對象中的age屬性作為參數復制過去,函數體中的操作對原來對象的age屬性不造成影響

過濾如下數組,只保留正數,直接在原數組上操作

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
    for( var i=0; i<=arr.length; i++){
        if(arr[i]<1){
            arr.splice(i,1);
            filter(arr);
        }
        
    }
    return arr
}
filter(arr)
console.log(arr)

過濾如下數組,只保留正數,原數組不變,生成新數組

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr) {
    var newarr = []
    var n=0
     for( var i in arr) {
        if(arr[i]>0){
            newarr[n++] =arr[i]
        }
    }
    return newarr
}
var arr2=filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]

寫一個深拷貝函數,用兩種方式實現

//第一種方式
function copy(obj) {
    var newObj ={}
    for(var key in obj) {
        if(obj.hasOwnProperty(key)) {
            if(typeof obj[key] ==='number' || typeof obj[key] ==='string' || typeof obj[key] ==='boolean' || obj[key] === null || obj[key] === undefined) {
            newObj[key] = obj[key]
            } else {
                    newObj[key] = copy(obj[key]) 
               }
       } 
    }
} 

//第二種方式

function deepCopy() {
    var newObj = {};
    newObj = JASON.parse(JASON.stringify(oldObj));
    return newObj;
}
var obj2=deepCopy(oldObj);
console.log(obj2)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容