摘要:基本數(shù)據(jù)類(lèi)型的值保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,按值訪(fǎng)問(wèn)。文字常量區(qū)存儲(chǔ)常量字符串保存在棧中保存在棧中,保存在常量區(qū)程序代碼區(qū)存儲(chǔ)程序的二進(jìn)制代碼關(guān)于數(shù)字類(lèi)型根據(jù)關(guān)于的描述可知,的數(shù)字類(lèi)型只有一種,使用標(biāo)準(zhǔn)中的雙精度浮點(diǎn)數(shù)來(lái)存儲(chǔ),長(zhǎng)度為位。
數(shù)據(jù)類(lèi)型
基本數(shù)據(jù)類(lèi)型:String,Boolean,Number,undefined,null,Symbol(ES6)
引用數(shù)據(jù)類(lèi)型:Object,F(xiàn)unctoin,Array,RegExp 等
堆和棧都是存放臨時(shí)數(shù)據(jù)的內(nèi)存空間(注意與數(shù)據(jù)結(jié)構(gòu)堆、棧的區(qū)分):棧
棧時(shí)向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域(最大容量是系統(tǒng)預(yù)設(shè)好的),由編譯器自動(dòng)分配和釋放,速度快,用于存放函數(shù)的參數(shù)值與局部變量的值,只要棧的剩余空間大于申請(qǐng)空間就分配,否則報(bào)錯(cuò)異常,其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧,是先進(jìn)后出的。堆基本數(shù)據(jù)類(lèi)型的值保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,按值訪(fǎng)問(wèn)。
堆是在程序運(yùn)行時(shí)(而不是在程序編譯時(shí))申請(qǐng)的內(nèi)存空間,即動(dòng)態(tài)分配內(nèi)存對(duì)其訪(fǎng)問(wèn)(大小受到虛擬內(nèi)存影響),一般由程序員分配和釋放,若沒(méi)有手動(dòng)釋放則在程序結(jié)束時(shí)由 OS 回收,操作方式與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,類(lèi)似于鏈表。內(nèi)存中的其他空間:引用數(shù)據(jù)類(lèi)型的值是指保存在堆內(nèi)存中的對(duì)象,由于對(duì)象的大小不固定不能保存在棧內(nèi)存中,然而內(nèi)存地址的大小是固定的,故可以將其保存在棧內(nèi)存中,也就是說(shuō):變量在棧內(nèi)存中保存的數(shù)據(jù)實(shí)際上是指向堆內(nèi)存中保存的對(duì)象的指針。
對(duì)于堆,操作系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到申請(qǐng)時(shí),會(huì)遍歷該鏈表尋找第一個(gè)空間大于所申請(qǐng)空間的堆節(jié)點(diǎn),然后將該節(jié)點(diǎn)從空閑區(qū)鏈表中刪除,將該節(jié)點(diǎn)的空間分配給程序,若是找到的節(jié)點(diǎn)地址空間大于申請(qǐng)的大小,系統(tǒng)會(huì)把剩余的節(jié)點(diǎn)空間重新添加到內(nèi)存空閑區(qū)鏈表中。
(故而使用堆時(shí)內(nèi)存地址不連續(xù),且容易產(chǎn)生碎片)
全局區(qū)(靜態(tài)區(qū)):存儲(chǔ)全局變量和靜態(tài)變量,程序結(jié)束后由系統(tǒng)釋放。文字常量區(qū):存儲(chǔ)常量字符串
char *p1; // p1 保存在棧中 char *p2 = "test"; // p2 保存在棧中,test 保存在常量區(qū)
程序代碼區(qū):存儲(chǔ)程序的二進(jìn)制代碼關(guān)于 Number 數(shù)字類(lèi)型
In JavaScript, Number is a numeric data type in the double-precision 64-bit floating point format (IEEE 754). In other programming languages different numeric types can exist, for examples: Integers, Floats, Doubles, or Bignums.
根據(jù) MDN 關(guān)于 Number 的描述 可知,javascript 的數(shù)字類(lèi)型只有 number 一種,使用 IEEE754 標(biāo)準(zhǔn)中的雙精度浮點(diǎn)數(shù)來(lái)存儲(chǔ),長(zhǎng)度為64位。
符號(hào)位 | 指數(shù)位 | 小數(shù)位 |
---|---|---|
0 | 00000000000 | 00000...0000000000000000000000000 |
1 bit | 11 bit | 52 bit |
0.1 =
(0.00011)2 0011 無(wú)限循環(huán) =
(-1)^0 2^(-4) (1.1001)2 1001 無(wú)限循環(huán)
0.2 =
(-1)^0 2^(-3) (1.1001)2 1001 無(wú)限循環(huán)
由于小數(shù)位僅儲(chǔ)存 52 bit, 儲(chǔ)存時(shí)會(huì)將超出精度部分進(jìn)行 "零舍一入":
值類(lèi)型 | 小數(shù)位存儲(chǔ)范圍內(nèi) | 存儲(chǔ)范圍外 |
---|---|---|
無(wú)限精確值 | 1001 1001 1001 1001 ... 1001 1001 1001 | 1001 1001... |
實(shí)際存儲(chǔ)值 | 1001 1001 1001 1001 ... 1001 1001 1010 | - |
故而 0.1 和 0.2 的浮點(diǎn)數(shù)存儲(chǔ)形式表示為:
浮點(diǎn)數(shù)值 | 符號(hào)位 | 指數(shù)值 | 小數(shù)位 |
---|---|---|---|
0.1 | 0 | -4 | 1001 1001 1001 1001 ... 1001 1001 1010 |
0.2 | 0 | -3 | 1001 1001 1001 1001 ... 1001 1001 1010 |
在計(jì)算浮點(diǎn)數(shù)相加時(shí)需要先進(jìn)行“對(duì)位”,將較小的指數(shù)化為較大的指數(shù),并將小數(shù)部分相應(yīng)右移。
0.1 =
(?1)^0 2^(?3) (0.11001100110011001100110011001100110011001100110011010)2
0.2 =
(?1)^0 2^(?3) (1.1001100110011001100110011001100110011001100110011010)2
0.1 + 0.2 =
(?1)^0 2^(?2) (1.0011001100110011001100110011001100110011001100110100)2 =
0.30000000000000004
mathjs (https://github.com/josdejong/...
decimal.js (https://github.com/MikeMcl/de...
big.js (https://github.com/10081677wc...
排除直接使用超大數(shù)或者超小數(shù)的情況,出現(xiàn)這種問(wèn)題基本是浮點(diǎn)數(shù)的小數(shù)部分在轉(zhuǎn)成二進(jìn)制時(shí)丟失精度造成的,所以我們可以將小數(shù)部分轉(zhuǎn)換成整數(shù)后再計(jì)算,需要注意的是乘法操作也是一種浮點(diǎn)數(shù)計(jì)算,在轉(zhuǎn)換過(guò)程中可能存在精度問(wèn)題。
所以不要直接通過(guò)計(jì)算將小數(shù)轉(zhuǎn)換成整數(shù)!我們可以通過(guò)字符串操作:移動(dòng)小數(shù)點(diǎn)的位置來(lái)轉(zhuǎn)換成整數(shù),最后再同樣通過(guò)字符串操作轉(zhuǎn)換回小數(shù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83224.html
摘要:一棧數(shù)據(jù)結(jié)構(gòu)與不同,中并沒(méi)有嚴(yán)格意義上區(qū)分棧內(nèi)存與堆內(nèi)存。引用數(shù)據(jù)類(lèi)型的值是保存在堆內(nèi)存中的對(duì)象。不允許直接訪(fǎng)問(wèn)堆內(nèi)存中的位置,因此我們不能直接操作對(duì)象的堆內(nèi)存空間。為了更好的搞懂變量對(duì)象與堆內(nèi)存,我們可以結(jié)合以下例子與圖解進(jìn)行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...
摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識(shí),其實(shí)都是來(lái)自于實(shí)踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。 開(kāi)篇 前端開(kāi)發(fā)是一個(gè)非常特殊的行業(yè),它的歷史實(shí)際上不是很長(zhǎng),但是知識(shí)之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研...
摘要:在他的重學(xué)前端課程中提到到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系中的重要崗位之一。大部分前端工程師的知識(shí),其實(shí)都是來(lái)自于實(shí)踐和工作中零散的學(xué)習(xí)。一基礎(chǔ)前端工程師吃飯的家伙,深度廣度一樣都不能差。開(kāi)篇 前端開(kāi)發(fā)是一個(gè)非常特殊的行業(yè),它的歷史實(shí)際上不是很長(zhǎng),但是知識(shí)之繁雜,技術(shù)迭代速度之快是其他技術(shù)所不能比擬的。 winter在他的《重學(xué)前端》課程中提到: 到現(xiàn)在為止,前端工程師已經(jīng)成為研發(fā)體系...
摘要:引用數(shù)據(jù)類(lèi)型及堆內(nèi)存引用數(shù)據(jù)類(lèi)型是保存在堆內(nèi)存中的對(duì)象,他的大小是不固定的?;A(chǔ)數(shù)據(jù)類(lèi)型在變量對(duì)象里可以直接對(duì)應(yīng)對(duì)應(yīng)的值,而引用數(shù)據(jù)類(lèi)型是存儲(chǔ)在堆里的,在變量對(duì)象中對(duì)應(yīng)的是堆內(nèi)存的地址。因?yàn)槲覀冃薷谋举|(zhì)上是修改了堆內(nèi)存里的數(shù)據(jù)。 ? ??? ??因?yàn)橐郧扒岸碎_(kāi)發(fā)跟數(shù)據(jù)存儲(chǔ)打交道比較少,javascript又具有自動(dòng)垃圾回收機(jī)制。數(shù)據(jù)結(jié)構(gòu)以及存儲(chǔ)相關(guān)的概念,其實(shí)是很容易被前端er忽略的。...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠?lái)都是中的主導(dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠?lái)都是JavaScript中的主導(dǎo)范式。JavaScript作為一門(mén)多范式編程語(yǔ)言,然而,近幾年,函數(shù)式編程越來(lái)越多得受到開(kāi)發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對(duì)程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
閱讀 2821·2021-10-26 09:48
閱讀 1690·2021-09-22 15:22
閱讀 4071·2021-09-22 15:05
閱讀 626·2021-09-06 15:02
閱讀 2617·2019-08-30 15:52
閱讀 2119·2019-08-29 18:38
閱讀 2769·2019-08-28 18:05
閱讀 2339·2019-08-26 13:55