ES6 数值的扩展(十八)

1. 二进制和八进制字面量

特性:可以直接在代码中使用二进制(0b 或 0B)和八进制(0o 或 0O)字面量。
用法:简化二进制和八进制数值的表示。

const binaryNumber = 0b1010; // 二进制表示 10
const octalNumber = 0o12;    // 八进制表示 10
console.log(binaryNumber);   // 输出:10
console.log(octalNumber);     // 输出:10

2. Number.isFinite()

Number.isFinite()用来检查一个数值是否为有限的(finite),即不是 Infinity 。
特性:判断一个值是否是有限数值。
用法:检查一个数值是否是有限的。

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

3. Number.isNaN()

Number.isNaN() 用来检查一个值是否为NaN。
特性:判断一个值是否是 NaN。
用法:区分 NaN 和其他非数值。

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
//如果参数类型不是 NaN , Number.isNaN 一律返回 false 

它们与传统的全局方法 isFinite() 和 isNaN() 的区别在于,传统方法先调用 Number()
将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效, Number.isFinite() 对于非数值一律返回 false ,Number.isNaN() 只有对于NaN才返回true ,非 NaN 一律返回 false 。

4. Number.parseInt() 和 Number.parseFloat()

ES6 将全局方法 parseInt() 和 parseFloat(),移植到 Number 对象上面,行为完全保持不变。
特性:Number.parseInt 被重新定义为与全局的 parseInt 一致,Number.parseFloat 被重新定义为与全局的 parseFloat 一致。
用法:解析字符串为整数或浮点数。

// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true

5. Math 对象的扩展

ES6 在Math 对象上新增了 17个与数学相关的方法。所有这些方法都是静态方法,只能在 Math 对象上调用。
特性:Math 对象增加了一些新的静态方法,如 Math.trunc()、Math.sign()、Math.cbrt() 等。
用法:提供更多的数学运算功能。

  • Math.trunc() //用于去除一个数的小数部分,返回整数部分。
Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0
Math.trunc(NaN);      // NaN
Math.trunc('foo');    // NaN
Math.trunc();         // NaN
Math.trunc(undefined) // NaN
  • Math.sign() //Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。

它会返回五种值。
参数为正数,返回 +1 ;
参数为负数,返回 -1 ;
参数为 0,返回 0 ;
参数为-0,返回 -0 ;
其他值,返回 NaN 。

Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign(NaN) // NaN
Math.sign(‘’) // 0
Math.sign(true) // +1
Math.sign(false) // 0
Math.sign(null) // 0
Math.sign(‘9’) // +1
Math.sign(‘foo’) // NaN
Math.sign() // NaN
Math.sign(undefined) // NaN

  • Math.cbrt() //用于计算一个数的立方根
Math.cbrt(-1) // -1
Math.cbrt(0)  // 0
Math.cbrt(1)  // 1
Math.cbrt(2)  // 1.2599210498948732
Math.cbrt('8') // 2
Math.cbrt('hello') // NaN

对于没有部署这个方法的环境,可以用下面的代码模拟。

Math.cbrt = Math.cbrt || function(x) {var y = Math.pow(Math.abs(x), 1/3);return x < 0 ? -y : y;
};
  • Math.clz32() //Math.clz32() 方法将参数转为 32 位无符号整数的形式,然后返回这个 32 位值里面有多少个前导 0。
Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1 << 1) // 30
Math.clz32(1 << 2) // 29
Math.clz32(1 << 29) // 2Math.clz32(3.2) // 30
Math.clz32(3.9) // 30Math.clz32() // 32
Math.clz32(NaN) // 32
Math.clz32(Infinity) // 32
Math.clz32(null) // 32
Math.clz32('foo') // 32
Math.clz32([]) // 32
Math.clz32({}) // 32
Math.clz32(true) // 31
  • Math.imul() //Math.imul方法返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。
Math.imul(2, 4)   // 8
Math.imul(-1, 8)  // -8
Math.imul(-2, -2) // 4

(0x7fffffff * 0x7fffffff)|0 // 0
上面这个乘法算式,返回结果为 0。但是由于这两个二进制数的最低位都是 1,所以这个结果肯定是不正确的,因为根据二进制乘法,计算结果的二进制最低位应该也是 1。这个错误就是因为它们的乘积超过了 2 的 53 次方,JavaScript 无法保存额外的精度,就把低位的值都变成了 0。 Math.imul 方法可以返回正确的值 1。

Math.imul(0x7fffffff, 0x7fffffff) // 1
  • Math.fround() //Math.fround 方法返回一个数的32位单精度浮点数形式。
Math.fround(0)   // 0
Math.fround(1)   // 1
Math.fround(2 ** 24 - 1)   // 16777215// 未丢失有效精度
Math.fround(1.125) // 1.125
Math.fround(7.25)  // 7.25
// 丢失精度
Math.fround(0.3)   // 0.30000001192092896
Math.fround(0.7)   // 0.699999988079071
Math.fround(1.0000000123) // 1Math.fround(NaN)      // NaN
Math.fround(Infinity) // Infinity
Math.fround('5')      // 5
Math.fround(true)     // 1
Math.fround(null)     // 0
Math.fround([])       // 0
Math.fround({})       // NaN//对于没有部署这个方法的环境,可以用下面的代码模拟。
Math.fround = Math.fround || function (x) {return new Float32Array([x])[0];
};
  • Math.hypot() //Math.hypot方法返回所有参数的平方和的平方根。
Math.hypot(3, 4);        // 5
Math.hypot(3, 4, 5);     // 7.0710678118654755
Math.hypot();            // 0
Math.hypot(NaN);         // NaN
Math.hypot(3, 4, 'foo'); // NaN
Math.hypot(3, 4, '5');   // 7.0710678118654755
Math.hypot(-3);          // 3

6. Number.isInteger()

Number.isInteger()用来判断一个数值是否为整数。

Number.isInteger(25) // true
Number.isInteger(25.1) // falseNumber.isInteger(25) // true
Number.isInteger(25.0) // trueNumber.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // falseNumber.isInteger(3.0000000000000002) // trueNumber.isInteger(5E-324) // false
Number.isInteger(5E-325) // true

7. Number.EPSILON

ES6 在 Number 对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的 1.00…001 ,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的 -52 次方。

Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// "0.00000000000000022204"0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
5.551115123125783e-17.toFixed(20)
// '0.00000000000000005551'
0.1 + 0.2 === 0.3 // false
5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2)
// true// Number.EPSILON 的实质是一个可以接受的最小误差范围
function withinErrorMargin (left, right) {return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}
0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true
1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true

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

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

8. 安全整数和 Number.isSafeInteger()

特性:判断一个值是否是安全整数,即在 -(2^53 - 1) 到 2^53 - 1 之间的整数。
用法:检查一个数值是否是安全整数。

console.log(Number.isSafeInteger(10));       // 输出:true
console.log(Number.isSafeInteger(2 ** 53));   // 输出:false
console.log(Number.isSafeInteger(NaN));      // 输出:false
Math.pow(2, 53) // 9007199254740992
9007199254740992  // 9007199254740992
9007199254740993  // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1
// true
// 上面代码中,超出 253 次方之后,一个数就不精确了。
// ES6 引入了Number.MAX_SAFE_INTEGER和 Number.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

7. BigInt 类型

JavaScript 原生提供 BigInt 对象,可以用作构造函数生成 BigInt 类型的数值。转换规则基本与 Number() 一致,将其他类型的值转为 BigInt。
特性:提供了一种可以安全表示和操作大整数的数据类型。
用法:处理超过传统 Number 范围的整数。

BigInt(123) // 123n
BigInt('123') // 123n
BigInt(false) // 0n
BigInt(true) // 1nnew BigInt() // TypeError
BigInt(undefined) //TypeError
BigInt(null) // TypeError
BigInt('123n') // SyntaxError
BigInt('abc') // SyntaxErrorBigInt(1.5) // RangeError
BigInt('1.5') // SyntaxErrorconst max = 2n ** (64n - 1n) - 1n;
BigInt.asIntN(32, max) // -1n
BigInt.asUintN(32, max) // 4294967295n// Number.parseInt() 与 BigInt.parseInt() 的对比
Number.parseInt('9007199254740993', 10)
// 9007199254740992
BigInt.parseInt('9007199254740993', 10)
// 9007199254740993n
const bigNumber = 1234567890123456789012345678901234567890n;
console.log(bigNumber); // 输出:1234567890123456789012345678901234567890nconst sum = 100n + 200n; // 使用 BigInt
console.log(sum); // 输出:300n

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟系统arm架构上部署开发环境。

今天早早来到公司&#xff0c;这也是再公司搬址前在老地址待得最后一天&#xff0c;昨天把前面重要的一个任务也完成的差不多了&#xff0c;遂现在记录一下。 收到任务&#xff0c;要将公司的开发环境和生产环境配置在银河麒麟v10服务器上。这个服务器是向华为申请得到的&…

实战:Eureka的概念作用以及用法详解

概叙 什么是Eureka&#xff1f; Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心&#xff0c;用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分&#xff0c;基于 Netflix Eureka 进行了二次封装&#xff0c;主要负责…

高性能分布式IO系统BL205 OPC UA耦合器

边缘计算是指在网络的边缘位置进行数据处理和分析&#xff0c;而不是将所有数据都传送到云端或中心服务器&#xff0c;这样可以减少延迟、降低带宽需求、提高响应速度并增强数据安全性。 钡铼BL205耦合器就内置边缘计算功能&#xff0c;它不依赖上位机和云平台&#xff0c;就能…

基于 Go1.19 的站点模板爬虫:构建与实战

引言 随着互联网的发展&#xff0c;网络爬虫已成为数据抓取和分析的重要工具。Go&#xff08;Golang&#xff09;语言凭借其高效、简洁的特性&#xff0c;成为构建爬虫的热门选择之一。本文将引导你使用 Go1.19 版本&#xff0c;构建一个基于站点模板的网页爬虫&#xff0c;以…

npm安装依赖包的多种镜像及方法

一般安装依赖包&#xff0c;都是使用 npmjs 镜像安装&#xff0c;或者使用淘宝镜像安装。 比如&#xff1a; npm i react查看当前镜像&#xff1a; npm config get registry当面对 npmjs 镜像无法访问以及淘宝 npm 镜像&#xff08;cnpm&#xff09;SSL 证书过期的问题&…

PyTorch中的batch_size和num_workers

PyTorch中的batch_size和num_workers 什么是 batch_size&#xff1f;什么是 num_workers&#xff1f;综合考量 什么是 batch_size&#xff1f; batch_size 是指在每次迭代中送入模型进行训练的数据样本的数量。它对训练过程有着重要影响&#xff1a; 计算效率&#xff1a;较大…

数据仓库实践:使用 SQL 计算材料BOM成本单价

背景 在制造业财务数据分析建设过程中&#xff0c;有时需要通过BOM汇总计算材料的单价&#xff0c;一般会有采购核价&#xff0c;库存成本&#xff0c;还有下阶材料单价按用量汇总得到的单价参与。 这些单价来源一般会根据优先级获取并在计算后作为最终的BOM 单价结果。参与财…

GPT-5一年半后发布

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; 一&#xff1a;GPT-5技术突破预测 GPT-5的推出预示着自然语言处理&#xff08;NLP&#xff09;领域将迎来前所未有的技术革新&#xff0c;这将从多个方面推动行业发展。首先&#xff0c;GPT-5在算法上的进步显著&…

防范UDP Flood攻击的策略与实践

UDP Flood攻击是一种常见的分布式拒绝服务&#xff08;DDoS&#xff09;攻击手段&#xff0c;通过向目标服务器发送大量无效的UDP数据包&#xff0c;消耗其网络带宽和处理资源&#xff0c;最终导致合法的网络服务无法正常运行。本文将深入探讨UDP Flood攻击的原理、常见的防御策…

iOS ------ 编译链接

编译流程分析 编译可以分为四步&#xff1a; 预处理&#xff08;Prepressing)编译&#xff08;Compilation&#xff09;汇编 &#xff08;Assembly)链接&#xff08;Linking&#xff09; 预编译&#xff08;Prepressing&#xff09; 过程是源文件main.c和相关头文件被&#…

SQL Server查询计划阅读及分析

​​​​​​6.4.5. 查询计划阅读及分析 SQL Server中,SQL语句的查询计划可能会包含多个节点,每个节点除了包含和对应一个操作符外,还包含节点及操作符相关的其他信息,其细节与具体的操作符相关。SQL Server查询计划与Oracle执行计划中,虽然每个节点所包含内容的具体称谓…

window11 部署llama.cpp并运行Qwen2-0.5B-Instruct-GGUF

吾名爱妃&#xff0c;性好静亦好动。好编程&#xff0c;常沉浸于代码之世界&#xff0c;思维纵横&#xff0c;力求逻辑之严密&#xff0c;算法之精妙。亦爱篮球&#xff0c;驰骋球场&#xff0c;尽享挥洒汗水之乐。且喜跑步&#xff0c;尤钟马拉松&#xff0c;长途奔袭&#xf…

FastAPI 学习之路(五十九)封装统一的json返回处理工具

在本篇文章之前的接口&#xff0c;我们每个接口异常返回的数据格式都不一样&#xff0c;处理起来也没有那么方便&#xff0c;因此我们可以封装一个统一的json。 from fastapi import status from fastapi.responses import JSONResponse, Response from typing import Unionde…

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…

Go语言并发编程-Channel通信_2

Channel通信 Channel概述 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存&#xff0c;而Go语言中多Goroutine通信的主要方案是Cha…

JavaEE:Lombok工具包的使用以及EditStarter插件的安装

Lombok是一个Java工具库&#xff0c;通过添加注解的方式&#xff0c;简化Java的开发。 目录 1、引入依赖 2、使用 3、原理解释 4、更多使用 5、更快捷的引入依赖 1、引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lomb…

pdf提取其中一页怎么操作?提取PDF其中一页的方法

pdf提取其中一页怎么操作&#xff1f;需要从一个PDF文件中提取特定页码的操作通常是在处理文档时常见的需求。这种操作允许用户选择性地获取所需的信息&#xff0c;而不必操作整个文档。通过选择性提取页面&#xff0c;你可以更高效地管理和利用PDF文件的内容&#xff0c;无论是…

结合Redis解决接口幂等性问题

结合Redis解决接口幂等性问题 引言正文收获 引言 该问题产生背景是根据需求描述&#xff0c;要求对已发布的课程能进行编辑修改&#xff0c;并且要求能进行回滚。 幂等性问题描述&#xff1a;对同一个接口并发请求产生的结果是不变的。 Get 请求以及 Delete 请求天然保证幂等…

Linux编辑器——vim的使用

目录 vim的基本概念 命令模式 底行模式 插入模式 注释和取消注释 普通用户进行sudo提权 vim配置问题 vim的基本概念 一般使用的vim有三种模式&#xff1a; 命令模式 底行模式和插入模式&#xff0c;可以进行转换&#xff1b; vim filename 打开vim&#xff0c;进入的…

【代码随想录|贪心算法 455. 分发饼干 376. 摆动序列 53. 最大子数组和】

代码随想录|贪心算法 455. 分发饼干 一、455. 分发饼干1.代码2.问题 二、376. 摆动序列1.代码 三、53. 最大子数组和1.代码 总结 python 一、455. 分发饼干 455. 分发饼干 1.代码 代码如下&#xff08;示例&#xff09;&#xff1a; class Solution:def findContentChildr…