摘要:在編程語(yǔ)言中,賦值和參數(shù)傳遞可以通過(guò)值復(fù)制或者引用復(fù)制來(lái)完成,這取決于使用的是什么語(yǔ)法。但在中沒(méi)有指針這個(gè)概念,但也有這兩種復(fù)制,不過(guò),在語(yǔ)法上沒(méi)有區(qū)別,并且引用指向的是值。
在編程語(yǔ)言中,賦值和參數(shù)傳遞可以通過(guò)value-copy(值復(fù)制)或者reference-copy(引用復(fù)制)來(lái)完成,這取決于使用的是什么語(yǔ)法。
C語(yǔ)言中有指針這個(gè)概念,如果要向函數(shù)傳遞一個(gè)數(shù)并在函數(shù)中更改它的值,可以通過(guò)‘&’傳遞變量,這就是reference-copy;若是沒(méi)有聲明為引用的話,就是通過(guò)value-copy的方式傳遞。
但在JavaScript中沒(méi)有指針這個(gè)概念,但也有這兩種復(fù)制,不過(guò),在語(yǔ)法上沒(méi)有區(qū)別,并且引用指向的是值。這兩種復(fù)制完全根據(jù)值的類型來(lái)決定。
// 第一種 let a = 2; let b = a; // b是a的值一個(gè)副本,也就是value-copy b++; a; //2 b; //3 // 第二種 let c = [1, 2, 3]; let d = c; // d是[1, 2, 3]的一個(gè)引用,引用指向的是值哦,這是reference-copy d.push(4); c; // [1, 2, 3, 4] d; // [1, 2, 3, 4]
由上可知,基本類型的值是通過(guò)值復(fù)制的方式來(lái)賦值或是傳遞的,基本類型有null、undefined、字符串、數(shù)字、布爾以及ES6中的symbol。
引用類型的值是通過(guò)引用復(fù)制的方式來(lái)賦值或是傳遞的,引用類型有數(shù)組、對(duì)象、函數(shù)等。
由于引用指向的是值本身而非變量,所以一個(gè)引用無(wú)法更改另一個(gè)引用的指向。也就是說(shuō),多個(gè)引用相互之間沒(méi)有引用/指向關(guān)系。關(guān)于這點(diǎn),看代碼就清楚了,如下:
let c = [1, 2, 3]; let d = c; // 這時(shí)d和c都為[1, 2, 3] d = [4, 5, 6]; c; // [1, 2, 3] d; // [4, 5, 6] // d = [4, 5, 6];這句賦值語(yǔ)句并不會(huì)影響c指向值[1, 2, 3],除非b是指向c的,但上面我們已經(jīng)說(shuō)過(guò)‘引用指向的是值本身而非變量’?。?! // 要知道直接賦值和push()是不一樣的,前者是重新引用,而后者是在引用的基礎(chǔ)上往里面加?xùn)|西。 // 若是想要在引用的基礎(chǔ)上清空數(shù)組,可以用arr.length = 0的方式
特別要注意的一點(diǎn)是,那些基本類型,在初始化時(shí),可以封裝成對(duì)象,可就算如此操作,還是更改不了‘它是基本類型值’的事實(shí),所以還是value-copy,代碼如下:
function add(x) { x += 1; } let a = new Number(1); // typeof a => object add(a); a; // a為2,而不是3
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/101359.html
摘要:從而也引出了所謂的深淺復(fù)制問(wèn)題。附注對(duì)于淺復(fù)制,其實(shí)還有其他的實(shí)現(xiàn)方式,比如數(shù)組中和方法,對(duì)于這些還是希望大家自己了解,本本主要針對(duì)深淺復(fù)制的實(shí)現(xiàn)原理進(jìn)行解析。 前言 在之前寫繼承的過(guò)程談到了深淺復(fù)制的問(wèn)題,因?yàn)橛凶x者反映到需要解析,趁今天周末寫一篇解析,今天的主體相對(duì)之前來(lái)說(shuō)理解難度低一些,篇幅可能也比較短,諸君按需閱讀即可。 從兩種數(shù)據(jù)類型說(shuō)起 在js中,變量的類型可以大致分成兩種...
摘要:引用類型之所以會(huì)出現(xiàn)深淺拷貝的問(wèn)題,實(shí)質(zhì)上是由于對(duì)基本類型和引用類型的處理不同。另外方法可以視為數(shù)組對(duì)象的淺拷貝。上面描述過(guò)的復(fù)雜問(wèn)題依然存在,可以說(shuō)是最簡(jiǎn)陋但是日常工作夠用的深拷貝方式。 一直想梳理下工作中經(jīng)常會(huì)用到的深拷貝的內(nèi)容,然而遍覽了許多的文章,卻發(fā)現(xiàn)對(duì)深拷貝并沒(méi)有一個(gè)通用的完美實(shí)現(xiàn)方式。因?yàn)閷?duì)深拷貝的定義不同,實(shí)現(xiàn)時(shí)的edge case過(guò)多,在深拷貝的時(shí)候會(huì)出現(xiàn)循環(huán)引用等問(wèn)...
摘要:一對(duì)象引用基礎(chǔ)知識(shí)變量是標(biāo)注而不是容器。也就是說(shuō)元組中不可變的是元素的標(biāo)識(shí),但元組的值會(huì)隨著引用的可變對(duì)象變化而變化。在中每個(gè)對(duì)象的引用都會(huì)有統(tǒng)計(jì)。弱引用不會(huì)妨礙對(duì)象被當(dāng)做垃圾回收。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、明確變量保存的是引用這一本質(zhì);2、熟悉對(duì)象引用的基礎(chǔ)知識(shí);...
摘要:發(fā)布時(shí)最大的變動(dòng)是對(duì)象處理方式。這很容易被誤解為引用,但是存儲(chǔ)器的引用與引用是完全不同的概念。使用引用是一件不好的事情,除了引用本身不好,并且還會(huì)使性能下降這個(gè)事實(shí)外,使用引用這種方式會(huì)使得代碼難以維護(hù)。 showImg(https://segmentfault.com/img/remote/1460000014082570); 去年我參加了很多次會(huì)議,其中八次會(huì)議里我進(jìn)行了相關(guān)發(fā)言,...
摘要:二這么分的好處就是在于節(jié)省內(nèi)存資源,便于合理回收內(nèi)存詳解中的深淺復(fù)制有了上面的鋪墊,那么我們理解起深淺復(fù)制就變得容易的許多。 前言 對(duì)于前端開發(fā)來(lái)說(shuō),我們經(jīng)常能夠遇到的問(wèn)題就是js的深淺復(fù)制問(wèn)題,通常情況下我們解決這個(gè)問(wèn)題的方法就是用JSON.parse(JSON.Stringify(xx))轉(zhuǎn)換或者用類似于Inmmutable這種第三方庫(kù)來(lái)進(jìn)行深復(fù)制,但是我們還是要弄懂其中原理,這樣...
閱讀 1716·2021-09-08 10:42
閱讀 3671·2021-08-11 10:23
閱讀 4181·2019-08-30 14:10
閱讀 2795·2019-08-29 17:29
閱讀 3154·2019-08-29 12:50
閱讀 695·2019-08-26 13:36
閱讀 3521·2019-08-26 11:59
閱讀 1549·2019-08-23 16:23