引用類型和對象拷貝

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

JS 中分基本類型和引用類型。

  • 基本類型值(數(shù)值、布爾值、字符串、null和undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段;
  • 引用類型值(對象、數(shù)組、函數(shù)、正則):指的是那些保存在堆內(nèi)存中的對象,變量中保存的實際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置,由該位置保存對象

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

題目

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);

結(jié)果

false
{a: 1, b: 2}
true
//對象是引用類型,上面代碼創(chuàng)建了兩個對象,雖然內(nèi)容相同,但實際上兩個對象是指向不同內(nèi)存空間的,因此并不相同。但當(dāng) obj1 = obj2 賦值操作之后,相當(dāng)于把 obj2 的指針賦給了 obj1,因此,它們現(xiàn)在相同了。

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

題目

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) 
console.log(bb) 
console.log(cc)
console.log(dd)

結(jié)果

//輸出
1
2
{name: 'hello', age: 3}
[1, 2, {name: 'hello', age: 3}]

//對象和數(shù)組是引用類型,所以不新開辟空間的話,怎么修改值,都會影響所有引用到的變量。

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

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) 
console.log(c)

結(jié)果

//輸出
1
{ name: 'jirengu', age: 3 }

//f1 中,在傳進(jìn)函數(shù)的參數(shù)里,傳參相當(dāng)于聲明了一個新的變量,同時該對象是基本類型,因此改變傳遞參數(shù)的值并不會影響原來的值。
//f2 中,傳參是引用類型,哪怕新聲明了一個變量,但指針還是原來對象,因此改變傳參會影響到原來數(shù)值。

五、過濾如下數(shù)組,只保留正數(shù),直接在原數(shù)組上操作

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){

  //在這下面寫代碼
  for(var n = 0; n < arr.length; n++){
    if(arr[n] <= 0){
      arr.splice(n, 1)
      //因為是直接在原數(shù)組上操作,所以每次刪除一個值的時候,原數(shù)組的 length 也被改變了,索引減一才能正確表示下一個值
      n--
    }
  }
  //在這上面寫代碼
}
filter(arr)
console.log(arr) // [3,1,2]

六、過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){

  //在這下面寫代碼
  
  var tmp = []
  for(var n = 0; n < arr.length; n++){
    if(arr[n] > 0){
      tmp.push(arr[n])
    }
  }
  return tmp

  //在這上面寫代碼
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]

七、寫一個深拷貝函數(shù),用兩種方式實現(xiàn)

1. 遞歸

function isFundamentalType(value){
  if(typeof value === 'number' || typeof value === 'string' || typeof value === 'boolean' || value === undefined || value === null){
    return true
  }else {
    return false
  }
}

function deepCopy(obj){
  var newObj = {}
  for(attr in obj){
    if(obj.hasOwnProperty(attr)){
      if(isFundamentalType(obj[attr])){
        newObj[attr] = obj[attr]
      }else {
        newObj[attr] = deepCopy(obj[attr])
      }
    }
  }
  return newObj
}

var obj = {name: 'SHINING', sex: 'male', friends: {name: 'cool'}}

var newObj = deepCopy(obj)

console.log(newObj)

2. 先轉(zhuǎn)換成基本類型(字符串),后還原成對象

function deepCopy(obj){
  var str = JSON.stringify(obj)
  return JSON.parse(str)
}

var obj = {name: 'SHINING', sex: 'male', friends: {name: 'cool'}}

var newObj = deepCopy(obj)

console.log(newObj)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 引用類型有哪些,非引用類型有哪些? 基本類型(非引用類型):Number, String, Boolean,...
    _達(dá)斯基閱讀 293評論 0 0
  • 引用類型和非引用類型 基本類型值(number、boolean、string、null、undefined):指的...
    Joey的企鵝閱讀 206評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 引用類型:數(shù)組,對象,函數(shù),正則.引用類型是指實質(zhì)內(nèi)容保存在堆內(nèi)存,棧內(nèi)存只...
    饑人谷_張世鈞閱讀 207評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 基本類型值「非引用類型」(數(shù)值、布爾值、null和undefined,str...
    來人啊都給朕退下吧閱讀 227評論 0 0
  • 我想我有兩個我,或許像你像赤火,又或像她像溫玫:一個炙熱濃烈,一個極致敏感。只是,我能感受她,她能感受我,就這樣,...
    侑生之年閱讀 246評論 0 1

友情鏈接更多精彩內(nèi)容