引用類型、對象拷貝

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

JS為了便于操作基本類型,提供了3個特殊的引用類型:Boolean/Number和String(基本類型轉引用類型): javascript基本包裝類型介紹

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

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

  var obj1 = {a:1, b:2};
  var obj2 = {a:1, b:2};
  console.log(obj1 == obj2);  //1
  console.log(obj1 = obj2);
  console.log(obj1 == obj2);  //2
  • 第一個為false,因為obj1和obj2的值雖然相同,但是這兩個對象分別保存在堆內存的不同位置,指針各自指向不同的位置
  • 第二個為true,因為obj2將值賦予obj1實際是將存儲在變量中的指針賦予obj1,而這個指針指向同一個堆內存位置

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,因為非引用類型會拷貝并重新創建了一個棧內存空間在原來的a之上
    console.log(bb) // 輸出為2,因為非引用類型會拷貝并重新創建了一個棧內存空間在原來的b之上
    console.log(cc) // 輸出為{ name: 'hello', age: 3 },因為引用類型是通過指針指向對象所存放的位置,直接進行拷貝,則將該指針賦值給cc,所以cc的值和c一樣
    console.log(dd) // 輸出為{1,2,{ name: 'hello', age: 3 }},因為引用類型是通過指針指向對象所存放的位置,直接進行拷貝,則將該指針賦值給dd,所以dd的值和d一樣

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,函數內的局部變量不影響全局變量的值
    console.log(c) //輸出為{ name: 'jirengu', age: 3 },f2進行函數運算后age為3,因為引用類型的特點,所以值改變,而進行f1的函數運算時,由于是單獨提取出age的值進行運算,相當于轉變為非引用類型,所以值不受影響

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

js中splice()的強大(插入、刪除或替換數組的元素)

    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--;
            }
        }
    }
    filter(arr)
    console.log(arr) // [3,1,2]

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

JavaScript中數組slice和splice的對比小結

 方法一:
 var arr = [3,1,0,-1,-3,2,-5]
          var j = 0;
          function filter(arr){
              var newArr = [];
              for(var i = 0; i < arr.length; i++){
                  if(arr[i] >= 0) {
                      newArr[j] = arr[i];
                      j++;
                  }
               }
              return newArr;
          }
          var arr2 = filter(arr)
          console.log(arr2) // [3,1,2]
          console.log(arr)  // [3,1,0,-1,-2,2,-5]

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

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

JS中的hasOwnProperty()和isPrototypeOf()屬性實例詳解

    方法一:
    obj = {
            age:100,
            one: null,
            finder: {
                name: 'jirengu',
                sex: 'nv'
            }
        }

        function copy(obj) {
            var newObj = {};
            for(var key in obj) {
                if(obj.hasOwnProperty(key)) {   // hasOwnProperty 是檢測對象在排除原型鏈的情況下是否具有某個屬性。
                    if(typeof obj[key] === 'number' 
                        || typeof obj[key] === 'boolean' 
                        || typeof obj[key] === 'string' 
                        || typeof obj[key] === 'undefined'
                        || obj[key] === null) {
                        newObj[key] = obj[key];
                    }else{
                        newObj[key] = copy(obj[key]);
                    }
                }
            }
            return newObj;
        }

        var obj3 = copy(obj);
        obj.finder.name = '饑人谷'
        console.log(obj3);

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

推薦閱讀更多精彩內容

  • 1.引用類型有哪些?非引用類型有哪些非引用類型值,即基本類型值(數值,布爾值,undefined,null):指保...
    青鳴閱讀 418評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 非引用類型值,即基本類型值(數值,布爾值,undefined,null):指...
    LINPENGISTHEONE閱讀 217評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 基本類型值(Number、Boolean、string、null和undef...
    saintkl閱讀 364評論 0 0
  • 引用類型有哪些?非引用類型有哪些 基本類型值(Undefined、Null、Boolean、Number和Stri...
    jamesXiao_閱讀 159評論 0 0
  • 1.引用類型有哪些?非引用類型有哪些 基本類型(數值、布爾值、null、undefined):指的是保存在棧內存中...
    我七閱讀 161評論 0 0