引用類型對象拷貝(進階4)

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

  • 引用類型包括:數組、對象、正則、函數
  • 非引用類型(即基本類型):數值、布爾值、null、undefined和Symbol(ES6)

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

Paste_Image.png
  • 輸出:
    false [object Object] { a: 1, b: 2 } true
  • 原因:
    var obj1 = {a:1, b:2};//0x0001 var obj2 = {a:1, b:2};//0x0002 //此時,obj1和obj2是兩個對象,所保存的地址不一樣,輸出false console.log(obj1 == obj2); //obj1=obj2: 讓obj1和obj2指向一個內存地址,輸出0x0002地址的數據 console.log(obj1 = obj2); //此時,obj1和obj2保存的地址都是0x0002,輸出true console.log(obj1 == obj2);

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

Paste_Image.png
  • 輸出:
    1 2 [object Object]{ name: 'hello', age: 3 } [1,2,[object Object]{ name: 'hello', age: 3 }]
  • 緣由:
    1.aa和bb都是基本類型數據,變量保存的是棧內存地址,改變a的值和aa沒有關系; 2.cc和dd都是引用類型,變量保存的是堆內存地址(相當于保存遙遠內存區段的地址),改變對象的屬性值只是改變對象指向的內存區段里的數據,所以對象保存地址不變,輸出仍是地址指向的內存區段里面的數據;這時由于name和age兩個屬性值變化,所以輸出內容有所變化。

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

Paste_Image.png
  • 輸出
    1 [object Object]{ name: 'jirengu', age: 3 }
  • 原因:
    • 函數f1里面的n是新的變量,和a沒有關系(a仍為1)
    • 函數f2里面的obj保存的地址和c的地址一樣,改變這個地址指向的內容age的值 也就是改變了c對象的屬性age值(所以age=3)
    • 函數f1(c.age)和f1(a)一樣,函數里面的變量n是一個新的變量,與原來的變量沒有關系(所以age仍為3)

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

Paste_Image.png
function filter(arr){
  for(let i=arr.length-1;i>=0;i--) {
    if(arr[i]<=0){
      arr.splice(i,1);
    }
  }
}

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

Paste_Image.png
function filter(arr) {
  let newArr = [];
  //ES5
  for (let key in arr) {
    if (arr[key] > 0) {
      newArr.push(arr[key]);
    }
  }
  //ES6
  //   for(let [key,value] of arr.entries()) {
  //     if(value>0){
  //       newArr.push(value);
  //     }
  //   }
  //ES8的方法
  //   for(let value of Object.values(arr)) {
  //     if(value>0){
  //       newArr.push(value);
  //     }
  //   }
  return newArr;
}

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

//淺拷貝
const f1 = (obj) => {
  let newObj = {};
  for(let key in obj){
    newObj[key] = obj[key];
  }
//   es8引入了跟Object.keys配套的Object.values和Object.entries,作為遍歷一個對象的補充手段。
//   for(let [key,value] of Object.entries(obj)){
//     newObj[key] = value;
//   }
  return newObj;
}
//深拷貝
const f2 = (obj) => {
  let newObj = {};
  for(let key in obj) {
    if(typeof obj[key] === "object"){
      newObj[key] = f2(obj[key]);
    } else {
      newObj[key] = obj[key];
    }
  }
//   es8引入了跟Object.keys配套的Object.values和Object.entries,作為遍歷一個對象的補充手段。
//   for(let [key,value] of Object.entries(obj)){
//     if(typeof obj[key] === "object"){
//       newObj[key] = f2(value);
//     } else {
//       newObj[key] = obj[value];
//     }
//   }
  return newObj;
}

深拷貝和淺拷貝的區別: 1.深拷貝是完全拷貝,不但對象地址變了,對象的內部屬相對象(或其它引用類型)的地址也變了;改動其中一個對象的屬性對象的屬性值,另外一個不變。 2.淺拷貝中:新對象的內部屬性對象和原對象內部屬性對象的地址一樣;改動其中一個對象的屬性對象的屬性值,另外一個也同時變化。 深拷貝和淺拷貝的相同點: 對于對象中的基本數據類型值,執行兩種拷貝效果一致。拷貝后改動其中一個對象,另外一個不變

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.引用類型有哪些?非引用類型有哪些 基本類型值(數值、布爾值、null和undefined):指的是保存在棧內存...
    Feiyu_有貓病閱讀 266評論 0 0
  • 引用類型有哪些?非引用類型有哪些? JS中的數據類型分為基本類型和引用類型。基本類型:數值(number)、字符串...
    LeeoZz閱讀 275評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些2.如下代碼輸出什么?為什么? var obj1 = {a:1, b:2}; ...
    Rising_suns閱讀 254評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 引用類型: 對象 object 數組 函數 正則非引用類型...
    怎么昵稱閱讀 253評論 0 0
  • 糖醋排骨 粉蒸肉 1、五花肉切片洗凈 2、加蒸肉粉、老抽捏均勻 3、放電壓力鍋蒸,按煮飯按鈕 紅燒肉燒山芋圓子 1...
    Hedy639閱讀 279評論 0 1