前言

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

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

进制表示法

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. jQuery组织后续事件 事件冒泡 事件委托 键被按下 批量操作 hover input 事件

    1. jQuery绑定事件的方式 1. $('').click(function(){}) 2. $('').on('click', function(){}) 2. 阻止后续事件执行 1. retu ...

  2. 万字血书Vue—Vue的核心概念

    MVVM M:模型(Model):data V:视图(View):模板 VM:视图模型(ViewModel):Vue实例对象 Vue收到了MVVM模型的启发,MVVM是vue实现数据驱动视图和双向数据 ...

  3. FinalShell上传文件失败

    1.问题 上传文件失败,如图所示,即使切换至root用户 2.解决方式 这里在建立SSH连接时,就必须使用root用户,而若使用普通用户,即使在其中切换至root用户,也无法上传. 所以重新建立一个r ...

  4. Redis labs 的安装

    Install and setup This guide shows how to install Redis Enterprise Software, which includes several ...

  5. CentOS8 解决 yum元数据下载失败的方法

    背景 最近同事反馈CentOS的机器无法再现安装 rpm包了. 提示信息主要是下载源数据失败. 今天上午抽时间进行了一下简单验证, 晚上进行一下总结. 避免遗忘. 认为与Redhat被IBM收购之后, ...

  6. 最简单的以CentOS为base images 安装 Nodejs等操作的方法

    镜像内安装NodeJS的简单方法 公司内有产品需要安装nodejs以便进行相关操作,Linux和Windows时没有问题,但是如果是镜像的话可能会稍微复杂一点, 这里简单进行一下总结, 以便备忘. 1 ...

  7. Unity下调试ToLua(基于IDEA和VSCode)

    公司移动端项目是基于Unity的,底层支持由C#提供,上层Lua调用C#中注册的函数支持来做业务逻辑,框架用的是ToLua.开始做移动端有一段时间了,一直都觉得调试代码是个很蛋疼的体验:几乎都是靠肉眼 ...

  8. 手写promise完成异常处理和状态只能够修改一次

    8.处理 Promise 抛出的异常 <script src="./Promise.js"></script> <script type=" ...

  9. 【K哥爬虫普法】淘宝一亿快递信息泄漏,有人正在盯着你的网购!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  10. 利用pearcmd.php本地文件包含(LFI)

    本文主要是为了学习如何用pearcmd进行本地文件包含 0x00  环境准备 首先先在docker中安装一个php环境. docker exec -it [container id] /bin/bas ...