当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【MySQL】:对库和表的基本操作方法
  • 33.【C语言】实践扫雷游戏
  • WEB安全-SQL注入
  • 鸿蒙语言基础类库:【@system.vibrator (振动)】
  • 【Langchain大语言模型开发教程】记忆
  • electron学习笔记
  • linux之网络子系统-本机发包到本机 实现
  • 1比25万基础电子地图(广东版)
  • 踏进互动科技世界使用Arduino
  • 【测开能力提升-Javascript】JavaScript运算符流程结构
  • 构建高效Node.js中间层:探索请求合并转发的艺术
  • 深入解析sizeof和strlen的区别与联系
  • 麒麟V10安装nginx、mysql报错缺少包:error while loading shared libraries libssl.so.10
  • Sparksql常用的json相关函数
  • PostgreSQL 中如何处理数据的唯一性约束?
  • 【面试系列】之二:关于js原型
  • 2018一半小结一波
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • JAVA SE 6 GC调优笔记
  • JavaScript创建对象的四种方式
  • Vue官网教程学习过程中值得记录的一些事情
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 飞驰在Mesos的涡轮引擎上
  • 关于Java中分层中遇到的一些问题
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 聊聊redis的数据结构的应用
  • 马上搞懂 GeoJSON
  • 每天10道Java面试题,跟我走,offer有!
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 一文看透浏览器架构
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 正则与JS中的正则
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 大数据全解:定义、价值及挑战
  • ‌移动管家手机智能控制汽车系统
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #define,static,const,三种常量的区别
  • #Ubuntu(修改root信息)
  • (二)测试工具
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)u-boot-nand.bin的下载
  • (一)WLAN定义和基本架构转
  • (转)Linq学习笔记
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net操作Excel出错解决
  • .net程序集学习心得
  • .NET的微型Web框架 Nancy
  • .net开发日常笔记(持续更新)
  • .NET设计模式(2):单件模式(Singleton Pattern)