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 对象 异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题 比传统的解决方案——回调函数和事件——更合理和更强大 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步 ...
随机推荐
- linux,pthread(转)
互斥量.条件变量与pthread_cond_wait()函数的使用,详解(二) 1.Linux“线程” 进程与线程之间是有区别的,不过linux内核只提供了轻量进程的支持,未实现线程模型.Linu ...
- ACM-ICPC 2018 徐州赛区网络预赛 F Features Track(STL模拟)
https://nanti.jisuanke.com/t/31458 题意 有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y).两个特征相同当且仅当他们在不同的帧中出现且向量的两个分量分别 ...
- NOI-OJ 1.12 ID:10 素数对
整体思路 本题涉及大量素数的使用,故使用埃拉拖色尼算法提前计算出素数表可以避免大量.重复的计算. 判断素数对很简单,使用两个变量p1和p2代表素数表中的第一个和第二个素数,依次在表中向后移动,判断p2 ...
- SpringBoot系列: 使用 Swagger 生成 API 文档
SpringBoot非常适合开发 Restful API程序, 我们都知道为API文档非常重要, 但要维护好难度也很大, 原因有: 1. API文档如何能被方便地找到? 以文件的形式编写API文档都有 ...
- strace -> System call tracer
我只想告诉你一件事: strace 可以让你知道程序调用了哪些syscall.
- [家里蹲大学数学杂志]第057期图像复原中的改进 TV 模型
$\bf 摘要$: 本文给出了王大凯等编的<图像处理中的偏微分方程方法>第 6.2 节的详细论述. $\bf 关键词$: 图像复原; TV 模型; matlab 编程 1. 前言 图像在形 ...
- [物理学与PDEs]第3章第5节 一维磁流体力学方程组 5.1 一维磁流体力学方程组
1. 当磁流体力学方程组中的量只依赖于 $t$ 及一个空间变量时, 该方程组称为一维的. 2. 一维磁流体力学方程组 $$\beex \bea \cfrac{\p H_2}{\p t}& ...
- PnP 问题方程怎么列?
PnP 问题即 Perspective-n-Point . 有 P3P 方法,使用三个点对就能求解.但是先按照熟悉的方法,写一写.最后写 P3P 方法,P3P 方法还是比较晦涩的,不是无脑方法. 1. ...
- (四)Java工程化--Git基础
GIT学习参考:https://git-scm.com/book/zh/v2 常见命令 git init 初始化项目 git add *.java 添加文件到git版本控制(.java后缀的全部文件) ...
- pythonのdjango
Django(醤糕) 是基于MTV的框架 安装: pip3 install django 重要性:相当于出门带不带腿 创建工程 django-admin startproject [工程名称] 工程目 ...