前言

本章介绍数值的扩展。新增了很多方法,有些不常用的方法了解即可。

本章原文链接:数值的扩展

进制表示法

ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。

八进制就不再允许使用前缀0表示。

0b0o前缀的字符串数值转为十进制,要使用Number方法。

console.log(Number('0b10'));  // 二进制 2
console.log(Number('0o10')); // 八进制 8

数值分隔符

ES2021,允许 JavaScript 的数值使用下划线(_)作为分隔符。

数值分隔符主要为了书写数值时增加数值的可读性,不是为了处理外部输入的数据,对于 JavaScript 内部数值的存储和输出,并没有影响。

注意:

  • 不能放在数值的最前面(leading)或最后面(trailing)。
  • 不能两个或两个以上的分隔符连在一起。
  • 小数点的前后不能有分隔符。
  • 科学计数法里面,表示指数的eE前后不能有分隔符。
  • 分隔符不能紧紧跟着进制的前缀
  • 字符串转数值的一些操作方法不支持数值分隔符

其它进制也能使用数值分隔符

const sample10 = 1000_1000_1000;
const sample2 = 0b1000_1000;
const sample8 = 0o1000_1000; console.log(sample10); // 十进制 100010001000
console.log(sample2); // 二进制 136
console.log(sample8); // 八进制 2097664

注意:Number()、parseInt()、parseFloat()不支持数字分隔符

数值的方法

Number.isFinite(), Number.isNaN()

ES6 在Number对象上,新提供了Number.isFinite()Number.isNaN()两个方法。

  • Number.isFinite()用来检查一个数值是否为有限的数字(finite),即不是Infinity
  • Number.isNaN()用来检查一个数值是否为NaN。

注意:

两个新方法与之前全局方法isFiniteisNaN有什么不同呢?

  • 而这两个新方法只对数值有效,
  • 传统方法先调用Number()将非数值的值转为数值,再进行判断,
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false

Number.parseInt(), Number.parseFloat()

ES6 将全局方法parseInt()parseFloat(),移植到Number对象上面,行为完全保持不变。主要是用于全局变量的模块化

  • parseInt() 函数解析字符串并返回整数。
  • parseFloat() 函数解析字符串并返回浮点数。
// ES5的全局方法
const sampleInt = parseInt('11.11');
const sampleFloat = parseFloat('1a2b3c'); // ES6的Number方法
const sampleInt1 = Number.parseInt('11.11');
const sampleFloat1 = Number.parseFloat('1a2b3c'); console.log(sampleInt, sampleFloat); // 11, 1
console.log(sampleInt1, sampleFloat1); // 11, 1

Number.isInteger()

Number.isInteger()方法用来判断给定的参数是否为整数。

注意:

  • 由于整数和浮点数采用的是同样的储存方法,所以 4 和 4.0 被视为同一个值。都为整数
  • 参数需要为数值,参数不是数值,Number.isInteger()直接返回false
  • 由于 JavaScript 数值精度最多可以达到 53 个二进制位,如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,会导致Number.isInteger可能会误判。绝对值也是如此。
const sample1 = Number.isInteger(44);
const sample2 = Number.isInteger(44.00); // 相当于 44
const sample3 = Number.isInteger('44'); // 非数值直接返回false
const sample4 = Number.isInteger(44.0000000000000000987654321); // 误判为true console.log(sample1, sample2, sample3, sample4); // true, true, false, true

数值新增常量

Number.EPSILON

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

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

Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。

Number.EPSILON 实质是一个可以接受的最小误差范围。

const sample = Number.EPSILON === Math.pow(2, -52);
console.log(sample); //
const sample1 = Number.EPSILON;
console.log(sample1); //
const sample2 = Number.EPSILON.toFixed(20);
console.log(sample2); //

安全整数和 Number.isSafeInteger()

JavaScript 能够准确表示的整数范围在-253到253之间(不含两个端点),超过这个范围,无法精确表示这个值。

ES6 引入了Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER这两个常量,用来表示-2^53到2^53上下限。

const sample = Number.MAX_SAFE_INTEGER === 9007199254740991;
const sample1 = Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER;
const sample2 = Number.MIN_SAFE_INTEGER === -9007199254740991; console.log(sample,sample1,sample2);

Number.isSafeInteger()用来判断一个整数是否落在这个范围之内,对于非整数,全部返回false

const sample = Number.isSafeInteger(44);   // 整数
const sample1 =Number.isSafeInteger(44.001); // 非整数
const sample3 =Number.isSafeInteger(9007199254740990);
const sample3 =Number.isSafeInteger(9007199254740992);
console.log(sample,sample1,sample2,sample3); // true, false, true, false

Math 对象的扩展

ES6 在 Math 对象上新增了 17 个与数学相关的方法。

所有这些方法都是静态方法,只能在 Math 对象上调用。

  1. Math.trunc() - 取整。
  2. Math.sign() - 判断数字是正数、负数、还是零。
  3. Math.cbrt() - 计算一个数的立方根
  4. Math.clz32() - 计算一个数的 32 位二进制形式的前导 0 的个数 。
  5. Math.imul() - 计算两个参数的类 C 32 位乘法的。
  6. Math.fround() - 返回一个数的32位单精度浮点数形式。
  7. Math.hypot() - 返回所有参数的平方和的平方根。
  8. Math.expm1() - 返回 ex - 1,x为参数
  9. Math.log1p() - 返回参数 + 1 后的自然对数
  10. Math.log10() - 返回以 10 为底的参数对数
  11. Math.log2() - 返回以 2 为底的参数对数
  12. Math.sinh() - 函数返回一个数字(单位为角度)的双曲正弦值。
  13. Math.cosh() - 函数返回数值的双曲余弦函数。
  14. Math.tanh() - 函数将会返回一个数的双曲正切函数值。
  15. Math.asinh() - 函数返回给定数字的反双曲正弦值。
  16. Math.acosh() - 返回一个数字的反双曲余弦值。
  17. Math.atanh() - 函数返回一个数值反双曲正切值。

Math.trunc()

Math.trunc() 方法会将数字的小数部分去掉,只保留整数部分,是一个取整操作。

Math 中有三个方法: Math.floor()Math.ceil()Math.round(),也是用于取整操作。

  • Math.floor()向下取整;
  • Math.ceil()向上取整;
  • Math.round()进行四舍五入操作。
  • Math.trunc()去除小数部分,只保留整数部分。
const sample = Math.trunc(4.9); // 去掉小数位保留整数位
const sample1 = Math.trunc('4.4'); // 其它数据类型先调用Number转化为数值类型
const sample2 = Math.trunc('12.a'); // 不能正确转化为数值类型返回NaN
console.log(sample, sample1,sample2); // 4, 4 ,NaN

Math.sign()

Math.sign()判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。

5种返回值, 分别是 1, -1, 0, -0, NaN. 代表的各是正数, 负数, 正零, 负零, NaN

  • 参数为正数,返回+1
  • 参数为负数,返回-1
  • 参数为 0,返回0
  • 参数为-0,返回-0;
  • 其他值,返回NaN
const sample = Math.sign(-4);  // -1 负数
const sample1 = Math.sign(4); // 1 正数
const sample2 = Math.sign(0); // 0 0
const sample3 = Math.sign(-0); // -0 -0
const sample4 = Math.sign('a'); // NaN 非数值 console.log(sample, sample1, sample2, sample3, sample4); // -1, 1, 0, -0, NaN

Math.cbrt()

在数学上 : 如果x³=a,那么x叫做a的立方根。

Math.cbrt()计算一个数的立方根

const sample = Math.cbrt(-1);
const sample1 = Math.cbrt(8);
const sample2 = Math.cbrt(0); // 0的立方根是0
const sample3 = Math.cbrt(-0);
const sample4 = Math.cbrt('a'); // 非数值类型先调用Number转化为数值类型
console.log(sample, sample1, sample2, sample3, sample4); // -1, 2, 0, -0, NaN

Math.clz32()

Math.clz32()函数返回参数转化为 32 位无符号整数数字二进制 开头的 0 的个数,

对于空值或其他类型的值,Math.clz32方法会将它们先转为数值,然后再计算。

注意

  • Math.clz32()对于小数,只考虑整数部分
  • << 运算符把 【要位移的数字】 的所有位向左移 【位移位数】 指定的位数。
  • result =【要位移的数字】 << 【位移位数】
const sample = Math.clz32();  // 空转化为数值为 0
const sample1 = Math.clz32(1 << 29); // 左位移运算符改变
const sample2 = Math.clz32(44.7); // 只考虑整数部分
const sample3 = Math.clz32(true); // 转化为数值为 1
const sample4 = Math.clz32('a'); // 非数值类型先调用Number转化为数值类型
console.log(sample, sample1, sample2, sample3, sample4); // 32, 2, 26, 31, 32

Math.imul()

Math.imul()方法将两个参数分别转换为 32 位整数,相乘后返回 32 位的带符号整数。

JavaScript 有精度限制,使得超过 2 的 53 次方的值无法精确表示。Math.imul()方法可以返回正确的低位数值。

const sample = Math.imul(-1, 8.9);  // 参数有小数会先转化为整数
const sample1 = Math.imul(0xffffffff, 5);
// 下面的参数它们的乘积超过了 2 的 53 次方也能正确显示
const sample2 = Math.imul(0x7fffffff, 0x7fffffff); console.log(sample, sample1, sample2); // -8, -5, 1

Math.fround()

Math.fround() 可以将任意的数字转换为32位单精度浮点数形式。

JavaScript 内部使用64位的双浮点数字,支持很高的精度。对于32位单精度格式来说,数值精度是24个二进制位(1 位隐藏位与 23 位有效位)

注意

  • 如果参数的绝对值大于224,返回的结果便开始丢失精度。
  • 对于 NaNInfinity,此方法返回原值
  • 对于其它非数值,Math.fround 方法先将其转为数值,再返回单精度浮点数。
const sample = Math.fround(99);
const sample1 = Math.fround(0.7); // 丢失精度
const sample2 = Math.fround('5');
const sample3 = Math.fround(Infinity); console.log(sample, sample1, sample2, sample3);
// 输出 99, 0.699999988079071, 5, Infinity

Math.hypot()

Math.hypot()函数返回所有参数的平方和的平方根。

const sample = Math.hypot(3, 4); // 2*2 + 2*2 的平方根
const sample1 = Math.hypot(); // 0 空转化为数值为 0
const sample2 = Math.hypot('-9');
const sample3 = Math.hypot(Infinity); // 非数值类型先转化为数值类型
const sample4 = Math.hypot(1, 2, 'a'); // 只要有一个参数无法转为数值,就会返回 NaN。 console.log(sample, sample1, sample2, sample3, sample4); // 5, 0, 9, Infinity, NaN

对数方法

Math.expm1()

Math.expm1()返回 ex - 1,即Math.exp(x) - 1 其中 x 是该函数的参数, e 是自然对数的底数

const sample = Math.expm1(-38);
const sample1 = Math.expm1(0);
const sample2 = Math.expm1(1);
const sample3 = Math.expm1('a'); console.log(sample, sample1, sample2, sample3); // -1, 0, 1.718281828459045, NaN

Math.log1p()

Math.log1p()方法返回参数** + 1** 后的自然对数,(底为 e),即Math.log(1 + x)

const sample = Math.log1p(-2); // 参数小于 -1 返回 NaN
const sample1 = Math.log1p(-1); // -1 + 1 = 0 返回 - Infinity 0没有对数
const sample2 = Math.log1p(0); // 0 + 1 = 1 1 的对数是 0
const sample3 = Math.log1p('a'); console.log(sample, sample1, sample2, sample3); // NaN, -Infinity, 0, NaN

Math.log10()

Math.log10()返回以 10 为底的参数对数

const sample = Math.log10(-2); // 参数小于 0 返回 NaN
const sample1 = Math.log10(1); // 1 的对数是 0
const sample2 = Math.log10('10'); // 转化为数值类型
const sample3 = Math.log10('a'); console.log(sample, sample1, sample2, sample3); // NaN, 0, 1, NaN

Math.log2()

Math.log10()Math.log2() 类似,一个以 10 为底,一个以 2 为底

Math.log2() 返回以 2 为底的参数对数

const sample = Math.log2(-2); // 参数小于 0 返回 NaN
const sample1 = Math.log2(1); // 1 的对数是 0
const sample2 = Math.log2('1024'); // 转化为数值类型
const sample3 = Math.log2('a'); console.log(sample, sample1, sample2, sample3); // NaN, 0, 10, NaN

双曲函数方法

ES6 新增了 6 个双曲函数方法。

  1. Math.sinh() 函数返回一个数字(单位为角度)的双曲正弦值。
  2. Math.cosh() 函数返回数值的双曲余弦函数, 可用constant e表示。
  3. Math.tanh() 函数将会返回一个数的双曲正切函数值。
  4. Math.asinh() 函数返回给定数字的反双曲正弦值。
  5. Math.acosh() 返回一个数字的反双曲余弦值。
  6. Math.atanh() 函数返回一个数值反双曲正切值。

BigInt 数据类型

描述

ES2020 引入了一种新的数据类型 BigInt,这是 ECMAScript 的第八种数据类型。

BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。

BigInt 数据类型的目的是比Number数据类型支持的范围更大的整数值。

注意

  • BigInt 也可以使用各种进制表示,都要加上后缀 **n **。
  • BigIntNumber 数值的类型不同。
  • BigInt 除一元加号(+)运算符外,BigInt 可以使用所有运算符。
  • BigInt 也可以转化为其它数据类型。
  • BigInt 不能与普通数值进行混合运算。
const sample = 99999999999999999999n; // 可以表示任意长度的整数
const sample1 = 999n + 999n * 99n / 99n - 99n; // 可以使用除一元加号外所有运算符
const sample2 = 0o777n + 0b1101n; // 可以使用各种进制来表示
const sample3 = String(1n); // 转化为其他类型数据 n会消失 console.log(sample); // 99999999999999999999n
console.log(sample1); // 1899n
console.log(sample2); // 524n
console.log(sample3); // 1 const sample4 = 10n + 10; // 直接报错 不能与普通数值进行混合运算。

BigInt 函数

JavaScript 原生提供 BigInt 函数,将其他类型的值转为 BigInt 类型。 与 Number() 一致

注意

  • 参数不能为空。
  • 参数不能为小数。
  • 参数必须能正常转化为数值。
const sample = BigInt(44);
const sample1 = BigInt('490'); // 可以正确转换 console.log(sample); // 44n
console.log(sample1); // 490n // 下面全部报错
const sample2 = BigInt(undefined);
const sample3 = BigInt('44a'); // 转化为数值为 NaN
const sample4 = BigInt(1.1); // 参数为小数报错
const sample5 = BigInt(); // 为空

ES6学习 第六章 数值的扩展的更多相关文章

  1. ES6学习 第五章 正则的扩展

    前言 本章介绍正则的扩展.有些不常用的知识了解即可. 本章原文链接:正则的扩展 RegExp 构造函数 从 ES6 开始,如果RegExp构造函数第一个参数是一个正则对象,并且第二个标志存在且为标志参 ...

  2. 201671010140. 2016-2017-2 《Java程序设计》java学习第六章

    java学习第六章    本周对与java中的接口,lambda表达式与内部类进行了学习,以下是我在学习中的一些体会:    1.接口: <1>.接口中的所有常量必须是public sta ...

  3. Java基础知识二次学习--第六章 常用类

    第六章 常用类   时间:2017年4月26日16:14:49~2017年4月26日16:56:02 章节:06章_01节~06章_06节 视频长度:20:57+1:15+8:44+1:26+11:2 ...

  4. ES6学习笔记(字符串和数值)

    (一)字符串的扩展 1.字符串的遍历 for (let codePoint of 'foo') { console.log(codePoint) } // "f" // " ...

  5. 【转载】Gradle学习 第六章:构建脚本基础

    转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...

  6. C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换

    第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...

  7. 深度学习框架PyTorch一书的学习-第六章-实战指南

    参考:https://github.com/chenyuntc/pytorch-book/tree/v1.0/chapter6-实战指南 希望大家直接到上面的网址去查看代码,下面是本人的笔记 将上面地 ...

  8. Cobalt Strike系列教程第六章:安装扩展

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  9. C语言学习第六章

    今天开始尝试改变! 今天要学习函数,一个C语言中的重要组成部分. 首先先聊聊为什么要使用函数?随着学习的深入很多人会发现某段的代码重复使用的几率很大,而如果用一次写一次的话很明显的效率就会比较低,如果 ...

  10. ES6学习笔记(七)-对象扩展

    可直接访问有道云笔记分享链接查看es6所有学习笔记 http://note.youdao.com/noteshare?id=b24b739560e864d40ffaab4af790f885

随机推荐

  1. Kubernetes 权限管理

    1. 概述 Kubernetes 中用户分登陆用户和 service account.登陆用户可通过 kubectl config 查看上下文,以及当前上下文: [root@chunqiu ~ (Ma ...

  2. spring--是如何解决单例模式下循环依赖问题的

    Spring 解决单例 bean 的循环依赖主要依赖于容器的三级缓存机制,以及 bean 的提前暴露.这里是它如何工作的: 三级缓存: 一级缓存(singletonObjects):存储已经经过完整生 ...

  3. Vue之使用elementUI的upload上传组件导入csv文件

    最近干活的时候有个需求,需要将csv文件导入到mysql数据库中,前后端框架用的springboot+Vue,组件用的elementUI,下面将分步骤记录实现过程. 1.导入按钮部分: <el- ...

  4. APB Slave Mux

    基于APB slave mux我们可以快速地将多个apb slave连接在APB上面.在实际的设计当中都是采用这样的方式连接多个APB slave的 DECODE4BIT - 可以理解为master接 ...

  5. 【MicroPython】生成micropython版本头文件 - py\makeversionhdr.py

    用法 $ python makeversionhdr.py mpversion.h 实现 带git仓 get_version_info_from_git 使用git指令:   git describe ...

  6. JMS微服务架构 - 关于事务提交失败,自动重新提交的机制

    用JMS编写的微服务,由调用端决定了各个微服务执行时,是否需要保持事务的一致性. 也就是RemoteClient在调用微服务方法前,先调用BeginTransaction明确后面所调用的微服务需要保持 ...

  7. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.23)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  8. [转帖]SQL Server索引的维护 - 索引碎片、填充因子

    https://www.cnblogs.com/kissdodog/archive/2013/06/14/3135412.html 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故 ...

  9. [转帖]Linux的缓存内存(cache memory)

    PS:为什么Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory. 为什么Linux系统没运行多少程 ...

  10. [转帖]InfluxDB 修改数据存储路径

    1.创建数据存储目录 mkdir -p /home/data/influxdb 说明:目录可以根据实际情况进行修改. 2.设置目录访问权限 sudo chown influxdb.influxdb / ...