引用類型對象拷貝

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

引用類型是指那些保存在堆內存中的對象,變量中保存的實際上只是一個指針,這個指針執行內存中的另一個位置,由該位置保存對象。
非引用類型是指保存在棧內存中的簡單數據段。

  • 非引用類型:數值,布爾,字符串,null和undefined
  • 引用類型:對象,數組,函數,正則表達式

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

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false ,因為兩個對象的存儲地址不相同
console.log(obj1 = obj2); //Object {a: 1, b: 2} obj2地址賦給了obj1
console.log(obj1 == obj2);//true, 兩個對象指向地址相同

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

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) //1 基本類型直接賦值
console.log(bb) //2 基本類型直接賦值
console.log(cc) //  { name: 'hello', age: 3 } var cc = c 是將c的對象地址賦給cc,var d = [a, b, c]也是將c對象的地址賦值給d數組中的c變量,var dd = d是將d的數組地址復制給dd;所以任意對c的改變都會反應到有c的地址的對象中。
console.log(dd)//[1, 2, { name: 'hello', age: 3 }]// 基本類型直接賦值,dd中的a b為初始a b的值

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

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); //1 沒有函數對a進行增減,f1只是讀取a的值,復制給了n,n!=a
console.log(c); // Object {name: "jirengu", age: 3} f2函數讀取了c對象的地址,并且將對應地址的age的值+1; f1函數只是讀取了c對象age的值,復制給了n.

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

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

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

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

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

方法1:
var arr = [3,1,0,-1,-3,2,-5,[1,2]];
function deepCopy(obj) {
    var b = [];
    for (key in obj) {
        if (typeof obj[key] === 'object'){
            b[key]=deepCopy(obj[key]);
        }else if(typeof obj[key] === 'number'||typeof obj[key] === 'string'||typeof obj[key] === 'boolean'||obj[key] === undefined || obj[key] === null){
            b[key]=obj[key];
        }
    }
    return b;
}
var arr2 = deepCopy(arr);
arr[7][1]=6;
console.log(arr2) ;// [ 3, 1, 0, -1, -3, 2, -5, [ 1, 2 ] ]
console.log(arr) ; //[ 3, 1, 0, -1, -3, 2, -5, [ 1, 6 ] ]
方法2:
var arr = [3,1,0,-1,-3,2,-5,[1,2]];
var b = JSON.parse( JSON.stringify(arr) );
arr[7][1]=6;
console.log(b) ;// [ 3, 1, 0, -1, -3, 2, -5, [ 1, 2 ] ]
console.log(arr) ; // [ 3, 1, 0, -1, -3, 2, -5, [ 1, 6 ] ]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.引用類型有哪些?非引用類型有哪些非引用類型值,即基本類型值(數值,布爾值,undefined,null):指保...
    青鳴閱讀 420評論 0 0
  • 引用類型 引用類型變量保存的僅僅是一個指針,指針指向堆內存中保存對象的位置。 所以基本類型復制的時候僅僅復制值,復...
    DeeJay_Y閱讀 586評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 基本類型值(Number、Boolean、string、null和undef...
    saintkl閱讀 365評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 基本類型值(數值、布爾值、null和undefined):指的是保存在棧內存...
    Feiyu_有貓病閱讀 268評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 ECMA Script中規定,javascript的基本數據類型分為兩類,即...
    66dong66閱讀 312評論 0 0