二进制和八进制表示法

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. vulnhub靶场之EVILBOX: ONE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:EVILBOX: ONE,下载地址:https://download.vulnhub.com/evilbox/EvilBox---One.ova ...

  2. python3获取列表逆序的五种方式

    前言 我们将这几种方式分为两类,一种是对列表本身进行操作,改变对应内存中的值,另一种是带有返回值的,相当于拷贝了一份 对列表内存中进行操作 sort() 函数 a = [1,2,3,4] a.sort ...

  3. 关于最新版本listen1 (2.1.6)的修改心得(添加下载功能)

    注:本文只作为技术交流 前言 再次感谢 listen1 的作者开发出如此强大的音乐播放器 项目地址 上一篇的文章没有解决跨域问题(命名不能正确命名), 上一篇文章 地址 这次解决了,并简单的美化了下载 ...

  4. SSH(二)框架配置文件

    在引入了宽假所需要的jar包后,引入相应配置文件. 一.Struts2的配置文件: 1.Struts2的黑心过滤器,在web.xml中引入: <!-- struts2框架的核心过滤器  clas ...

  5. 爬虫笔记之xpath

    目录 xpath如何取包含多个class属性 xpath获取当前标签下的所有文本(包括子标签) xpath如何取包含多个class属性 如果HTML结构是这样 <div class=" ...

  6. meta标签补充

    shrink-to-fit=no 使用"width=device-width"会导致页面按比例缩小,以适应超出视口边界的内容. 使用将"shrink-to-fit=no& ...

  7. java中生成随机数

    本文主要讲述java中如何生成随机数. public class RandomTest { public static void main(String[] args) { // 生成随机数 方法1: ...

  8. 开发一个MyBatis通用Mapper的轮子

    一.前言 程序猿为什么如此执着于造轮子?MyBatis-Plus如此强大的工具流行这么多年了,我为啥还在重复造这样的轮子? 1.公司的技术规范不允许使用MyBatis-Plus,咱也不知道什么原因: ...

  9. JavaScript:类(class)

    在JS中,类是后来才出的概念,早期创造对象的方式是new Function()调用构造函数创建函数对象: 而现在,可以使用new className()构造方法来创建类对象了: 所以在很多方面,类的使 ...

  10. go_xml_learn

    结构体转换为xml: type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"nam ...