js引用類型

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

  • 基本類型值(數(shù)值、布爾值、null和undefined、string和symbol):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段;
  • 引用類型值(Object, Array, Function, Date, Math, RegExp, Error):指的是那些保存在堆內(nèi)存中的對象,變量中保存的實際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置,由該位置保存對象

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

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
  • obj1 == obj2是判斷兩個變量是否相等;由于對對象聲明變量,變量實際保存的是對象在內(nèi)存中的位置的指針;所以是聲明的是兩個指針,故不相等。
  • obj1 = obj2;是把obj2的指針賦值給obj1,同時,他們指向同一塊內(nèi)存。所以,輸出obj1的值就是obj2的對象。
  • 之前由于obj1 = obj2,把obj2的指針賦值給obj1,所以他們是相等的,結果為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) //1
console.log(bb) //2
console.log(cc) //{ name: 'hello', age: 3 }
console.log(dd)//[1,2,{age:3,name:'hello'}]

因為a、b是基本類型值,因此a =aa =1,b = bb =2,所以他們打印1和2。c、d是引用類型值,c、cc,d、dd共享各共享同一個內(nèi)存地址。由于c.name ='hello',所以c和cc的name屬性值都被改為'hello',由于d將c對象里面的age屬性改為3,他們共用一個地址,所以cc的age屬性也被改為3,因此c打印為{ name: 'hello', age: 3 }。而d[2]['age'] = 3即是給數(shù)組里c對象的age屬性改為3;因此d打印為[1,2,{age:3,name:'hello'}]

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

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)
  1. a=1;
    執(zhí)行函數(shù)f1(a),在f1(n)函數(shù)中,發(fā)生了,var n = a,所以++n實際上是n=++n,并沒有對a的值做出改變。故a=1。

  2. {name:'jirengu',age:3};
    當執(zhí)f2(c)時,在f2(obj)函數(shù)中,發(fā)生了,var obj=c,即c變量是把指針賦值給obj了,令這兩個變量指向同一個內(nèi)存。當++obj.age,執(zhí)行的是對age屬性的值加1,故變量c的指針指向的內(nèi)存的值發(fā)生改變,因此age加1了。

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

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); //刪掉一個元素后,后一個元素的index-1  如不執(zhí)行i--  連續(xù)的兩個符合條件的元素會遺漏掉第二個
            i--
            filter(arr);

        }
    }
}
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 newArr = []
    for(var i=0;i<arr.length;i++){
        if(arr[i]>0){
            newArr.push(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 filter(arr){
    var newArr = [];
    var j = 0;
    for(var i = 0;i < arr.length;i++){
        if (arr[i] > 0) {
            newArr[j] = arr[i];
            j++;
        }
    }
    return newArr;
}

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

淺拷貝:只拷貝對象的基本類型值,如果某一個屬性是引用類型值,拷貝的就是這個引用類型的指針。當原對象的引用類型值發(fā)生改變,則淺拷貝后的新對象的引用類型值也會發(fā)生改變,但非引用類型值不變。

深拷貝:拷貝對象的所有屬性,無論是引用類型值還是非引用類型值,拷貝之后的新對象,與原對象沒有任何關系。

第一種、第二種都是遞歸,只不過判斷條件略微不同.,一個是判斷是否是引用類型值,但是要排除null,因此不能簡單的用typeof判斷,但是用instanceof的時候一定要排除公有屬性,這個跟原型鏈有關。typeof這個問題值得注意...另一個是判斷是否是基本類型值,缺點是要羅列的有點多...

//第一種
var obj1 = {
        name: 'a',
        age: 2,
        dcbryant: {
            name: 'bryant',
            age: null
        }
    }
//其實深拷貝本質上就比淺拷貝多了一個遞歸,拷貝那些未被拷貝的引用屬性。
 function copy (obj) {
 var newObj = {};
 for (var i in obj) {
     if (obj.hasOwnProperty(i)) {
         if(obj[i] instanceof Object){
             newObj[i] = copy(obj[i]);
         }else{
             newObj[i] = obj[i];
         }
     }
 }
 return newObj;
}
 var obj2 = copy(obj1)
 console.log(obj2)
//第二種
var obj1 = {
        name: 'a',
        age: 2,
        dcbryant: {
            name: 'bryant',
            age: null
        }
    }
function copy(obj) {
    var newObj = {};
    for(var i in obj){
        if (obj.hasOwnProperty(i)) {
            var value = obj[i];
                        //是
            if (typeof value === "number" ||
         typeof value === "symbol"  ||                              
                typeof value === "boolean" ||
                typeof value === "string" ||
                value === undefined ||
                value === null ){
                newObj[i] = value;
            }else{
                newObj[i] = copy(value);
            }
        }
    }
        return newObj;
}
 var obj2 = copy(obj1)
 console.log(obj2)
//第三種
var obj1 = {
        name: 'a',
        age: 2,
        dcbryant: {
            name: 'bryant',
            age: null
        }
    }
 function copy(obj){
        var newobj = JSON.parse(JSON.stringify(obj));
        return newobj;
 }
 var obj2 = copy(obj1)
 console.log(obj2)

再加一個淺拷貝...

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

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

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