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 对象 异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题 比传统的解决方案——回调函数和事件——更合理和更强大 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步 ...
随机推荐
- GIT-Bonobo.Git.Server的使用
GIT-Bonobo.Git.Server的使用 登录 (默认用户:admin/admin) 创建用户: 创建团队,勾选用户 创建新库 保存完成!
- 你从未听说过的 JavaScript 早期特性
最近这些年在对 JavaScript 进行考古时,发现网景时代的 JavaScipt 实现,存在一些鲜为人知的特性,我从中挑选几个有趣的说一下. Object.prototype.eval() 方法 ...
- end to end testing
概念 https://www.softwaretestinghelp.com/what-is-end-to-end-testing/ What is “End to End Testing”? Ter ...
- metasploit 教程之信息收集
信息收集 信息收集范围很大,可以从不同层面,不同维度进行信息收集. 系统补丁 我们知道目标机器缺少什么补丁就意味着存在与其对应的漏洞.我们可以利用这些漏洞来达到我们渗透攻击的目的. # 使用的模块 u ...
- MySQL学习5 - 数据类型二.md
一 字符类型 二 枚举类型和集合类型 一 字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的 ...
- Spring Cloud 2-Feign 声明式服务调用(三)
Spring Cloud Feign 1. pom.xml 2. application.yml 3. Application.java 4. Client.java 简化RestTemplate调 ...
- percona-toolkit 之 【pt-online-schema-change】说明【转】
背景: MySQL 大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响.在5.1之后随着Plugin Innodb的出现在线加索引的提 ...
- Windows2016的 IIS中配置PHP7运行环境
Windows2016的 IIS中配置PHP7运行环境 在Windows 的IIS(8.0)中搭建PHP运行环境: 一:安装IIS服务器 .进入控制面板>>程序和功能>>打开或 ...
- 小程序 模态对话框自定义组件(modal)
1. 概述 1.1 说明 小程序中使用wx.showModal(Object object)打开一个模态对话框,但是目前小程序所提供的modal中的内容显示比较死板,不能够完全满足工作中所遇到的功能信 ...
- 4.9cf自训9..
cf401D 状态压缩dp好题,每次把新加入集合的数字放在最后即可 /* 它可以通过重新排列数字n, 它没有任何前导零, x除以m后的余数等于0. 每次把新加的数放在最后 dp[i][j]表示状态i下 ...