20170106

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

引用類型:
(對象,數(shù)組,函數(shù),正則):指的是那些保存在堆內(nèi)存中的對象,變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對象。

非引用類型:
(Number,String,Boolean,Null,Undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段。

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

var a = 1
var b = 2
var c = { name: 'jirengu', 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, {name: 'hello', age: 3}]

原因:
a, b 都是基本類型,在賦值基本類型值的時(shí)候會開辟出一個(gè)新的內(nèi)存空間,將值賦值到新的內(nèi)存空間,賦值完成之后如果再次改變原來的a,b的值,這時(shí)候只會改變原來的a和b的值,而不會影響到已經(jīng)賦值到新內(nèi)存中的值即aa和bb,所以console.log(aa)輸出為1,console.log(bb)輸出為2。
c和d是引用類型,把c賦值給cc,賦值的只是指向存儲對象內(nèi)存的地址即賦值的是地址!所以賦值完成之后,改變c的值時(shí),cc中的值也同樣會改變。dd和cc一樣同理。

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

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}
原因:
函數(shù)在傳遞參數(shù)的時(shí)候會隱式的創(chuàng)建一個(gè)局部變量,這個(gè)局部變量的值就是傳入?yún)?shù)的值,所以以上代碼會變成下面這樣:
function f1(a) {
    var n = a;
    ++n // 執(zhí)行到這里時(shí)n變?yōu)?,a的值不變。因?yàn)閍是基本類型,當(dāng)把a(bǔ)賦值給b后,b的值改變時(shí),a的值不會受影響。
}
function f2(c)  {
    var obj = c; 
    ++obj.age //相當(dāng)于++c.age,此時(shí)c.age的值變?yōu)?;這是因?yàn)閏是引用類型,當(dāng)把c賦值給obj,賦值的是一個(gè)地址,即指向該存儲數(shù)據(jù)內(nèi)存空間的地址。所以當(dāng)obj.age改變時(shí)c.age也會跟著改變。
}
function f1(c.age) {
    var n = c.age;   // n =3;
    ++n; // n=4,c.age不變。因?yàn)閏.age的值是基本類型,把c.age賦值給n,n改變但c.age不會改變。
}

  • 過濾如下數(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);
            filter(arr);
        }
    }
    return arr;
}
filter(arr);
console.log(arr);
  • 過濾如下數(shù)組,只保留正數(shù),原數(shù)組不變,生成新數(shù)組

var arr = [3,1,0,-1,-3,2,-5];
function filter(arr){
    var arr2 = [];
    for(var i = 0; i < arr.length; i++){
        if(arr[i] > 0){
            arr2.splice(i, 0, arr[i]);
        }
    }
    return arr2;
}
var arr2 = filter(arr);
console.log(arr2);
console.log(arr);
  • 寫一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)

文章著作權(quán)歸饑人谷_sunny和饑人谷所有,轉(zhuǎn)載須說明來源

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

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,270評論 0 4
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,366評論 11 349
  • 幾十個(gè)人一起面試呢,HR和大家都挺嚴(yán)肅的。然后,就按照正常程序一個(gè)人一個(gè)人面試過去。到了一個(gè)女生的時(shí)候,女生就說:...
    cf74dce03c89閱讀 266評論 1 1
  • 暮晚風(fēng)清 牧師先將這一節(jié)念了一遍:“你們盡力從這窄門進(jìn)來吧,因?yàn)閷掗T和寬路通向地獄,進(jìn)去的人很多;然而,窄門和窄路...
    意不適閱讀 2,673評論 0 0