ES6之数值的扩展

  • 1. 数值的扩展
    • 1.1. 二进制和八进制字面量表示:
    • 1.2. 数值判断方法:
      • 1.2.1. Number.isFinite() 检查一个值是否为有限的数值。
      • 1.2.2. Number.isNaN() 更准确地检测NaN值。
      • 1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别
    • 1.3. 数值转换方法:
    • 1.4. 整数检查与精度:
      • 1.4.1. Number.isInteger() 判断一个值是否为整数。
      • 1.4.2. Number.EPSILON 提供了一个极小的常量,用于比较浮点数时的误差容限。
      • 1.4.3. Number.isSafeInteger() 检查一个值是否为安全的整数(在 -(2^53) 到 2^53 之间)。
    • 1.5. 数值分隔符:
    • 1.6. Math对象的扩展:
      • 1.6.1. Math.trunc() 移除一个数的小数部分,返回整数部分。
      • 1.6.2. Math.sign():
      • 1.6.3. Math.cbrt():
      • 1.6.4. Math.hypot():
      • 1.6.5. 对数方法:
      • 1.6.6. Math.clz32():

1. 数值的扩展

ECMAScript 6 (ES6) 对数值的扩展引入了一些新的特性和方法,旨在提高数值处理的便利性和精确度。

以下是一些关键的扩展点及其示例:

1.1. 二进制和八进制字面量表示:

  • ES6 引入了新的字面量表示法来直接表示二进制和八进制数。
    • 二进制前缀为 0b0B
    • 八进制前缀为 0o0O
let binary = 0b1010; // 二进制表示10,十进制为10
let octal = 0o12;    // 八进制表示12,十进制为10
  • 如果要将 0b 和 0o 前缀的字符串数值转为十进制,要使用 Number 方法。
Number('0b111') // 7
Number('0o10') // 8

1.2. 数值判断方法:

1.2.1. Number.isFinite() 检查一个值是否为有限的数值。
console.log(Number.isFinite(15)); // true
console.log(Number.isFinite(Infinity)); // false

Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false
1.2.2. Number.isNaN() 更准确地检测NaN值。
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("Hello")); // false

Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('15') // false
Number.isNaN(true) // false
Number.isNaN(9/NaN) // true
Number.isNaN('true'/0) // true
Number.isNaN('true'/'true') // true
1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别
  • 传统方法先调用 Number() 将非数值的值转为数值,再进行判断,
  • 而这两个新方法只对数值有效, Number.isFinite() 对于非数值一律返回 false , Number.isNaN() 只有对于 NaN 才返回 true ,非 NaN 一律返回 false 。
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.isNaN(1) // false

1.3. 数值转换方法:

  • Number.parseInt()Number.parseFloat() 作为全局函数的严格版本,直接绑定在 Number 对象上。
console.log(Number.parseInt("123px")); // 123
console.log(Number.parseFloat("123.45em")); // 123.45

这样做的目的,是逐步减少全局性方法,使得语言逐步模块化

Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true

1.4. 整数检查与精度:

1.4.1. Number.isInteger() 判断一个值是否为整数。
console.log(Number.isInteger(42)); // true
console.log(Number.isInteger(42.1)); // false

需要注意的是,在JavaScript 内部,整数和浮点数是同样的储存方法,所以3和3.0被视为同一个值

Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
1.4.2. Number.EPSILON 提供了一个极小的常量,用于比较浮点数时的误差容限。

根据规格,它表示1与大于1的最小浮点数之间的差。

let num = 0.1 + 0.2;
console.log(Math.abs(num - 0.3) < Number.EPSILON); // true,判断浮点运算的误差

Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。

Number.EPSILON 可以用来设置“能够接受的误差范围”。

比如,误差范围设为2的-50次方(即 Number.EPSILON * Math.pow(2, 2) ),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true
1.4.3. Number.isSafeInteger() 检查一个值是否为安全的整数(在 -(2^53) 到 2^53 之间)。

超过这个范围,无法精确表示这个值。

Math.pow(2, 53) // 9007199254740992
9007199254740992 // 9007199254740992
9007199254740993 // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1 // true  

上面代码中,超出2的53次方之后,一个数就不精确了。
ES6引入 了 Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER 这两个
常量,用来表示这个范围的上下限。

Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
// true
Number.MAX_SAFE_INTEGER === 9007199254740991
// true
Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
// true
Number.MIN_SAFE_INTEGER === -9007199254740991
// true

Number.isSafeInteger() 则是用来判断一个整数是否落在这个范围之内。

Number.isSafeInteger('a') // false
Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false
Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false

1.5. 数值分隔符:

  • 数值字面量中可以使用下划线 _ 作为视觉上的千位分隔符,提高可读性。
let million = 1_000_000; // 等同于1000000

1.6. Math对象的扩展:

ES6对Math对象进行了扩展,增加了一系列新的方法来提供更强大的数学运算功能。以下是一些主要的扩展方法及其使用示例:

1.6.1. Math.trunc() 移除一个数的小数部分,返回整数部分。
console.log(Math.trunc(3.14)); // 3

对于非数值, Math.trunc 内部使用 Number 方法将其先转为数值。

Math.trunc('123.456') // 123
Math.trunc(true) //1
Math.trunc(false) // 0
Math.trunc(null) // 0

对于空值和无法截取整数的值,返回 NaN 。

Math.trunc(NaN); // NaN
Math.trunc('foo'); // NaN
Math.trunc(); // NaN
Math.trunc(undefined) // NaN
1.6.2. Math.sign():

用来判断一个数的符号,返回五种可能的值:1(正数)、0(零)、-1(负数)、-0(负零)、NaN(非数字)。

console.log(Math.sign(23));   // 输出: 1
console.log(Math.sign(-23));  // 输出: -1
console.log(Math.sign(0));    // 输出: 0
console.log(Math.sign(-0));   // 输出: -0
console.log(Math.sign('a'));  // 输出: NaN
1.6.3. Math.cbrt():

计算一个数的立方根。

console.log(Math.cbrt(27)); // 输出: 3
1.6.4. Math.hypot():

返回所有参数的平方和的平方根,常用于计算直角三角形的斜边长度。

console.log(Math.hypot(3, 4)); // 输出: 5
1.6.5. 对数方法:
  • Math.expm1(x) 返回 e^x - 1
  • Math.log1p(x) 返回 1 + x 的自然对数。
  • Math.log10(x) 返回以10为底x的对数。
  • Math.log2(x) 返回以2为底x的对数。
console.log(Math.expm1(1));  // 输出:约等于 1.71828
console.log(Math.log1p(1));  // 输出: 0.6931471805599453
console.log(Math.log10(100)); // 输出: 2
console.log(Math.log2(8));    // 输出: 3
1.6.6. Math.clz32():

返回一个数的32位无符号整数形式的前导零的个数。

console.log(Math.clz32(0b00000000000000000000000000001010)); // 输出: 26

这些方法丰富了JavaScript的数学运算能力,使得处理数学问题更加高效和便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/631362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探秘Web3科技:科技变革的下一个风口

引言 随着互联网的发展&#xff0c;我们正处于一个数字化时代&#xff0c;而Web3技术被认为是数字革命的下一个风口。相较于传统的Web2&#xff0c;Web3技术以其去中心化、安全可信的特点&#xff0c;正在引领着科技变革的潮流。本文将深入探讨Web3科技&#xff0c;揭示其背后…

可用在vue自动导入的插件unplugin-auto-import

在大多数vue3开发中&#xff0c;基本所有页面都会引用vue3 componsition api&#xff0c;如下代码 想这种vue3 架构中自带的api&#xff0c;如果在全局配置一下的话&#xff0c;就可以减少一部分代码量&#xff0c;只是在代码编译的时候&#xff0c;会添加相应的引用&#xff…

后台菜单数据递归展示

后台菜单数据递归展示 效果示例图aslide.vueaslideItem.vuemenu 效果示例图 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

ADS使用记录之使用RFPro进行版图联合仿真

ADS使用记录之使用RFPro进行版图联合仿真 在ADS中&#xff0c;我们往往使用EM仿真来明确电路的实际性能&#xff0c;但是常规的方法我们只会得到S参数&#xff0c;对于场还有电路的电流分布往往不进行检查。但是在实际中&#xff0c;观察场和电流分布是非常有意义的&#xff0…

Qt编译和使用freetype矢量字库方法

在之前讲过QT中利用freetype提取字库生成图片的方法&#xff1a; #QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览阅读1.2k次。这是某个项目中要用到的片段&#xff0c;结合上一篇文章#QT从字体名获取字库文件路径使用// 保存位图int SaveBitmapToFile(HBITMAP hBi…

如何使用一段传输线表示电感和电容

文中部分图片来自于《complete Wireless design》 如何使用一段传输线来表示电感和电容&#xff0c;本文将就此内容展开&#xff1a;

Python 渗透测试:反弹 shell (反弹 后门 || 程序免杀)

什么叫 反弹 shell 反弹 shell (Reverse Shell) 是一种常见的渗透测试技术,它指的是受害者主机主动连接攻击者的主机,从而让攻击者获得对受害者主机的控制权。在一个典型的反弹 shell 攻击中,攻击者会在自己的主机上监听一个特定的端口,然后诱使目标主机主动连接到这个端口。当…

react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)

useReducer 可看做升级版的 useState &#xff0c;其强大之处在于&#xff0c;可以自定义复杂的响应式变量修改逻辑。 useReducer 语法 useReducer 是 hook 函数 第一个参数&#xff08;必要&#xff09;&#xff1a; 自定义的 reducer 函数&#xff08;详见下文介绍&#xff…

图片转base64【Vue + 纯Html】

1.template <el-form-item label"图片"><div class"image-upload-container"><input type"file" id"imageUpload" class"image-upload" change"convertToBase64" /><label for"imageU…

AI图书推荐:ChatGPT 和Power BI驱动未来金融投资变革

《ChatGPT 和Power BI驱动未来金融变革》&#xff08;The Future of Finance with ChatGPT and Power BI&#xff09;由James Bryant和Aloke Mukherjee撰写&#xff0c;探讨了ChatGPT和Power BI在金融领域的应用。 主要特点&#xff1a; - 使用ChatGPT自动化Power BI&#xff…

工厂数字化解决方案

在数字化浪潮席卷全球的今天&#xff0c;工业4.0已不再是遥不可及的梦想&#xff0c;而是制造业转型升级的必由之路。面对日益激烈的市场竞争和消费者需求的快速变化&#xff0c;传统工厂如何借助数字化技术实现智能化、高效化、柔性化生产&#xff0c;成为了摆在每一个企业面前…

创新指南 | 企业AI战略实施方案探讨(下):如何基于AI重构业务流程并落地实施

人工智能&#xff08;AI&#xff09;的浪潮已经席卷全球&#xff0c;成为推动现代企业发展的强大动力。AI技术不仅提升了企业的运营效率&#xff0c;还催生了新的商业模式和市场机会。本文将深入探讨AI的革新性应用案例&#xff0c;并提供一套企业落地AI的具体实施方案&#xf…

一次tomcat闪退处理

双击tomcat目录下bin目录中startup.bat 在我的电脑上是一闪而过&#xff0c;不能正常地启动tomcat软件 以记事本打开startup.bat文件&#xff0c;在文件的结尾处加上pause 然后再双击该bat执行&#xff0c;此时窗口就不会关闭&#xff0c;并会将错误信息打印在提示框中 可能是…

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…

绝地求生:PGS3参赛队伍跳点一览,17压力有点大,4AM与PeRo大概率不roll点

在PCL春季赛结束后&#xff0c;PGS3的参赛队伍名单以及分组就正式确定了&#xff0c;最后确定名额的DDT和NH被安排在了A组和B组&#xff0c;感觉这次PGS3的分组比较均衡&#xff0c;没有“死亡之组”一说。这段时间已经有网友汇总了PGS3队伍在各个地图的跳点&#xff0c;并且把…

总结!AI Agent开发的常见方法

全球首位AI程序员Devin诞生了&#xff0c;还是个全栈工程师&#xff0c;能够熟练进行云端部署、编写底层代码、改bug、甚至连训练和微调AI大模型都轻车熟路&#xff0c;说好的AI替代人类&#xff0c;难道先从程序员下手了&#xff1f; 实际上用AI打造程序员并不是那么新鲜的事情…

读人工智能时代与人类未来笔记04_理性时代

1. 理性时代 1.1. 康德在《永久和平论》一文中带着些许的怀疑主义提出&#xff0c;和平可以通过应用达成一致的规则管理独立国家之间的关系来实现 1.2. 理性则借助高等理论物理学的形式&#xff0c;开始进一步探索康德的“自在之物”&#xff0c;并产生…

Leetcode—3148. 矩阵中的最大得分【中等】

2024每日刷题&#xff08;137&#xff09; Leetcode—3148. 矩阵中的最大得分 算法思想 实现代码 class Solution { public:int maxScore(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();int ans INT_MIN;vector<vector<int&…

RocketMQ-Dashboard 控制台使用详解

1 安装部署 具体部署启动请参考&#xff1a;RocketMQ从安装、压测到运维一站式文档_rocketmq benchmark压测-CSDN博客 RocketMq的dashboard&#xff0c;有运维页面&#xff0c;驾驶舱&#xff0c;集群页面&#xff0c;主题页面&#xff0c;消费者页面&#xff0c;生产者页面&…

2D Chests Assets - Mega Pack

科幻/奇幻/经典主题的箱子和容器。AAA质量,高分辨率,VFX,源PSD文件。 这是一个带有手绘套装的大包装: -【梦幻之栗】 -【科幻钱包】 AAA质量。高分辨率。一切都已准备就绪,可供使用。包括PSD文件。 在1.1版本中添加了VFX并将项目更新为URP。请注意,新的VFX仅适用于URP/HD…