ES6标准入门 第五章:数值的扩展
1、二进制和八进制数值表示法
二进制前缀:0b(或0B); 八进制前缀:0o(或0O)。
注意:ES5的严格模式 和 ES6中不再允许使用 0 表示八进制。
将二进制和八进制数值转换为十进制数值,用Number 方法:
Number('0b111'); //
number('0o10'); //
2、Number.isFinite() 、Number.isNaN()
ES6将全局方法isFinite() 和 isNaN() 移植到Number对象上来检查Infinite 和 NaN 这两个特殊值。
新方法与传统的全局方法的区别: 传统方法先将非数值转换为数值再进行判断;新方法只对数值有效,非数值直接返回false 。
(1)Number.isFinite() 检查一个数是否有穷; 【finite--有穷】
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinite); // false
Number.isFinite(-Infinite); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false
ES5的实现:
(function (global) {
var global_isFinite = global.isFinite;
Object.defineProperty(Number, 'isFinite', {
value: function isFinite(value) {
return typeof value == 'number' && global_isFinite(value);
},
configurable: true,
enumerable: false,
writable: rue
})
})(this);
(2)Number.isNaN() 检查一个值是否为NaN;
Number.isNaN(NaN); // true
Number.isNaN('true'/0); // true
Number.isNaN('true'/'true'); // true
Number.isNaN(9/NaN); // true
Number.isNaN(15); // false
Number.isNaN('15'); // false
Number.isNaN(true); // false
ES5的实现:
(function (global) {
var global_isNaN = global.isNaN;
Object.defineProperty(Number, 'isNaN', {
value: function isNaN(value) {
return typeof value == 'number' && global_isNaN(value);
},
configurable: true,
enumerable: false,
writable: rue
})
})(this);
3、Number.parseInt() 和 Number.parseFloat()
ES6将全局方法parseInt() 和 parseFloat() 移植到Number对象上,行为不变。
//ES5的写法
parseInt('12.34'); //
parseFloat('123.45#'); // 123.45 //ES6的写法
Number.parseInt('12.34'); //
Number.parseFloat('123.45#'); // 123.45
这样做的目的就是: 逐步减少全局性的方法,是语言逐步模块化。
4、Number.isInteger()
Number.isInteger() 用来判断一个值是否为整数。
在JavaScript内部,整数和浮点数是相同的存储方法,所以3 和 3.0 被视为同一个值!!!
Number.isInteger(25); //true
Number.isInteger(25.0); //true
Number.isInteger(25.1); //false
Number.isInteger("15"); //false
Number.isInteger(true); //false
ES5的实现:
(function (global) {
var floor = Math.floor,
isFinite = global.isFinite;
Object.defineProperty(Number, 'isInteger', {
value: function isInteger(value) {
return typeof value == 'number' &&
isFinite(value) &&
value > -9007199254740992 &&
value < 9007199254740992 &&
floor(value) = value;
},
configurable: true,
enumerable: false,
writable: rue
})
})(this);
5、 Number.EPSILON
ES6 在Number对象上新增了一个极小常量—— Number.EPSILION。
引入极小常量的目的:为浮点数设置一个误差范围。计算误差小于Number.EPSILON,我们就认为得到了正确的结果。
0.1+0.2-0.3; // 5.551115123125783e-17
5.551115123125783e-17 < Number.EPSILON; // true
为浮点数的运算 书写一个误差检查函数。
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON;
}
withinErrorMargin (0.1+0.2 , 0.3); // true
withinErrorMargin (0.2+0.2 , 0.3); // false
6、安全整数 和 Number.isSafeInteger()
JavaScript 能够精确的表示的整数范围: -2^{53} 到 2^{53}之间(不含两个端点);超出之后就无法精确表示。
Math.pow(2, 53) === Math.pow(2, 53)+1; //true
ES6引入了Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 两个常量,表示这个范围的上下限。
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1; // true
Number.MAX_SAFE_INTEGER === 9007199254740991; // true
Number.isSafeInteger() 用来判断一个整数是否落在这个范围内。
Number.isSafeInteger(‘a’); //false
Number.isSafeInteger(null); //false
Number.isSafeInteger(NaN); //false
Number.isSafeInteger(‘Infinity); //false Number.isSafeInteger(3); //true
Number.isSafeInteger(3.3); //false
Number.isSafeInteger(9007199254740992); //false Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1); //false
Number.isSafeInteger(Number.MAX_SAFE_INTEGER); //true
注意: 不能知识验证结果,而要同时验证参与运算的每个值。
Number.isSafeInteger(9007199254740993); //false Number.isSafeInteger(990); //true Number.isSafeInteger(9007199254740993 - 990); //true(这里得到了一个错误的结果)
// 返回解果 9007199254740002 但实际应该是 9007199254740003 这是因为9007199254740993超出了精度范围,导致在计算机内部是以 9007199254740992 的形式存储。
9007199254740993 === 9007199254740992; // true
7、Math对象的扩展
(1)Math.trunc()
Math.trunc() 方法用于去除一个小数的小数部分,返回整数部分。
Math.trunc(4.1) //
Math.trunc(-4.1) // -4
Math.trunc(-0.1234) // -0
对于非数值,内部先通过Number方法将其转换为数值。
Math.trunc('123.456') // 123
Math.trunc(true) //1
Math.trunc(false) // 0
Math.trunc(null) // 0
对于空值或无法截取整数的值,返回NaN
Math.trunc(NaN); // NaN
Math.trunc('foo'); // NaN
Math.trunc(); // NaN
Math.trunc(undefined) // NaN
没有部署此方法的环境,用以下代码模拟:
Math.trunc = Math.trunc || function(x) {
return x<0 ? Math.ceil(x) ? Math.floor(x);
}
(2)Math.sign()
Math.sign() 方法用于判断一个数是正书、负数, 还是零。 对于非数值,会将其先通过Number方法转化为数值。
它会返回5种值:
- 参数为正数: 返回+1
- 参数为负数: 返回-1
- 参数为0 : 返回0
- 参数为-0 : 返回-0
- 其它值 : 返回NaN
Math.sign('') //
Math.sign(true) // +1
Math.sign(false) //
Math.sign(null) //
Math.sign('9') // +1
Math.sign('foo') // NaN
Math.sign() // NaN
Math.sign(undefined) // NaN
没有部署此方法的环境,用以下代码模拟:
Math.sign = Math.sign || function(x) {
x = +x;
if( x==0 || isNaN(x) ) {
return x;
}
return x>0 ? 1 : -1;
}
(3)Math.cbrt()
Math.cbrt() 用于计算一个数的立方根。 对于非数值,会将其先通过Number方法转化为数值。
Math.cbrt(-1) // -1
Math.cbrt(0) //
Math.cbrt('8') //
Math.cbrt('hello') // NaN
没有部署此方法的环境,用以下代码模拟:
Math.cbrt = Math.cbrt || function(x) {
var y = Math.pow( Math.abs(x), 1/3 );
return x<0 ? -y : y;
}
(4)Math.hypot()
Math.hypot() 方法返回所有参数的平方和的平方根。
对于非数值,会将其先通过Number方法转化为数值。只要有一个参数不能转化为数值,就返回NaN。
Math.hypot(3, 4); //
Math.hypot(3, 4, 5); // 7.0710678118654755
Math.hypot(); //
Math.hypot(3, 4, 'foo'); // NaN
(5)Math.clz32()
JavaScript 的整数使用 32 位二进制形式表示,Math.clz32方法返回一个数的 32 位无符号整数形式有多少个前导 0。
Math.clz32(0) // 32 ---- 0 的二进制形式全为 0
Math.clz32(1) // 31 ---- 1 的二进制形式是0b1
Math.clz32(1000) // 22 ---- 1000 的二进制形式是0b1111101000
Math.clz32(0b01000000000000000000000000000000) //
Math.clz32(0b00100000000000000000000000000000) //
左移运算符(<<)与Math.clz32方法直接相关。
Math.clz32(1) //
Math.clz32(1 << 1) //
Math.clz32(1 << 2) //
Math.clz32(1 << 29) //
对于小数, Math.clz 只考虑整数部分
Math.clz32(3.2) //
Math.clz32(3.9) //
(6)Math.imul()
Math.imul方法返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。
(7)Math.fround()
Math.fround方法返回一个数的32位单精度浮点数形式。
(8)对数方法
(9)三角函数方法
8、指数运算符——ES7
指数运算符(**)
2 ** 2 //
2 ** 3 //
指数运算符 与 等号结合,形成一个新的赋值运算符(**=)
let a =2;
a ** =2; // 等同于 a = a*a; let b = 3;
b **= 3; // 等同于b = b*b*b;
ES6标准入门 第五章:数值的扩展的更多相关文章
- ES6标准入门 第五章:函数的扩展
1.函数参数的默认值 (1)基本用法 ES5 中, 不能直接为函数的参数指定默认值.只能采用变通的方法. function log(x, y) { y = y || 'World'; console. ...
- ES6标准入门 第五章:正则的扩展
1.RegExp 构造函数 ES5的缺陷: ES5中构造函数的参数有两种情况: (1)参数是字符串,这时第二个参数表示正则表达式的的修饰符(flag). var reg = new RegExp( & ...
- ES6标准入门 第三章:变量的解构赋值
解构赋值:从数组和对象中提取值,对变量进行赋值. 本质上,这种写法属于“匹配模式”:只要等号两边的模式相同,左边的变量就会被赋予对应的值. 1.数组的结解构赋值 基本用法 let [foo, [[ba ...
- ES6标准入门 第四章:字符串的扩展
1.字符串的Unicode 表示法 JavaScript 允许采用 \uxxxx 表示一个字符,其中 xxxx 表示字符的码点. "\u0061" // "a" ...
- 《ES6标准入门》(阮一峰)--7.数值的扩展
1.二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 ...
- ES6标准入门之数值的拓展解说
ES6提供了二进制和八进制数值的新写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === ...
- ES6标准入门之变量的解构赋值简单解说
首先我们来看一看解构的概念,在ES6标准下,允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称作解构,简而言之粗糙的理解就是变相赋值. 解构赋值的规则是,只要等号右边的值不是对象或者数组 ...
- [转] 《ES6标准入门》读书笔记
来源:https://segmentfault.com/a/1190000005863641 let和const命令 ES6新增let命令,用于声明变量,是块级作用域. let声明的变量不会像var声 ...
- Python 3标准库 第五章 数学运算
第五章数学运算-----------------------上下文解释:编程时,我们一般也是先给程序定义一些前提(环境变量.描述环境变化的全局变量等),这些“前提”就是上文,然后再编写各功能模块的代码 ...
随机推荐
- 22_1mybaits入门
1.什么是框架? 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题. 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能.大大提高开发效率. 2.三层架构 表现层 ...
- 解决Kloxo出现Could not open database connection问题
当我们在使用或者运行kloxo面板的时候,可能会出现类似"Could not open database connection"错误提示,对于新手朋友来说肯定本身安装面板管理VPS ...
- C++与C#对于引用外部文件成员使用的区别
对于C++控制台项目,如果有两个.cpp的文件都想引用同一个类的成员时,我们可以定义一个类,然后在类的头文件中添加extern来修饰. Box.cpp如下: #include "Box.h& ...
- SpringMVC的数据转换&&数据格式化&&数据校验
1 SpringMVC的数据绑定流程 SpringMVC将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. ...
- react axios 跨域问题
周末又是补充知识点的时候了,用了react axios 跨越问题,貌似是要比vue 稍微麻烦一点 它请求http好像是没有问题的,但是https还是有跨域问题的, 我用的刚好是create-react ...
- Django初使用
目录 一.Django初使用 1. 静态文件配置 (1)静态文件配置步骤 2. form表单的get和post提交方式 (1)get (2)post (3)注意 3. views文件中的request ...
- Codeforces 963A Alternating Sum ( 思维 && 数论 )
题意 : 题目链接 分析 : Tutorial 讲的很清楚 至于为什么这样去考虑 算是一个经验问题吧 如果一个问题要你给出模意义下的答案 就多考虑一下答案是要用逆元构造出来 也就说明有除法的存在 那么 ...
- PKUWC2020爆零记
抱歉,这么晚才更. 事实是:我都没有去 所以爆零了 QwQ
- 搜狗微信采集 —— python爬虫系列一
前言:一觉睡醒,发现原有的搜狗微信爬虫失效了,网上查找一翻发现10月29日搜狗微信改版了,无法通过搜索公众号名字获取对应文章了,不过通过搜索主题获取对应文章还是可以的,问题不大,开搞! 目的:获取搜狗 ...
- Django简单操作
一.静态文件配置 静态文件配置 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露给 ...