引用類型與對象拷貝

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

  • 引用類型:
    Object、Array屑咳、Date萨赁、RegExp、Function兆龙、Math杖爽、Global、Error紫皇,指的是保存在堆內(nèi)存中的對象慰安。當(dāng)復(fù)制保存對象的某個變量時操作的是對象的引用,也就是指向該對象在內(nèi)存中所在位置的指針聪铺,為對象添加屬性時操作的是實際的對象化焕,引用類型的值按引用訪問。

  • 三個特殊的引用類型:
    Boolean铃剔、Number撒桨、String:也叫基本包裝類型,每當(dāng)讀取一個基本類型值時键兜,后臺會創(chuàng)建一個對應(yīng)的基本包裝類型的對象元莫,從而讓我們能調(diào)用一些方法來操作這些數(shù)據(jù)。
    不建議顯式地創(chuàng)造基本包裝類型對象蝶押。

  • 基本類型(非引用類型):
    string、boolean火欧、null棋电、undefined、number苇侵、symbol赶盔,這六種基本類型指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段,基本類型的值按值訪問榆浓。

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

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  //false 原因:變量obj1和obj2中保存的是指向?qū)ο笤趦?nèi)存中位置的指針,也就是說obj1和obj2引用的是堆內(nèi)不同的兩個對象,所以不相等烘浦,返回false
console.log(obj1 = obj2);  //{a:1,b:2} 原因:賦值操作抖坪,也就是obj2將儲存在變量對象中的值(即指向?qū)ο笪恢玫闹羔槪?fù)制了一份放到obj1的內(nèi)存空間中,這時obj1和obj2都指向堆內(nèi)的同一個對象
console.log(obj1 == obj2);  //true 指向同一個對象了所以再判斷相當(dāng)與否就返回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 //復(fù)制指針
var dd = d //復(fù)制指針

a = 11
b = 22
c.name = 'hello' //改變堆內(nèi)存中c.name值為hello
d[2]['age'] = 3 //改變堆內(nèi)存中c.age值為3
console.log(aa)     //1 原因:a是基本類型值闷叉,按值傳遞給aa擦俐,所以aa為1,之后除非顯式地指明aa=11握侧,打印的aa就是11蚯瞧,不然aa得到的就是a的值1,不會再改變品擎。如果把a=11放到var aa=a前面去埋合,打印aa也是11,以下打印bb原理相同所以不作解釋萄传。
console.log(bb)     //2 原因:b是基本類型值甚颂,按值傳遞給bb,所以bb為2
console.log(cc)    //{name:"hello",age:3} 原因:c是引用類型的值盲再,值按引用訪問西设,首先將變量c指向堆內(nèi)對象位置的指針復(fù)制給了cc,所以cc與c引用的是同一個對象答朋,接著變量c的name屬性值被修改為"hello"贷揽,d[2]['age']=3意為將數(shù)組d中索引為2的項,也就是變量c的age屬性的值修改為3梦碗,由于指針相同禽绪,cc也可以訪問到c的屬性和修改后的值,所以打印cc得到{name:"hello",age:3} 
console.log(dd)    //[1,2,{name:"hello",age:3}] 原因:d也是引用類型的值洪规,賦值操作后dd和d引用的是內(nèi)存中的同一對象印屁,a和b是基本類型按值傳遞,dd指針指向的內(nèi)存中保存的c的值已經(jīng)改變斩例,使用修改之后的值雄人。

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

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 原因:調(diào)用f1(a),實際上是向f1(n)函數(shù)內(nèi)傳遞了一個參數(shù)a念赶,而a是基本類型础钠,值為1,所以實際上f1內(nèi)發(fā)生的是n = a = 1叉谜,所以++n和a沒關(guān)系旗吁,打印出來的a的值沒變化
console.log(c) //{name:"jirengu",age:3} 原因:c是引用類型的值,調(diào)用f2(c)停局,即將變量c指向堆內(nèi)對象位置的指針當(dāng)作參數(shù)傳遞給函數(shù)f2(obj)很钓,實際上在f2內(nèi)發(fā)生的是obj=c={name:"jirengu",age:2}香府,這兩個變量就指向同一內(nèi)存,接著執(zhí)行++c.age码倦,即++2企孩,執(zhí)行完畢后age值變?yōu)?,所以obj{name:"jirengu",age:3}叹洲,obj和c引用的是同一對象所以c可以訪問到修改后的值柠硕,所以打印c得到和obj相同的結(jié)果{name:"jirengu",age:3}

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

function filter(array) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] <= 0) {
            array.splice(i, 1)//刪除數(shù)組第I項位置的值
            i-- //每刪除一項蝗柔,數(shù)組長度就減1,所以為了得到正確的結(jié)果必須加上i--
        }
    }
    return array
}
var array = [3, 1, 0, -1, -3, 2, -5]
console.log(filter(array))//[3,1,2]

過濾如下數(shù)組民泵,只保留正數(shù)癣丧,原數(shù)組不變,生成新數(shù)組

function filter(array) {
    var res = []
    array.forEach(function (element) {
        if (element > 0) res.push(element)
    }, this);
    return res
}
var array = [3, 1, 0, -1, -3, 2, -5]
console.log(filter(array))//[3,1,2]
console.log(array)//[3, 1, 0, -1, -3, 2, -5]

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

淺拷貝與深拷貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胁编,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳞尔,更是在濱河造成了極大的恐慌嬉橙,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寥假,死亡現(xiàn)場離奇詭異市框,居然都是意外死亡,警方通過查閱死者的電腦和手機糕韧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門枫振,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萤彩,你說我怎么就攤上這事粪滤。” “怎么了雀扶?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵杖小,是天一觀的道長。 經(jīng)常有香客問我愚墓,道長窍侧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任转绷,我火速辦了婚禮,結(jié)果婚禮上硼啤,老公的妹妹穿的比我還像新娘议经。我一直安慰自己斧账,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布煞肾。 她就那樣靜靜地躺著咧织,像睡著了一般。 火紅的嫁衣襯著肌膚如雪籍救。 梳的紋絲不亂的頭發(fā)上习绢,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音蝙昙,去河邊找鬼闪萄。 笑死,一個胖子當(dāng)著我的面吹牛奇颠,可吹牛的內(nèi)容都是我干的败去。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烈拒,長吁一口氣:“原來是場噩夢啊……” “哼圆裕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荆几,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤吓妆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吨铸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體行拢,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年焊傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了剂陡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狐胎,死狀恐怖鸭栖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情握巢,我是刑警寧澤晕鹊,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站暴浦,受9級特大地震影響溅话,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歌焦,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一飞几、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独撇,春花似錦屑墨、人聲如沸躁锁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽战转。三九已至,卻和暖如春以躯,著一層夾襖步出監(jiān)牢的瞬間槐秧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工忧设, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刁标,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓见转,卻偏偏與公主長得像命雀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斩箫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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

  • 基本類型和引用類型# ECMAScript包含兩種不同的數(shù)據(jù)類型:基本類型值和引用類型值; 基本類型值指的是保存在...
    草鞋弟閱讀 497評論 0 0
  • 1.引用類型有哪些吏砂?非引用類型有哪些引用類型:Object / Array / Function / Date /...
    任少鵬閱讀 202評論 0 0
  • 引用類型有哪些?非引用類型有哪些乘客? JS中的數(shù)據(jù)類型分為基本類型和引用類型狐血。基本類型:數(shù)值(number)易核、字符串...
    LeeoZz閱讀 268評論 0 0
  • 1.引用類型有哪些匈织?非引用類型有哪些? 引用類型:對象牡直、數(shù)組缀匕、函數(shù)、正則表達式非引用類型:數(shù)值碰逸、字符串乡小、布爾值、n...
    BAWScipes閱讀 174評論 0 0
  • 當(dāng)下的你是否也感覺自己每天忙忙碌碌呢?你找到最重要的東西了嗎胳喷?你最重要的東西是什么呢湃番? 今天看到這個問題愣住了,竟...
    Miranda明霞閱讀 454評論 3 1