JavaScript 数字在内存中的大小都相同吗?

2024-05-16

我正在阅读本书的面向 Web 开发人员的专业 JavaScript。似乎所有 ECMAScript 数字都是 binary64 浮点数,这得到了证实这篇 MDN 文章 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures。但书的作者也说:

由于存储浮点值使用的内存是存储整数值的两倍,因此 ECMAScript 总是寻找将值转换为整数的方法。

我期望每个数字占用相同的内存量:64 位。 MDN 文章说,“整数没有特定的类型”。有谁知道这本书的作者的意思吗?当整数存储为 64 位浮点数时,如何才能占用更少的内存(如果我有这个权利的话)?您可以在上面的链接中找到整个部分(该书的免费样本)。


JavaScript 除了双精度浮点之外没有任何其他数字类型(ECMAScript 6 除外)类型数组 http://www.ecma-international.org/ecma-262/6.0/#table-49),但底层实现可以选择以任何它喜欢的方式存储数字,只要 JavaScript 代码的行为相同。

JavaScript 现在是编译的,这意味着它可以通过许多语言中不明显的方式进行优化。

如果函数中的局部变量仅采用整数值并且不以任何方式暴露在函数外部,那么它实际上可以在编译代码时使用整数类型来实现。

不同浏览器的实现有所不同。目前,它似乎在 MS Edge 中产生了巨大的差异,在 Firefox 中产生了很大的差异,而在 Chrome 中则完全没有差异:http://jsperf.com/int-vs-double-implementation http://jsperf.com/int-vs-double-implementation(注:jsperf 认为 MS Edge 是 Chrome 42。)


进一步的研究:

JS 引擎 Spidermonkey (Firefox)、V8 (Chrome、Opera)、JavaScriptCore (Safari)、Chakra (IE) 和 Rhino(可能还有其他引擎,但很难找到实现细节)使用不同的方式使用整数类型或存储尽可能将数字视为整数。一些引言:

“有效地表示数字和 JavaScript 对象,V8 用 32 位值代表我们俩。它使用了一点 知道它是一个对象(flag = 1)还是一个整数(flag = 0) 这里是 SMall Integer 或 SMI,因为它是 31 位。”

http://thibaultlaurens.github.io/javascript/2013/04/29/how-the-v8-engine-works/ http://thibaultlaurens.github.io/javascript/2013/04/29/how-the-v8-engine-works/

“JavaScript 没有内置的整数值概念,但是 为了提高效率,JavaScriptCore 会将大多数整数表示为 int32 而不是双倍。”

http://trac.webkit.org/wiki/JavaScriptCore http://trac.webkit.org/wiki/JavaScriptCore

“[...]非双精度值是 32 位类型标签和 32 位有效负载, 通常是指针或带符号的 32 位整数。”

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals

“在 Windows 10 和 Microsoft Edge 中,我们已经开始优化 Chakra 解析器和 JIT 编译器识别非常量变量 全局定义且从不存在的整数声明 在程序执行期间发生了变化。”

https://blogs.windows.com/msedgedev/2015/05/20/delivering-fast-javascript-performance-in-microsoft-edge/ https://blogs.windows.com/msedgedev/2015/05/20/delivering-fast-javascript-performance-in-microsoft-edge/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 数字在内存中的大小都相同吗? 的相关文章

  • 如何等待第一次画布重绘,直到 @font-face-font 加载?

    我有一个 HTML5 画布并用它编写文本context fillText 使用 font face font 使用 Firefox 3 6 显示页面我遇到问题 在画布的第一次绘制上 字体尚未下载 因此文本将以标准字体显示 我找到了一个 解决
  • 当代理关闭并启动时,Node JS mqtt 客户端未收到订阅的消息

    我创建了一个 mqtt Node js 客户端 我的连接选项如下 mqttOptions clientId 100 keepAlive 1000 clean false reconnectPeriod 1000 will willMessa
  • 在 sinon.js 中存根和/或模拟类?

    我已经为我的应用程序创建了一个数据库包装器 如下所示 为了测试它 我显然想替换实际的数据库 我可以创建一个新类来模拟query方法并捕获那里的所有输入 但是使用sinon js看起来更合适 但是我该如何使用它呢 Is the mock or
  • 如何从 React Navigation 获取之前的路线名称

    我正在尝试将以前的路线名称获取到当前屏幕 因为根据之前的屏幕名称 我必须在当前屏幕中显示 隐藏一些对象 为了获取以前的屏幕名称 我尝试过以下操作 componentDidMount const navigation this props i
  • 尝试制作Linux终端但失败

    这可能是一个愚蠢的问题 可能很容易找到 但我对这一切都很陌生 我似乎找不到我要找的东西 或者至少我不知道我需要寻找什么 所以我在这里 所以我想做的是创建一种 Linux 终端 这就是我到目前为止所得到的 我所坚持的是实际输入文本部分 我一直
  • 如何在 HTML 链接中使用 JavaScript 变量

    我正在开发的网站有一个标签指向与网站所具有的 URL 不同的 URL 我想做的是绕过使用下面的 trueURL 标记来查找网页的网址 因为我需要它来构造一些内部锚点 因为我需要网站的实际网址 以便内部锚点正常工作 我遇到的问题是我不知道应该
  • 使用 ReactJS 突出显示文本

    我试图突出显示与查询匹配的文本 但我不知道如何让标签显示为 HTML 而不是文本 var Component React createClass highlightQuery function name query var regex ne
  • 如何使用画布调整图像大小然后裁剪图像

    我已经知道如何 gt 调整图像大小 var image document getElementById myImage canvas document createElement canvas ctx canvas getContext 2
  • Javascript dispatchEvent click 在 IE9 和 IE10 中不起作用

    我正在尝试在 ExtJs 中构建应用程序时模拟鼠标事件 例如单击 鼠标悬停等 我使用下面的代码来模拟点击 function triggerEvent element eventName if document createEvent var
  • img设置flex-grow来填充flex容器剩余空间,它会导致flex内部溢出flex容器[重复]

    这个问题在这里已经有答案了 以下是我的代码 text1 溢出 Flex 容器 我期望 Flex 容器中的 img 文本和 img 填充 Flex 容器其余部分
  • 创建一个通用函数以将其用于其他数据

    我正在制作一个项目列表 并希望随着数量变化计算其值 但如何使该函数通用以便我可以将它用于所有行 你能建议一些最好和简单的方法 但请记住我想这样做仅限 JavaScript table thead tr th Name th th Quant
  • 如何从 HTML 图表中删除网址 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 HTML 中创建一个图表 我正在使用 API amCharts 但问题是它在图表中显示文本 amchart 我怎样才能删除该文本
  • 如何通过 Web-Workers 传递自定义类实例?

    由于 Web Worker JSON 在线程之间序列化数据 因此这样的方法不起作用 worker js function Animal Animal prototype foobar function self onmessage func
  • 如何将多种语言设置放入单个 .clang-format 文件中

    我想为 java javascript 和 c 创建一个 clang 格式 我知道如何转储单一语言的示例配置 但不知道如何合并这 3 个配置文件 有关如何将多种语言配置放入单个文件中的示例 BasedOnStyle LLVM IndentW
  • 如何在 html5 中加载部分 html? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 询问我们的问题推荐或查找工具 库或最喜欢的场外资源与 Stack Overflow 无关 因为它们往往会吸引固执己见的答案和垃圾邮件 反而
  • 如何使用 JavaScript 使 DIV 可见和不可见?

    你能做类似的事情吗 function showDiv DIV visible true or something 如果 DIV 是一个元素那么 DIV style visibility visible OR DIV style visibi
  • 对数滑块

    我有一个值范围从 0 到 100 的滑块 我想将它们映射到 100 到 10 000 000 的范围 我在网上看到过一些函数 但它们都是用 C 编写的 我需要它在 JavaScript 中 有任何想法吗 您可以使用这样的函数 functio
  • 如何使我的响应式网站在手机上支持“请求桌面网站”?

    我有一个响应灵敏的动态网站 Java Servlet 驱动且完全手工编码 由于它是一个返回数据表的科学站点 因此某些选项在较小的视口宽度下不可用 然而 可能有些用户更喜欢在桌面网站上挣扎才能访问这些选项 我希望适应他们 我的问题是 对于 i
  • 使用与 eval 相反的括号表示法

    我有以下内容 var module function console log module ran var someString module string TypeError object is not a function eval s
  • Google Maps JavaScript API v3 方向功能

    我使用 Google Maps js API v3 我可以根据路径点显示方向this http code google com intl hu apis maps documentation directions Waypoints 我想要

随机推荐

  • Word通过vba宏删除tabe列出现错误

    我想将excel中的数据复制到word表中 然后从表中删除一些列 我可以将数据复制到表中 但是当我删除列时会出现错误 无法访问此集合中的各个列 因为该表具有混合的单元格宽度 我的代码 Public Tbl1 As Table Sub cal
  • 为什么 EF Core 一对多关系集合返回 null?

    这可能看起来像一个重复的问题EF Core 一对多关系列表返回 null https stackoverflow com questions 55210832 ef core one to many relationship list re
  • Pytest 固定装置的范围“类”在每个方法上运行

    我正在尝试使用 Pytest 创建一个测试环境 这个想法是将测试方法分组到类中 对于每个班级 小组 我想附上config将要参数化的夹具 这样我就可以使用 配置 A 运行所有测试 然后使用 配置 B 运行所有测试 依此类推 但同时 我也想要
  • Python 中使用 geoJSON 绘制多边形中的点

    我有一个包含大量多边形 特别是人口普查区 的 geoJSON 数据库 并且有很多长的纬度点 我希望存在一个有效的 Python 代码来识别给定坐标位于哪个人口普查区 但是到目前为止我的谷歌搜索还没有透露任何信息 Thanks 我发现了一个有
  • 将 < 或 > 运算符作为参数传递给函数?

    我的函数里面有一个if 像这样的声明 if passedValue lt staticValue 但我需要能够传递一个参数来指示 if 表达式是像上面那样还是 if passedValue gt staticValue 但我真的无法通过 l
  • Postgresql 的 SQL_NO_CACHE?

    MySQL 关键字是否有等效的 postgresqlSQL NO CACHE 或 SQL Serverdbcc drop clean buffers 即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分吗 UPDATE 这个问题 查看
  • Keycloak 无法使用服务帐户令牌获取具有权限的 RPT

    我正在使用Keycloak 4 8 3 Final 我在 Keycloak 中有以下客户 用户服务 库存服务 库存服务在 Keycloak 中定义了一些资源并启用了授权 用户服务 作为服务帐户 在中分配了必要的客户端角色服务帐户角色 tab
  • 使用正确的头打印文件名

    我想获取当前目录中的文件名 使得文件的第一行等于myWord 我想结合find type f命令与 exec选项与head 1 filename但无济于事 有没有一些聪明的 单行的解决方案来解决这个问题 您可以使用find with awk
  • hashmap包含键的复杂度

    我写了一个方法来查找列表中的重复项 它工作正常 但我担心使用 containsKey 的复杂性 当我们使用 containsKey 时 我们必须为每个键计算一个哈希函数 然后将每个键与我们的搜索项进行比较 对吗 那么复杂度不是 O n 吗
  • Spinner onItemSelected() 执行不当[重复]

    这个问题在这里已经有答案了 可能的重复 Android Spinner OnItemSelected 调用错误 打开微调器时没有用户操作 https stackoverflow com questions 5124835 android s
  • 为什么我的 Mongoose 3.8.7 架构 getter 和 setter 被忽略?

    在使用 Node js Mongoose 和 MongoDB 时 我发现当我执行 findOne 查询时 我的 Mongoose 模式 getter 和 setter 不会触发 我发现一个旧线程表明 2 x 版本中的 getter 和 se
  • 检测Android设备是否具有短信发送功能的程序是什么?

    检测Android设备是否具有短信发送功能的程序是什么 我希望我的应用程序在尝试实际发送短信之前知道设备是否能够发送短信 谢谢 if getPackageManager hasSystemFeature PackageManager FEA
  • firestore安全规则中更新字段的数量

    我正在从客户端进行批量操作以仅更新一个字段 但在进行批量操作和安全规则测试时 观察到多个字段正在被更新 我用这个检查了request resource data size gt 1 and request resource data key
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • 如果浏览器关闭,GoogleWebAuthorizationBroker.AuthorizeAsync() 会挂起

    我正在编写一个 C 桌面应用程序 可以将其输出复制到用户的 Google Drive 但是 当我尝试使用 GoogleWebAuthorizationBroker AuthorizeAsync 授权访问 Google 时 如果用户关闭浏览器
  • 使用 forge(或其他 JavaScript 方法)生成随机大素数

    我需要在 JavaScript 中生成一个随机大 大约 4096 位 素数 并且我已经在使用 forge Forge 必须有某种生成器来完成此类任务 因为它实现了 RSA 而 RSA 也依赖于随机素数 然而 当你只想获得一个随机素数 类似于
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 使用服务中的可观察量测试错误情况

    假设我有一个订阅服务功能的组件 export class Component ngOnInit this service doStuff subscribe data IData gt doThings data error Error g
  • JavaScript 数字在内存中的大小都相同吗?

    我正在阅读本书的面向 Web 开发人员的专业 JavaScript 似乎所有 ECMAScript 数字都是 binary64 浮点数 这得到了证实这篇 MDN 文章 https developer mozilla org en US do