二进制和八进制表示法

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

0b111110111 === 503 // true;
0o767 === 503; // true

es5开始,严格模式中,八进制不允许使用前缀0 表示,否则会报错

// 严格模式
(function(){
console.log(0o11 === 011); // 报错
})()
    // 非严格模式
(function(){
console.log(0o11 === 011); // true
})()

如果要将0b0o前缀的字符串数值转十进制,使用Number即可

Number('0o111')  // 7
Number('0o10') // 8

数值分隔符

较长的数值允许添加分隔符,es2021允许js的数值使用下划线(_)作为分隔符

let num = 1_000_000_000
console.log(1000000000 === num); // true

注意:分隔符并不影响原始值

分隔符没有间隔位数的限制

let num2 = 1_00_0000_00
console.log(100000000 === num2); // true

小数和科学计数法也可以使用数值分隔符

console.log(0.00_01); // 0.0001
console.log(1e10_000); // Infinity

需要注意的是

1、_不能放在数值的最前面或最后面

2、_ 不能两个或以上的分隔符连在一起使用

3、_ 小数点的前后不能有分隔符

4、_ 科学计数法中,表示指数的Ee前后不能有分隔符

// 全部报错
3_.141
3._141
1_e12
1e_12
123__456
_1464301
1464301_

其它进制的数值也可以使用分隔符

console.log(0b1010_0001_1000_0101);  // 二进制
console.log(0xA0_B0_C0); // 十六进制

注意:进制的前缀前后不能使用分隔符: 0b、0B、0o、0O、0x、0X

不支持数值分隔符的函数:

1、Number()

2、parseInt()

3、parseFloat()

Number('123_456');  // NaN
parseInt('123_456'); // 123

Number.isFinite(), Number.isNaN()

Number.isFinite():用来检查一个数值是否为有限的,即不是Infinity

有限:true

非有限或非数值:false

Number.isFinite(10);  // true
Number.isFinite(1.2); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite('东方不败'); // false
Number.isFinite('123'); // false
Number.isFinite(true); // false

Number.isNaN() : 用来检查一个值是否为NaN,如果参数不是NaN,返回false

Number.isNaN(NaN);  // true
Number.isNaN(10); // false
Number.isNaN('10'); // false
Number.isNaN(true); // false
Number.isNaN(9/NaN); // true
Number.isNaN('东方不败' * 10); // true
Number.isNaN(true / true); // true

注意

它们与传统的全局方法isFinite()isNaN()的区别在于,

传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效。

Number.isFinite()对于非数值一律返回false

Number.isNaN()只有对于NaN才返回true,非NaN一律返回false


Number.parseInt(),Number.parseFloat()

ES5 : parseInt()parseFloat()

ES6 : Number.parseInt()Number.parseFloat()

行为完全保持一致,这样做的目的是逐步减少全局性方法,使语言逐步模块化

parseInt('12.55');  // 12
Number.parseInt('12.55'); // 12 parseFloat('12.55'); // 12.55
Number.parseFloat('12.55'); // 12.55

isInteger()

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

Number.isInteger(15);  // true
Number.isInteger(15.1); // false

如果值不是数值则返回false

Number.isInteger('15');  //false
Number.isInteger(true); //false
Number.isInteger(NaN); //false
Number.isInteger(); //false

JavaScript 采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位),如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,这种情况下,Number.isInteger可能会误判。

Number.isInteger(3.0000000000000002) // true

上面代码中,Number.isInteger的参数明明不是整数,但是会返回true,原因就是这个小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个2被丢弃了。

!!!!! 总之,如果对数据精度的要求较高,不建议使用Number.isInteger()判断一个数值是否为整数。


Math对象的扩展

Math.trunc()

Math.trunc用于去掉数值的小数部分,返回整数部分

Math.trunc(5.1);  // 5
Math.trunc(5.5); // 5
Math.trunc(-5.1); // -5
Math.trunc(-0.123); // 0

对于非数值,会先使用Number方法将其转换为数值再返回

Math.trunc(true); // 1
Math.trunc(false); // 0
Math.trunc(null); // 0
Math.trunc('10.123'); // 10

对于空值或无法转换的值,返回NaN

Math.trunc(NaN);  // NaN
Math.trunc('hello'); // NaN
Math.trunc(); // NaN

Math.sign()

Math.sign()方法用来判断一个数到底是正数、负数、还是零。非数值会先转换为数值

说明 结果
参数为正数 +1
参数为负数 -1
参数未0 0
参数为-0 -0
其他 NaN
Math.sign('5');  // 1
Math.sign(5); // 1
Math.sign(-5); // -1
Math.sign(0); // 0
Math.sign(-0); // -0
Math.sign(true); // 1
Math.sign('hello'); // NaN

Math.hypot()

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

Math.hypot(3,4);  // 5
Math.hypot(3,4,5); // 7.0710678118654755
Math.hypot(3,4,'5'); // 7.0710678118654755
Math.hypot(3,4,'hello'); // NaN
Math.hypot(); // 0

重点 !

BigInt 数据类型

js的所有数字都保存成64位浮点数,这给数值的表示带来了很大的限制

一 :数值的经度只能到53个二进制位,相当于16个十进制位,大于这个范围的正数无法精确表示,使得js不适合进行科学和金融方面的精确计算。

二 :大于等于21024次方的数值,js无法表示,会返回Infinity

// 超过53个二进制的数值们无法保持精度
Math.pow(2,53) === Math.pow(2,53) + 1; // true
// 超过2的1024次方的数值,无法表示
Math.pow(2,1024); // Infinity

对此,ES2020引入了新的数据类型BigInt(大整数),作为第八种数据类型,BigInt只用来表示整数,没有位数限制,任何位数的整数都可以精确表示,语法: 数据n

// 使用BigInt
let a = 2172141653n
let b = 15346349309n
console.log(a*b); // 33334444555566667777n // 可以保持精度
// 普通数值
let c = 2172141653
let d = 15346349309
console.log(c * d); // 33334444555566670000 // 无法保持精度

与整数的区别

  • 123 普通整数
  • 123n BigInt
  • BigInt 类型的数据必须添加后缀n

BigInt与普通整数是两种值,它们之间并不相等

15n === 15; // false

数据类型返回bigint

typeof(15n); // bigint

BigInt函数

BigInt可以用来做数据转换,转换的方法与Number()基本一致

BigInt(123);  // 123n
BigInt('123'); // 123n
BigInt(true); // 1n
BigInt(false); //0n

下面是报错的一些场景

BigInt();   //  TypeError
BigInt('hello'); // SyntaxError /* 字符串 123n 会无法解析成Number类型,所以报错 */
BigInt('123n'); // SyntaxError BigInt(null); // TypeError
BigInt(NaN); // TypeError /* 参数是小数也会报错 */
BigInt(1.2); // RangeError BigInt('1.2'); // SyntaxError

BigInt继承了Object对象的两个实例方法

  • BigInt.prototype.toString()
  • BigInt.prototype.valueOf()

它还继承了 Number 对象的一个实例方法

  • BigInt.prototype.toLocaleString()

此外还提供了三个静态方法

  • BigInt.asUintN(width, BigInt)
  • BigInt.asIntN(width, BigInt)
  • BigInt.parseInt(string[, radix])

BigInt 转换规则

可以使用BooleanNumberString 这三个方法,将BigInt转换为布尔、数值、字符串类型,转换后,后缀n会消失

Boolean(0n);  // false
Number(2n); // 2
String(2n); // '2'

取反 ! 运算符可以转换布尔值

console.log( !0n );  // true
console.log( !1n ); // false

BigInt 数学运算

在数学运算方面, + - ***这四个运算符与number类型基本一致,除法运算 / 会舍去小数部分,返回一个整数

 console.log( 9 / 5 );  // 1.8
console.log( 9n / 5n ); // 1n 舍去小数

几乎所有的数值运算符都可以用在 BigInt,但是有两个例外

  • 不带符号的右移位运算符>>>
  • 一元的求正运算符+

BigInt不能与普通数值混合运算,因为这样精度会丢失

console.log( 2n + 5);  // TypeError

同样的原因,如果一个函数参数预期是Number类型,但是得到的是一个BigInt就会报错。

// 错误的写法
Math.sqrt(4n) // 报错 // 正确的写法
Math.sqrt(Number(4n)) // 2

BigInt其他运算

BigInt对应的布尔值,与Number类型一致

  • 0n : false
  • 1n : true
let n = 1n
if(n){
console.log(true);
} else {
console.log(false);
} // true

比较运算符和相等运算符允许BigInt与其他类型的值混合计算,因为这样做不会损失精度。

 console.log( 0n < 1 );  // true
console.log( 0n == false); // true
console.log( 0n == 0); // true
console.log( 0n === 0); // false

案例源码:https://gitee.com/wang_fan_w/es6-science-institute

如果觉得这篇文章对你有帮助,欢迎点亮一下star哟

数值的扩展方法以及新增数据类型BigInt的更多相关文章

  1. ES6模板字符串及字符串的扩展方法

    一.ES6模板字符串 传统定义字符串的方式是: const str='hello es2015,this is a string' ES6新增了一种定义字符串的方式用反引号进行标识 const str ...

  2. ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))

    1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...

  3. JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常

    项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2,  ...

  4. C#3.0新增功能04 扩展方法

    连载目录    [已更新最新开发文章,点击查看详细] 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型 ...

  5. 《ES6标准入门》(阮一峰)--7.数值的扩展

    1.二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 ...

  6. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

  7. 五分钟了解ES6对数值的扩展

    文章目录 数值的扩展(ES6) 1. 二进制八进制表示法 2. Number对象 3. Math对象 4. 指数运算符 5. Integer 数据类型 5.1 简介 5.2 运算 数值的扩展(ES6) ...

  8. Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 各种数据类型的的xx重写xx表达式

    Python第三天 序列  5种数据类型  数值  字符串  列表  元组  字典 各种数据类型的的xx重写xx表达式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell ...

  9. .NET 实用扩展方法

    .NET 实用扩展方法(持续更新...) 1. 字符串转换为可空数值类型(int, long, float...类似) /// <summary> /// 将字符串转换成32位整数,转换失 ...

  10. ES6的新特性(5)——数值的扩展

    数值的扩展 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === ...

随机推荐

  1. <七>深入理解new和delete的原理

    new ,delete 运算符 int *p =new int; delete p; 看一下汇编代码 可以看到new 和delete 运算符其实也是 operator运算符重载函数的调用 malloc ...

  2. c# 使用委托子窗体改变父窗体控件

    首先创建两个窗体,在窗体1和窗体2放上对应的控件 在窗体1的代码如下 using System; using System.Collections.Generic; using System.Comp ...

  3. IPv4和IPv6地址的存取

    存入IP地址时,使用inet_pton函数将输入的十进制字符串转出二进制.取出IP时再使用inet_ptop函数将"二进制整数"转成"点分十进制整数"显示.这两 ...

  4. libcamera 简介

    libcamera 简介 libcamera 是一个开源的多媒体库,用于在 Linux 操作系统上支持多种摄像头硬件的访问,libcamera 是一个用户空间库,可用于开发基于摄像头的应用程序,如相机 ...

  5. C#开发的线程池和管理器 - 开源研究系列文章

    上次编写了一个小软件,用于练手及自己的一个小工具集合.今天把其中的线程池和管理器的代码抽取出来,写成一个博文,让需要的朋友能够进行学习和应用. 这个线程管理器包括了3个类库和一个应用程序,见下图: 第 ...

  6. 一步步教你在Edge浏览器上安装网风笔记

    微软于2022年6月15日正式结束对浏览器"Internet Explorer (IE)"的支持,IE已正式退出历史舞台,取而代之的是目前风头正盛的被微软称为当今最好用的Edge浏 ...

  7. 使用Dapr和.NET 6.0进行微服务实战:Dapr简介

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本文是<使用Dapr和.NET 6.0进行微服务实战>的第2篇Dapr ...

  8. 克拉玛依初赛-wp

    MISC 签到 16进制转字符串 base64 再来一次base64 flag 论禅论道 7z解压得到jar 使用decom打开 解密 得到flag WEB pingme 抓包,修改POST提交的参数 ...

  9. 前端必备基础知识之--------原生JS发送Ajax请求

    原生JS发送Ajax请求 ajax({ type: 'POST', url: 'http://10.110.120.123:2222', // data: param, contentType: 'a ...

  10. touchke变化值小的解决办法

    方法一,提高主频 方法二,减小充电时间. 方法三,充电电流减半(具体看RM手册touchkey章节) 建议测试时采样值维持在3000-4000 其实以上操作就是增大Y轴间隔,以增大按下和未按下时的采样 ...