亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS淬煉: Primitive vs. Object

Hancock_Xu / 1230人閱讀

摘要:值傳遞引用傳遞是值傳遞,是引用傳遞。但這影響會(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

除了nullundefined,其余Primitive都有對(duì)應(yīng)的Object封裝,如Object String對(duì)應(yīng)string

Stack vs. Heap

Javascript是一門動(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中的引用傳遞類似)。

該引用能識(shí)別其指向的變量是Primitive還是Object,所以它不是一個(gè)簡單的pointer,而是包含所指向變量類型信息的“智能引用”。

對(duì)Prototype影響

在Javascript中,子類修改父類的property會(huì)影響到所有繼承該父類的子類。但這影響會(huì)根據(jù)父類property是屬于Primitive還是Object而有微妙差別。

我們?cè)O(shè)想有一個(gè)父類father,和兩個(gè)繼承了他的子類son1son2。

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 1
Object 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 GRAPE
Reference

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

相關(guān)文章

  • JS淬煉: Array進(jìn)階

    摘要:的這種實(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è)元素...

    jimhs 評(píng)論0 收藏0
  • 關(guān)於 Javascript {} + {}

    摘要:於是其他的東西相加的時(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ì)有這一...

    charles_paul 評(píng)論0 收藏0
  • JS淬煉: Syntax Parser

    摘要:語法分析利用詞法分析的結(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...

    wuaiqiu 評(píng)論0 收藏0
  • Learning Notes - Understanding the Weird Parts of

    摘要:標(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...

    inapt 評(píng)論0 收藏0
  • JS中將變量轉(zhuǎn)為字符串

    摘要:將與空字符串相加,即可將其轉(zhuǎn)換為字符串。這兩者是非常不同的事實(shí)上,將作為構(gòu)造函數(shù)使用并不常見,因此僅使用它來轉(zhuǎn)換字符串就好了。這就意味著兩者的計(jì)算過程是這樣的返回值,然后使用轉(zhuǎn)換為字符串。 譯者按: 語言的細(xì)枝末節(jié)了解一下就可以了,不需要太較真,不過如果一點(diǎn)也不知道的話,那就不太妙了。 原文: Converting a value to string in JavaScript 譯...

    Alex 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<