ECMA Script 6_数值的扩展
1. 二进制 和 八进制 新的表示法
前缀 0b
(或0B
) 表示 二进制
前缀 0o
(或 0O
)表示 八进制
console.log(0b111110111 === 503); // true
console.log(0o767 === 503); // true- 如果要将
0b
和0o
前缀的字符串数值 转为十进制,要使用Number()
方法
2. Number.isFinite()
检查一个数值是否为有限的(finite),即 不是 Infinity 返回 true
只对数值有效
如果参数类型不是数值,Number.isFinite
一律返回false
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()
检查一个值是否为 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
4. Number.parseInt()
和 Number.parseFloat()
将 全局方法 移植到对象 上面,行为完全保持不变
是为了 逐步减少全局性方法,使得语言逐步模块化
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true
5. Number.isInteger()
判断一个数值是否为整数
- 整数 和 浮点数 采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值
Number.isInteger(25); // true
Number.isInteger(25.0); // true- JavaScript 采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。
- 如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,这种情况下,Number.isInteger可能会误判。
Number.isInteger(3.0000000000000002); // true
所以,如果对数据精度的要求较高,不建议使用 Number.isInteger() 判断一个数值是否为整数
6. Number.EPSILON
ES6 在 Number 对象上面,新增 一个极小的常量 Number.EPSILON ,即 JavaScript 能够表示的最小精度。
误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了
根据规格,它表示 1 与大于 1 的最小浮点数之间的差
- 对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001,小数点后面有连续 51 个零。
- 这个值减去 1 之后,就等于 2 的 -52 次方
- 用来设置 “能够接受的误差范围”
比如,误差范围设为 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),
即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等
5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2); // true
- 一个可以接受的最小误差范围
// 误差范围设为 2 的 -50 次方
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
7. 安全整数 和 Number.isSafeInteger()
JavaScript 能够准确表示的整数范围在-2^53
到2^53
之间(不含两个端点),超过这个范围,无法精确表示这个值
- Number.isSafeInteger()
判断一个整数是否落在 [-2^53,
2^53]
范围之内
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- 验证 整个运算 是否可靠
function trusty (left, right, result) {
if (
Number.isSafeInteger(left) &&
Number.isSafeInteger(right) &&
Number.isSafeInteger(result) ){
return result;
};
throw new RangeError('Operation cannot be trusted!');
}; trusty(9007199254740993, 990, 9007199254740993 - 990); // RangeError: Operation cannot be trusted! trusty(1, 2, 3); //
Math 对象的扩展
Math.trunc()
去除一个数的小数部分,返回整数部分
对于非数值,Math.trunc() 内部使用 Number() 将其先转为数值
Math.trunc(4.1); //
Math.trunc(4.9); //
Math.trunc(-4.1); // -4
Math.trunc(-4.9); // -4
Math.trunc(-0.1234); // -0 Math.trunc('123.456'); //
Math.trunc(true); //
Math.trunc(false); //
Math.trunc(null); //
Math.sign()
判断一个数到底是 正数、负数、还是 零
对于非数值,会先将其转换为数值
参数为正数, 返回+1;
参数为负数, 返回-1;
参数为 0, 返回0;
参数为-0, 返回-0;
其他值, 返回NaNMath.sign(-5); // -1
Math.sign(5); // +1
Math.sign(0); // +0
Math.sign(-0); // -0
Math.sign(NaN); // NaN
Math.cbrt
用于计算一个数的立方
于非数值,Math.cbrt() 方法内部也是先使用 Number() 将其转为数值
Math.cbrt('8'); //
Math.clz32()
返回一个数的 32 位无符号整数形式有多少个前导 0
JavaScript 中,整数使用 32 位二进制形式表示
”count leading zero bits in 32-bit binary representation of a number“(计算一个数的 32 位二进制形式的前导 0 的个数)的缩写
Math.clz32(0); //
Math.clz32(1); //
Math.clz32(1000); //
Math.clz32(0b01000000000000000000000000000000); //
Math.clz32(0b00100000000000000000000000000000); //- 左移运算符(<<)与 Math.clz32() 直接相关
Math.clz32(0); //
Math.clz32(1); //
Math.clz32(1 << 1); //
Math.clz32(1 << 2); //
Math.clz32(1 << 29); //- 对于小数,
Math.clz32
() 只考虑整数部分 Math.clz32(3.2); //
Math.clz32(3.9); //- 对于空值或其他类型的值,Math.clz32() 会将它们先转为数值,然后再计算
Math.clz32(); //
Math.clz32(NaN); //
Math.clz32(Infinity); //
Math.clz32(null); //
Math.clz32('foo'); //
Math.clz32([]); //
Math.clz32({}); //
Math.clz32(true); //
Math.imul()
返回两个数以 32 位带符号整数形式相乘的结果,
返回的也是一个 32 位的带符号整数
Math.imul(2, 4); //
Math.imul(-1, 8); // -8
Math.imul(-2, -2); //
Math.fround()
返回一个数的 32 位单精度浮点数形式
主要作用,是将64位双精度浮点数转为32位单精度浮点数。
如果小数的精度超过 24 个二进制位,返回值就会不同于原值,
否则返回值不变(即与64位双精度值一致)
- 对于32位单精度格式来说,数值精度是24个二进制位(1 位隐藏位与 23 位有效位),所以对于 -224 至 224 之间的整数(不含两个端点),返回结果与参数本身一致
Math.fround(0); //
Math.fround(1); //
Math.fround(2 ** 24 - 1); //- 如果参数的绝对值大于 2的24次方,返回的结果便开始丢失精度
Math.fround(2 ** 24); //
Math.fround(2 ** 24 + 1); //
Math.hypot()
返回 所有参数的平方和 的平方根
Math.hypot(3, 4); //
Math.hypot(3, 4, 5); // 7.0710678118654755
Math.hypot(); //
Math.hypot(NaN); // NaN
Math.hypot(3, 4, 'foo'); // NaN
Math.hypot(3, 4, '5'); // 7.0710678118654755
Math.hypot(-3); //
新增的 4 个 对数方法
Math.expm1(x)
返回 e 的 x 次方 - 1,即 Math.exp(x) - 1
Math.log1p()
返回 1 + x
的自然对数,即 Math.log(1 + x)
如果 x
小于-1,返回 NaN
Math.log10()
返回以 10 为底的 x 的对数。
如果 x 小于 0,则返回 NaN
Math.log10(2); // 0.3010299956639812
Math.log10(1); //
Math.log10(0); // -Infinity
Math.log10(-2); // NaN
Math.log10(100000); //
Math.log2()
333
Math.log2(3); // 1.584962500721156
Math.log2(2); //
Math.log2(1); //
Math.log2(0); // -Infinity
Math.log2(-2); // NaN
Math.log2(1024); //
Math.log2(1 << 29); //
双曲函数方法
Math.sinh(x) 返回x的双曲正弦 (hyperbolic sine)
Math.cosh(x) 返回x的双曲余弦 (hyperbolic cosine)
Math.tanh(x) 返回x的双曲正切 (hyperbolic tangent)
Math.asinh(x) 返回x的反双曲正弦 (inverse hyperbolic sine)
Math.acosh(x) 返回x的反双曲余弦 (inverse hyperbolic cosine)
Math.atanh(x) 返回x的反双曲正切 (inverse hyperbolic tangent)
指数运算符
ES6 新增了一个指数运算符(**)
2 ** 2 //
2 ** 3 //- 右结合,而不是常见的左结合。
多个指数运算符连用时,是从最右边开始计算的
2 ** 3 ** 2 // 相当于 2 ** (3 ** 2)
//- 指数运算符可以与等号结合,形成一个新的赋值运算符(
**=
) let a = 1.5;
a **= 2; // 等同于 a = a * a; 2.25 let b = 4;
b **= 3; // 等同于 b = b * b * b; 64- 注意: V8 引擎的 指数运算符 与
Math.pow()
的实现不相同,对于特别大的运算结果,两者会有细微的差异 Math.pow(99, 99) // 3.697296376497263e+197 99 ** 99 // 3.697296376497268e+197 // 上面代码中,两个运算结果的最后一位有效数字是有差异的。
ECMA Script 6_数值的扩展的更多相关文章
- ECMA Script 6_数组的扩展_扩展运算符
1. 扩展运算符 内部调用的是数据结构的 Iterator 接口, 因此只要具有 Iterator 接口的对象,都可以使用扩展运算符 ... 如 map,,,, [...arr] 扩展运算符(spre ...
- ECMA Script 6_对象的扩展
对象 1. ES6 允许直接写入变量和函数,作为对象的属性和方法 const foo = 'bar'; /*****************属性的优化********************/ con ...
- ECMA Script 6_字符串_扩展_字符 是4字节还是2字节?_模板字符串
ES6 字符串扩展 ES6 加强了对 Unicode 的支持,并且扩展了字符串对象 字符 的 Unicode 表示法 允许采用 \uxxxx 形式表示一个字符, 其中 xxxx 表示字符的 Unico ...
- ECMA Script 6_函数的扩展
ES6规定只要函数参数使用了默认值.解构赋值.或者扩展运算符, 那么函数内部就不能显式设定为严格模式,否则会报错 1. 参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面 函数 ...
- ECMA Script 6_简单介绍
ECMAScript 6 ECMA 组织 前身是 欧洲计算机制造商协会 指定和发布脚本语言规范,标准在每年的 6 月份正式发布一次,作为当年的正式版本 这样一来,就不需要以前的版本号了,只要用年份标记 ...
- ECMA Script 6_唯一容器 Set_映射容器 Map
唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是 ...
- ECMA Script 6_解构赋值_模式匹配
解构赋值 从数组中提取值,按照对应位置,对变量赋值 只要等号右边的值不是对象或数组,就先将其转为对象. 由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错 let ...
- ECMA Script 6_模块加载方案 ES6 Module 模块语法_import_export
1. 模块加载方案 commonJS 背景: 历史上,JavaScript 一直没有模块(module)体系, 无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来. 其他语言都有这项功能: ...
- ECMA Script 6_异步编程之 Promise
Promise 对象 异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题 比传统的解决方案——回调函数和事件——更合理和更强大 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步 ...
随机推荐
- 深入剖析Kubernetes学习笔记:开篇词(00)
一.关于Kubernetes初学的疑惑 就在这场因"容器"而起的技术变革中,kubernetes项目已经成为容器技术的事实标准,重新定义了基础设置领域对应用编排与管理的种种可能 1 ...
- 新年 flag
在浮躁的年代本不该如此贪多,奈何鸭梨山大...温故知新吧 GO中文社区 深入学习一两门新的编程语言: -Go编程基础 -Go Web基础 -Go名库讲解 rustlang 中文文档 知乎板块 GO 知 ...
- redis发布/订阅
发布订阅简介 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,消息之间通过channel传递. 准备工作 两台安装了redis的机器(虚拟 ...
- spark JAVA 开发环境搭建及远程调试
spark JAVA 开发环境搭建及远程调试 以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息.以前折腾过Hadoop,于是看了下Spark官网的文档以及 github ...
- 高并发秒杀系统--SpringMVC整合
[SpringMVC运行流程] [Handler注解映射技巧] [请求方法的细节处理] 1.如何处理请求参数和方法参数的绑定? 2.如何限制方法接收的请求方式? 3.如何进行请求转发和重定向? 4.如 ...
- 20175204 张湲祯 2018-2019-2《Java程序设计》第三周学习总结
20175204 张湲祯 2018-2019-2<Java程序设计>第三周学习总结 教材学习内容总结 -第四章类与对象要点: -面向对象语言三个特性:封装性:继承:多态: -类:1.类是组 ...
- Java消息队列--ActiveMq 初体验
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Illegal invocation with document.querySelector [duplicate]
document.querySelectorAll赋给其它变量时, 为什么要.bind(document)? https://stackoverflow.com/questions/12637061/ ...
- 浅析nodejs的buffer类(转)
最近翻阅了node v0.10.4的buffer类的源代码,收获不少,也很久没有在cnode上发表文章了,想把一些收获分享给大家,有什么错误的地方希望大牛们指正啊. 前阵子有位rrestjs框架的使用 ...
- PYTHON-进程 子进程
并发编程 学习目标: 见35复习 1.操作系统 什么是操作系统 操作系统的两大作用: 批处理操作系统: 操作系统发展史: 多道技术***** 产生背景: 两大核心点: 应用软件的优化的核心:***** ...