广告
返回顶部
首页 > 资讯 > 精选 >JS中内存与变量存储的示例分析
  • 375
分享到

JS中内存与变量存储的示例分析

2023-06-20 20:06:09 375人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关js中内存与变量存储的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JS神奇的Number案例一:金额的计算与传递18.9 * 100=1889.9

这篇文章将为大家详细讲解有关js中内存与变量存储的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JS神奇的Number

案例一:金额的计算与传递

18.9 * 100=1889.9999999999998

案例二:违背的数学定律

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

案例三:无限循环的加法

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

案例四:JSON.parse

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

通过上面的四个案例我们可以看出,数字在计算机中运算往往会给人带来一些“惊喜”,要想防止这些意想不到的结果,我们首先要了解Number在javascript中到底是怎么存储的?

存储数字

计算机是用二进制来存储数据的,所以数字也需要转换成相应二进制: 000 或者 111 的不同组合序列。

二进制如何转换

如何将一个数字转换成二进制,这里举个例子说明一下:

把十进制小数 106.6953125106.6953125106.6953125 转换成二进制

遇到小数转换时,需要把整数和小数两部分分别进行处理,整数 106106106 除以 222 直到商是 000 为止,取每次除 222 得到的余数结果

106 / 2 = 53  ...... 053  / 2 = 26  ...... 126  / 2 = 13  ...... 013  / 2 = 6   ...... 16   / 2 = 3   ...... 03   / 2 = 1   ...... 11   / 2 = 0   ...... 1结果为得到的余数按照从右往左排列   1101010

小数 0.69531250.69531250.6953125 乘以 222 直到不存在小数位为止,并计下每次乘后的整数位结果,

0.6953125 x 2 = 1.390625  ...... 10.390625  x 2 = 0.78125   ...... 00.78125   x 2 = 1.5625    ...... 10.5625    x 2 = 1.125     ...... 10.125     x 2 = 0.25      ...... 00.25      x 2 = 0.5       ...... 00.5       x 2 = 1         ...... 1结果为得到的整数位按照从左往右排列   1011001

将计算后的 000 111 序列拼在一起就得到转换的二进制 1101010.10110011101010.10110011101010.1011001,用科学计数法表示为1.1010101011001∗261.1010101011001*2^61.1010101011001∗26,算出了二进制,接下来需要将它存进计算机中,在Javascript中不区分整数和小数,数字统一按照双精度浮点数的要求来存储,主要包含下面规则:

  • 使用 8bytes(64bits)8bytes(64bits)8bytes(64bits) 存储双精度浮点数

  • 存储小数用科学计数法表示的数据

  • 第一位表示符号,后 111111 位表示指数,指数按照补位运算,即直接 102310231023 加指数位

  • 剩余 525252 位表示小数点后的尾数,超过 525252 位的部分 000 舍 111 进

由于指数位的 11 位不包括符号位,那么为了达到正负指数的效果,就引入了指数的偏移值。

用图表示如下:

JS中内存与变量存储的示例分析

我们将转换好的二进制数按规则放进内存中,首先 106.6953125106.6953125106.6953125 是正数,所以符号位应该为 111, 000 表示正号, 111 表示负号(图片应该为显示 000,笔误了)

JS中内存与变量存储的示例分析

二进制 1.1010101011001∗261.1010101011001*2^61.1010101011001∗26 指数是 666(这里需要加上偏移量1023),转成二进制为 100000001011000000010110000000101,指数位要求放置二进制的补码,而补码的计算规则是:

  • 正数的补码就是其本身

  • 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

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

所以图片指数位应该填

JS中内存与变量存储的示例分析

尾数位部分直接将小数转换后的二进制填入即可

JS中内存与变量存储的示例分析

数字最后就是以这样的形式存入计算机中

why 0.1 + 0.2 !== 0.3?

在理解数字存储的原理后,我们再来分析下为什么 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 分别转换成二进制

0.1 x 2 = 0.2  ...... 00.2 x 2 = 0.4  ...... 00.4 x 2 = 0.8  ...... 00.8 x 2 = 1.6  ...... 10.6 x 2 = 1.2  ...... 10.2 x 2 = 0.4  ...... 00.4 x 2 = 0.8  ...... 00.8 x 2 = 1.6  ...... 10.6 x 2 = 1.2  ...... 1得到的整数位按照从左往右排列   000110011...

0.1→0.00011(0011)∞

0.2 x 2 = 0.4  ...... 00.4 x 2 = 0.8  ...... 00.8 x 2 = 1.6  ...... 10.6 x 2 = 1.2  ...... 10.2 x 2 = 0.4  ...... 00.4 x 2 = 0.8  ...... 00.8 x 2 = 1.6  ...... 10.6 x 2 = 1.2  ...... 10.2 x 2 = 0.4  ...... 0得到的整数位按照从左往右排列   001100110...

0.2→0.00110(0110)∞

0.3 x 2 = 0.6  ...... 00.6 x 2 = 1.2  ...... 10.2 x 2 = 0.4  ...... 00.4 x 2 = 0.8  ...... 00.8 x 2 = 1.6  ...... 10.6 x 2 = 1.2  ...... 10.2 x 2 = 0.4  ...... 00.4 x 2 = 0.8  ...... 00.8 x 2 = 1.6  ...... 1得到的整数位按照从左往右排列   010011001...

0.3→0.01001(1001)∞

统一用科学计数法表示为

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

放入计算机中双精度浮点数存储,最后的红色表示超过尾数位的二进制,即需要做舍0进1处理

JS中内存与变量存储的示例分析

则经过64位双精度存储后,二进制如下表示
0.1→0−01111111011−(1001)121010

0.2→0−01111111100−(1001)121010

0.3→0−01111111101−(0011)120011

此时 0.1+0.20.1 + 0.20.1+0.2 可以看出与 0.30.30.3 不相等

JS中内存与变量存储的示例分析

这就是数字在计算机中运算往往会给人带来一些“惊喜”!

关于“JS中内存与变量存储的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: JS中内存与变量存储的示例分析

本文链接: https://www.lsjlt.com/news/299903.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS中内存与变量存储的示例分析
    这篇文章将为大家详细讲解有关JS中内存与变量存储的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JS神奇的Number案例一:金额的计算与传递18.9 * 100=1889.9...
    99+
    2023-06-20
  • 详细谈谈JS中的内存与变量存储
    目录前言JS神奇的Number存储数字二进制如何转换why 0.1 + 0.2 !== 0.3?总结前言 在前端领域,因为大部分在跟UI打交道,内存管理是最容易被忽略的部分。...
    99+
    2022-11-12
  • JS中内存管理的示例分析
    这篇文章将为大家详细讲解有关JS中内存管理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc...
    99+
    2022-10-19
  • javascript中变量、作用域和内存的示例分析
    这篇文章主要介绍javascript中变量、作用域和内存的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript 的变量、作用域和内存问题(一)JavaScrip...
    99+
    2022-10-19
  • PHP变量串行化存储格式的示例分析
    这篇文章给大家分享的是有关PHP变量串行化存储格式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP还是比较常用的,于是我研究了一下PHP变量串行化,在这里拿出来和大家分享一下,希望对大家有用。串行化...
    99+
    2023-06-17
  • JVM中内存区域与内存溢出的示例分析
    小编给大家分享一下JVM中内存区域与内存溢出的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java内存区域与内存溢出异常运行时数据区域程序计数器当前线程...
    99+
    2023-06-17
  • JavaScript中变量作用域及内存问题的示例分析
    这篇文章给大家分享的是有关JavaScript中变量作用域及内存问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。学习要点:1.变量及作用域2.内存问题JavaScri...
    99+
    2022-10-19
  • JS中localStorage存储对象和sessionStorage存储数组对象的示例分析
    小编给大家分享一下JS中localStorage存储对象和sessionStorage存储数组对象的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、前言最近在用angular做商...
    99+
    2022-10-19
  • js中数据存储和DOM编程的示例分析
    这篇文章给大家分享的是有关js中数据存储和DOM编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数据存储·在javascript中,数据存储的位置会对代码整体性能产生...
    99+
    2022-10-19
  • HTML5Web存储的示例分析
    这篇文章主要介绍了HTML5Web存储的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是 HTML5 Web 存储使用HTML5...
    99+
    2022-10-19
  • Android内部存储与外部存储实例代码分析
    今天小编给大家分享一下Android内部存储与外部存储实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是内部存...
    99+
    2023-07-05
  • MYSQL中存储过程与函数的示例分析
    这篇文章主要介绍了MYSQL中存储过程与函数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  一、模式  二、存储过程与存储函数 ...
    99+
    2022-10-19
  • html5中离线存储和cookie储存的示例分析
    这篇文章主要为大家展示了“html5中离线存储和cookie储存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html5中离线存储和cookie储存的...
    99+
    2022-10-19
  • java内存管理与内存溢出异常的示例分析
    这篇文章主要介绍了java内存管理与内存溢出异常的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说到内存管理,笔者这里想先比较一下java与C、C++之间的区别:在C...
    99+
    2023-05-31
    java
  • sql server中内存的示例分析
    这篇文章将为大家详细讲解有关sql server中内存的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一. 前言 对于sql server 这个产品来说...
    99+
    2022-10-18
  • JS数组在内存中效率问题的示例分析
    这篇文章给大家分享的是有关JS数组在内存中效率问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JS数组我们所熟知的JS数组的结构和其他语言数组结构类似,即物理内存是连续的,所以这也就导致了数组成员移动...
    99+
    2023-06-29
  • Android内部存储与外部存储的示例讲解
    目录什么是内部存储和外部存储内部存储与外部存储的代码示例什么是内部存储和外部存储 1.内部存储与外部存储的存储介质: 内部存储的介质:RAM(内存) + 内部ROM 外部存储的介质:...
    99+
    2023-03-20
    Android内部存储与外部存储 Android内部存储 Android外部存储
  • MySQL中存储过程和存储函数的示例分析
    这篇文章主要为大家展示了“MySQL中存储过程和存储函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中存储过程和存储函数的示例分析”这篇文...
    99+
    2022-10-18
  • docker中k8s存储卷的示例分析
    这篇文章给大家分享的是有关docker中k8s存储卷的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。    因为pod是有生命周期的,pod一重启,里面的数据就没了...
    99+
    2023-06-04
  • MySQL中存储函数的示例分析
    这篇文章将为大家详细讲解有关MySQL中存储函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。存储函数什么是存储函数: 封装一段sql代码,完成一种特定的功能,...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作