最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細(xì)談?wù)凧S中的內(nèi)存與變量存儲(chǔ)

 更新時(shí)間:2021年08月06日 15:19:55   作者:立花正仁  
js中的變量在內(nèi)存中的具體存儲(chǔ)形式是我們學(xué)習(xí)使用JS必會(huì)的,下面這篇文章主要給大家介紹了關(guān)于JS中內(nèi)存與變量存儲(chǔ)的相關(guān)資料,需要的朋友可以參考下

前言

在前端領(lǐng)域,因?yàn)榇蟛糠衷诟鶸I打交道,內(nèi)存管理是最容易被忽略的部分。如果不懂內(nèi)存,就看不清很多問(wèn)題的本質(zhì),也難以寫出更合格的代碼,本次帶大家走進(jìn)內(nèi)存的世界。

JS神奇的Number

案例一:金額的計(jì)算與傳遞

18.9 * 100
=1889.9999999999998

案例二:違背的數(shù)學(xué)定律

0.1 + 0.2 === 0.3
// false

(function (a, b, c) {
    return a + b + c === a + ( b + c )
})(0.1, 0.2, 0.3)
// false

案例三:無(wú)限循環(huán)的加法

(function (num) {
    while(true) {
        if (++num % 13 === 0) {
            return num
        }
    }
})(2 ** 53)

案例四:JSON.parse

JSON.parse('{"a":180143985094813214124}')
//{a: 180143985094813220000}

通過(guò)上面的四個(gè)案例我們可以看出,數(shù)字在計(jì)算機(jī)中運(yùn)算往往會(huì)給人帶來(lái)一些“驚喜”,要想防止這些意想不到的結(jié)果,我們首先要了解Number在Javascript中到底是怎么存儲(chǔ)的?

存儲(chǔ)數(shù)字

計(jì)算機(jī)是用二進(jìn)制來(lái)存儲(chǔ)數(shù)據(jù)的,所以數(shù)字也需要轉(zhuǎn)換成相應(yīng)二進(jìn)制: 000 或者 111 的不同組合序列。

二進(jìn)制如何轉(zhuǎn)換

如何將一個(gè)數(shù)字轉(zhuǎn)換成二進(jìn)制,這里舉個(gè)例子說(shuō)明一下:

把十進(jìn)制小數(shù) 106.6953125106.6953125106.6953125 轉(zhuǎn)換成二進(jìn)制

遇到小數(shù)轉(zhuǎn)換時(shí),需要把整數(shù)和小數(shù)兩部分分別進(jìn)行處理,整數(shù) 106106106 除以 222 直到商是 000 為止,取每次除 222 得到的余數(shù)結(jié)果

106 / 2 = 53  ...... 0
53  / 2 = 26  ...... 1
26  / 2 = 13  ...... 0
13  / 2 = 6   ...... 1
6   / 2 = 3   ...... 0
3   / 2 = 1   ...... 1
1   / 2 = 0   ...... 1
結(jié)果為得到的余數(shù)按照從右往左排列   1101010

小數(shù) 0.69531250.69531250.6953125 乘以 222 直到不存在小數(shù)位為止,并計(jì)下每次乘后的整數(shù)位結(jié)果,

0.6953125 x 2 = 1.390625  ...... 1
0.390625  x 2 = 0.78125   ...... 0
0.78125   x 2 = 1.5625    ...... 1
0.5625    x 2 = 1.125     ...... 1
0.125     x 2 = 0.25      ...... 0
0.25      x 2 = 0.5       ...... 0
0.5       x 2 = 1         ...... 1
結(jié)果為得到的整數(shù)位按照從左往右排列   1011001

將計(jì)算后的 000 111 序列拼在一起就得到轉(zhuǎn)換的二進(jìn)制 1101010.10110011101010.10110011101010.1011001,用科學(xué)計(jì)數(shù)法表示為1.1010101011001∗261.1010101011001*2^61.1010101011001∗26,算出了二進(jìn)制,接下來(lái)需要將它存進(jìn)計(jì)算機(jī)中,在Javascript中不區(qū)分整數(shù)和小數(shù),數(shù)字統(tǒng)一按照雙精度浮點(diǎn)數(shù)的要求來(lái)存儲(chǔ),主要包含下面規(guī)則:

  • 使用 8bytes(64bits)8bytes(64bits)8bytes(64bits) 存儲(chǔ)雙精度浮點(diǎn)數(shù)
  • 存儲(chǔ)小數(shù)用科學(xué)計(jì)數(shù)法表示的數(shù)據(jù)
  • 第一位表示符號(hào),后 111111 位表示指數(shù),指數(shù)按照補(bǔ)位運(yùn)算,即直接 102310231023 加指數(shù)位
  • 剩余 525252 位表示小數(shù)點(diǎn)后的尾數(shù),超過(guò) 525252 位的部分 000 舍 111 進(jìn)

由于指數(shù)位的 11 位不包括符號(hào)位,那么為了達(dá)到正負(fù)指數(shù)的效果,就引入了指數(shù)的偏移值。

用圖表示如下:

我們將轉(zhuǎn)換好的二進(jìn)制數(shù)按規(guī)則放進(jìn)內(nèi)存中,首先 106.6953125106.6953125106.6953125 是正數(shù),所以符號(hào)位應(yīng)該為 111, 000 表示正號(hào), 111 表示負(fù)號(hào)(圖片應(yīng)該為顯示 000,筆誤了)

二進(jìn)制 1.1010101011001∗261.1010101011001*2^61.1010101011001∗26 指數(shù)是 666(這里需要加上偏移量1023),轉(zhuǎn)成二進(jìn)制為 100000001011000000010110000000101,指數(shù)位要求放置二進(jìn)制的補(bǔ)碼,而補(bǔ)碼的計(jì)算規(guī)則是:

  • 正數(shù)的補(bǔ)碼就是其本身
  • 負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)
[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

所以圖片指數(shù)位應(yīng)該填

尾數(shù)位部分直接將小數(shù)轉(zhuǎn)換后的二進(jìn)制填入即可

數(shù)字最后就是以這樣的形式存入計(jì)算機(jī)中

why 0.1 + 0.2 !== 0.3?

在理解數(shù)字存儲(chǔ)的原理后,我們?cè)賮?lái)分析下為什么 0.1+0.2!==0.30.1 + 0.2 !== 0.30.1+0.2!==0.3

首先將 0.10.10.1 0.20.20.2 0.30.30.3 分別轉(zhuǎn)換成二進(jìn)制

0.1 x 2 = 0.2  ...... 0
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
得到的整數(shù)位按照從左往右排列   000110011...

0.1→0.00011(0011)∞

0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
得到的整數(shù)位按照從左往右排列   001100110...

0.2→0.00110(0110)∞

0.3 x 2 = 0.6  ...... 0
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
0.6 x 2 = 1.2  ...... 1
0.2 x 2 = 0.4  ...... 0
0.4 x 2 = 0.8  ...... 0
0.8 x 2 = 1.6  ...... 1
得到的整數(shù)位按照從左往右排列   010011001...

0.3→0.01001(1001)∞

統(tǒng)一用科學(xué)計(jì)數(shù)法表示為

0.1→0.00011(0011)∞→1.(1001)∞∗2−4

0.2→0.00110(0110)∞→1.(1001)∞∗2−3

0.3→0.01001(1001)∞→1.(0011)∞∗2−2

放入計(jì)算機(jī)中雙精度浮點(diǎn)數(shù)存儲(chǔ),最后的紅色表示超過(guò)尾數(shù)位的二進(jìn)制,即需要做舍0進(jìn)1處理

則經(jīng)過(guò)64位雙精度存儲(chǔ)后,二進(jìn)制如下表示
0.1→0−01111111011−(1001)121010

0.2→0−01111111100−(1001)121010

0.3→0−01111111101−(0011)120011

此時(shí) 0.1+0.20.1 + 0.20.1+0.2 可以看出與 0.30.30.3 不相等

這就是數(shù)字在計(jì)算機(jī)中運(yùn)算往往會(huì)給人帶來(lái)一些“驚喜”!

總結(jié)

到此這篇關(guān)于JS中內(nèi)存與變量存儲(chǔ)的文章就介紹到這了,更多相關(guān)JS內(nèi)存與變量存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Kendo Grid editing 自定義驗(yàn)證報(bào)錯(cuò)提示的解決方法

    Kendo Grid editing 自定義驗(yàn)證報(bào)錯(cuò)提示的解決方法

    Kendo UI是一個(gè)強(qiáng)大的框架用于快速HTML5 UI開(kāi)發(fā)?;谧钚碌腍TML5、CSS3和JavaScript標(biāo)準(zhǔn)。今天小編通過(guò)分享本文給大家介紹Kendo Grid editing 自定義驗(yàn)證報(bào)錯(cuò)提示的解決方法
    2016-11-11
  • Javascript中的對(duì)象和原型(二)

    Javascript中的對(duì)象和原型(二)

    這篇文章給大家介紹了js中的對(duì)象和原型,從工廠模式,構(gòu)造函數(shù)方面展開(kāi)話題,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • js密碼強(qiáng)度檢測(cè)

    js密碼強(qiáng)度檢測(cè)

    這篇文章主要介紹了js密碼強(qiáng)度檢測(cè)的相關(guān)資料,并給出了詳細(xì)代碼,需要的朋友可以參考下
    2016-01-01
  • 小米公司JavaScript面試題

    小米公司JavaScript面試題

    這篇文章主要介紹了小米公司JavaScript面試題的個(gè)人解題方法,需要的朋友可以參考下
    2014-12-12
  • 詳解bootstrap的modal-remote兩種加載方式【強(qiáng)化】

    詳解bootstrap的modal-remote兩種加載方式【強(qiáng)化】

    本篇文章主要介紹了詳解bootstrap的modal-remote兩種加載方式【強(qiáng)化】,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Form表單按回車自動(dòng)提交表單的實(shí)現(xiàn)方法

    Form表單按回車自動(dòng)提交表單的實(shí)現(xiàn)方法

    本文給大家分享form表單按回車自動(dòng)提交表單的方法,在前端開(kāi)發(fā)中經(jīng)常會(huì)遇到,今天小編給大家介紹具體實(shí)現(xiàn)方法,感興趣的朋友一起看看
    2016-11-11
  • 基于Phantomjs生成PDF的實(shí)現(xiàn)方法

    基于Phantomjs生成PDF的實(shí)現(xiàn)方法

    這篇文章主要介紹了基于Phantomjs生成PDF的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Phantomjs結(jié)合nodejs生成pdf的操作步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-11-11
  • uniapp小程序?qū)崿F(xiàn)瀑布流布局的思路與代碼

    uniapp小程序?qū)崿F(xiàn)瀑布流布局的思路與代碼

    這篇文章主要給大家介紹了關(guān)于uniapp小程序?qū)崿F(xiàn)瀑布流布局的思路與代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • js實(shí)現(xiàn)簡(jiǎn)單的倒計(jì)時(shí)

    js實(shí)現(xiàn)簡(jiǎn)單的倒計(jì)時(shí)

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單的倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 使用bootstrap插件實(shí)現(xiàn)模態(tài)框效果

    使用bootstrap插件實(shí)現(xiàn)模態(tài)框效果

    今天我們選擇使用著名的 bootstrap 庫(kù)的模態(tài)框插件 modal.js 來(lái)實(shí)現(xiàn)模態(tài)框效果,同時(shí)也使大家進(jìn)一步熟悉 bootstrap 的插件使用,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

云龙县| 洞头县| 翁源县| 婺源县| 大化| 河曲县| 河东区| 通州区| 涿鹿县| 宾川县| 定远县| 景谷| 海南省| 陵川县| 朝阳市| 三原县| 永福县| 沙湾县| 梓潼县| 塔河县| 独山县| 南阳市| 宾川县| 黄平县| 巴中市| 攀枝花市| 深圳市| 雷山县| 临城县| 金阳县| 拜泉县| 额敏县| 泗阳县| 大渡口区| 普兰店市| 织金县| 济南市| 乌鲁木齐县| 泰顺县| 永州市| 普定县|