基本數據類型:String,Boolean,Number,undefined,null,Symbol(ES6)
引用數據類型:Object,Functoin,Array,RegExp 等javascript
堆和棧都是存放臨時數據的內存空間(注意與數據結構堆、棧的區分):
棧時向低地址擴展的數據結構,是一塊連續的內存的區域(最大容量是系統預設好的),由編譯器自動分配和釋放,速度快,用於存放函數的參數值與局部變量的值,只要棧的剩餘空間大於申請空間就分配,不然報錯異常,其操做方式相似於數據結構中的棧,是先進後出的。
基本數據類型
的值保存在棧內存中的簡單數據段,按值訪問。java
堆是在程序運行時(而不是在程序編譯時)申請的內存空間,即動態分配內存對其訪問(大小受到虛擬內存影響),通常由程序員分配和釋放,若沒有手動釋放則在程序結束時由 OS 回收,操做方式與數據結構中的堆是兩回事,相似於鏈表。
引用數據類型
的值是指保存在堆內存中的對象,因爲對象的大小不固定不能保存在棧內存中,然而內存地址的大小是固定的,故能夠將其保存在棧內存中,也就是說:變量在棧內存中保存的數據其實是指向堆內存中保存的對象
的指針。git對於堆,操做系統有一個記錄空閒內存地址的鏈表,當系統收到申請時,會遍歷該鏈表尋找第一個空間大於所申請空間的堆節點,而後將該節點從空閒區鏈表中刪除,將該節點的空間分配給程序,如果找到的節點地址空間大於申請的大小,系統會把剩餘的節點空間從新添加到內存空閒區鏈表中。
(故而使用堆時內存地址不連續,且容易產生碎片)程序員
全局區(靜態區):存儲全局變量和靜態變量,程序結束後由系統釋放。文字常量區:存儲常量字符串github
char *p1; // p1 保存在棧中 char *p2 = "test"; // p2 保存在棧中,test 保存在常量區
程序代碼區:存儲程序的二進制代碼
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.
根據 MDN 關於 Number 的描述 可知,javascript 的數字類型只有 number
一種,使用 IEEE754
標準中的雙精度浮點數
來存儲,長度爲64位。數據結構
符號位 | 指數位 | 小數位 |
---|---|---|
0 | 00000000000 | 00000...0000000000000000000000000 |
1 bit | 11 bit | 52 bit |
0.1 =
(0.00011)2 0011 無限循環
=
(-1)^0 2^(-4) (1.1001)2 1001 無限循環
函數
0.2 =
(-1)^0 2^(-3) (1.1001)2 1001 無限循環
操作系統
因爲小數位僅儲存 52 bit, 儲存時會將超出精度部分進行
"零舍一入"
:
值類型 | 小數位存儲範圍內 | 存儲範圍外 |
---|---|---|
無限精確值 | 1001 1001 1001 1001 ... 1001 1001 1001 | 1001 1001... |
實際存儲值 | 1001 1001 1001 1001 ... 1001 1001 1010 | - |
故而 0.1 和 0.2 的浮點數存儲形式表示爲:指針
浮點數值 | 符號位 | 指數值 | 小數位 |
---|---|---|---|
0.1 | 0 | -4 | 1001 1001 1001 1001 ... 1001 1001 1010 |
0.2 | 0 | -3 | 1001 1001 1001 1001 ... 1001 1001 1010 |
在計算浮點數相加時須要先進行「對位」,將較小的指數化爲較大的指數,並將小數部分相應右移。
0.1 =
(−1)^0 2^(−3) (0.11001100110011001100110011001100110011001100110011010)2code
0.2 =
(−1)^0 2^(−3) (1.1001100110011001100110011001100110011001100110011010)2
0.1 + 0.2 =
(−1)^0 2^(−2) (1.0011001100110011001100110011001100110011001100110100)2 =
0.30000000000000004
排除直接使用超大數或者超小數的狀況,出現這種問題基本是浮點數的小數部分在轉成二進制時丟失精度形成的,因此咱們能夠將小數部分轉換成整數後再計算,須要注意的是乘法操做也是一種浮點數計算,在轉換過程當中可能存在精度問題。
因此不要直接經過計算將小數轉換成整數!咱們能夠經過字符串操做:移動小數點的位置來轉換成整數,最後再一樣經過字符串操做轉換回小數。