摘要:值傳遞引用傳遞是值傳遞,是引用傳遞。但這影響會(huì)根據(jù)父類是屬于還是而有微妙差別。我們?cè)O(shè)想有一個(gè)父類,和兩個(gè)繼承了他的子類和。這時(shí),子類修改該不會(huì)影響到父類本身,更不會(huì)傳遞到其他子類上。
Javascript有兩種基本數(shù)據(jù)類型,Primitive和Object。Object是properties的聚合,其property可以是Object也可以是Primitive。Primitive只有value, 沒有properties。
Javascript有五種Primitive:
string
number
boolean
null
undefined
除了null和undefined,其余Primitive都有對(duì)應(yīng)的Object封裝,如Object String對(duì)應(yīng)string。
Stack vs. HeapJavascript是一門動(dòng)態(tài)語言,同一個(gè)變量在不同時(shí)候可能被賦予不同數(shù)據(jù)類型,比如前面是number而后面變成Object。所以Javascript變量值所占用的內(nèi)存空間應(yīng)該是可以動(dòng)態(tài)變化的。
var a = 10; a = {};
實(shí)際上,不管是Primitive還是Object,這些Javascript變量的值都存儲(chǔ)在可以動(dòng)態(tài)分配空間的heap上。而它在stack上保存的則是一個(gè)固定size的包含該值所在heap位置信息的引用(類似pointer)。JS engine通過對(duì)引用指向的修改來實(shí)現(xiàn)同一個(gè)變量指向不同的數(shù)據(jù)類型。
It"s wrong to state that primitives are allocated from the stack and only objects are allocated from the heap. This is the biggest difference between C and JavaScript.
最新的JS engine做了很多優(yōu)化,使得內(nèi)存分配更為高效但也更為復(fù)雜,具體可參考該StackOverflow回答。
值傳遞 vs. 引用傳遞Primitive是值傳遞(passed by value),Object是引用傳遞(passed by reference)。
上面說到,Javascript變量在stack保存的是地址引用,為什么又說Primitive是值傳遞呢?Javascript中所有Primitive都是immutable的。在傳遞Primitive時(shí),JS engine在heap上復(fù)制一個(gè)值相同的Primitive,然后把新變量的引用傳遞出去,這就是所謂JS中的值傳遞。對(duì)于Object,JS engine并不會(huì)復(fù)制一個(gè)新的Object,而是直接傳遞它的地址引用(與C++/Java中的引用傳遞類似)。
對(duì)Prototype影響該引用能識(shí)別其指向的變量是Primitive還是Object,所以它不是一個(gè)簡單的pointer,而是包含所指向變量類型信息的“智能引用”。
在Javascript中,子類修改父類的property會(huì)影響到所有繼承該父類的子類。但這影響會(huì)根據(jù)父類property是屬于Primitive還是Object而有微妙差別。
我們?cè)O(shè)想有一個(gè)父類father,和兩個(gè)繼承了他的子類son1和son2。
var father = { primitive: 1, object: { fruit: "APPLE" } }; var son1 = Object.create(father); var son2 = Object.create(father);Primitive Property
如果父類的property是Primitive,該property通過passed by value傳遞到子類。這時(shí),子類修改該property不會(huì)影響到父類本身,更不會(huì)傳遞到其他子類上。
console.log("father"s primitive is " + father.primitive); console.log("son1"s primitive is " + son1.primitive); console.log("son2"s primitive is " + son2.primitive); // father"s primitive is 1 // son1"s primitive is 1 // son2"s primitive is 1 son1.primitive = 2; console.log("father"s primitive is " + father.primitive); console.log("son1"s primitive is " + son1.primitive); console.log("son2"s primitive is " + son2.primitive); // father"s primitive is 1 // son1"s primitive is 2 // son2"s primitive is 1Object Property
如果父類的property是Object,該property通過passed by reference傳遞到子類上。子類修改該property會(huì)通過父類傳遞到所有繼承它的子類上。
console.log("father"s fruit is " + father.object.fruit); console.log("son1"s fruit is " + son1.object.fruit); console.log("son2"s fruit is " + son2.object.fruit); // father"s fruit is APPLE // son1"s fruit is APPLE // son2"s fruit is APPLE son1.object.fruit = "GRAPE"; console.log("father"s fruit is " + father.object.fruit); console.log("son1"s fruit is " + son1.object.fruit); console.log("son2"s fruit is " + son2.object.fruit); // father"s fruit is GRAPE // son1"s fruit is GRAPE // son2"s fruit is GRAPEReference
Primitive value vs Reference value
How variables are allocated memory in Javascript?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/80961.html
摘要:的這種實(shí)現(xiàn)方式導(dǎo)致了一些尷尬問題,比如刪除元素元素遍歷。后面的參數(shù)被忽略掉了,表示并沒有要插入的元素。其實(shí),的本質(zhì)是跟蹤中的,并始終保持值是。這時(shí)候,雖然不大可能,可能會(huì)在中間某個(gè)中被用戶重新定義。但是在上進(jìn)行這種操作是很糟糕的。 在Javascript中,array是一個(gè)類數(shù)組的object。顧名思義,它能夠在一個(gè)變量上存儲(chǔ)多個(gè)值。 數(shù)組是值的有序集合。每個(gè)值叫做一個(gè)元素,而每個(gè)元素...
摘要:於是其他的東西相加的時(shí)候?qū)?huì)被轉(zhuǎn)型成數(shù)字或者字串。整個(gè)過程即先依據(jù)轉(zhuǎn)換為原始型別,這裡要注意並不是最終結(jié)果,再來依據(jù)需要看是否要再將原生型別轉(zhuǎn)成數(shù)字或字串。這個(gè)結(jié)果等於只作的算。 這篇文章源自 What is {} + {} in JavaScript? 其實(shí)早在 2012 年就問世了。時(shí)至 2016 年末純粹是在聊天時(shí)重提這個(gè)問題,但由於年紀(jì)大了記憶力不佳,竟然記錯(cuò)了,所以才會(huì)有這一...
摘要:語法分析利用詞法分析的結(jié)果建立上下文關(guān)系語法樹。一般情況下,我們不會(huì)直接和語法樹打交道,但會(huì)在進(jìn)行代碼壓縮語法高亮重編譯關(guān)鍵字匹配和作用域判斷時(shí)間接涉及到。傳統(tǒng)的引擎直接根據(jù)語法樹的的結(jié)果進(jìn)行解釋執(zhí)行,導(dǎo)致效率比較為低下。 一門語言的執(zhí)行,大致經(jīng)歷下面這些過程:詞法分析 -- 語法分析 -- 語義分析 -- 中間代碼生成 -- 優(yōu)化代碼 -- 代碼生成。 在Javascript中,Sy...
摘要:標(biāo)簽前端作者更多文章個(gè)人網(wǎng)站 Learning Notes - Understanding the Weird Parts of JavaScript 標(biāo)簽 : 前端 JavaScript [TOC] The learning notes of the MOOC JavaScript: Understanding the Weird Parts on Udemy,including...
摘要:將與空字符串相加,即可將其轉(zhuǎn)換為字符串。這兩者是非常不同的事實(shí)上,將作為構(gòu)造函數(shù)使用并不常見,因此僅使用它來轉(zhuǎn)換字符串就好了。這就意味著兩者的計(jì)算過程是這樣的返回值,然后使用轉(zhuǎn)換為字符串。 譯者按: 語言的細(xì)枝末節(jié)了解一下就可以了,不需要太較真,不過如果一點(diǎn)也不知道的話,那就不太妙了。 原文: Converting a value to string in JavaScript 譯...
閱讀 1936·2021-11-12 10:36
閱讀 2417·2021-09-01 10:29
閱讀 2436·2019-08-30 15:56
閱讀 1085·2019-08-30 12:56
閱讀 2400·2019-08-26 13:58
閱讀 2384·2019-08-23 18:38
閱讀 1582·2019-08-23 18:32
閱讀 2170·2019-08-23 16:53