《你不知道的JavaScript(中卷)》读后笔记 —— JavaScript中“Number”的冷门知识点
目录
1. Number.EPSILON
2. 整数的安全范围(Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER)
3. 整数检测(Number.isInteger、Number.isSafeInteger)
4. 无穷数(Infinity)
5. 零值(+0 和 -0)
6. 特殊等式(Object.is)
1. Number.EPSILON
计算机潜在的一个精度bug(比如0.1 + 0.2 = 0.30000000000000004)那怎么样来判断0.1 + 0.2 === 0.3?
最常见的方法是设置一个误差范围值,通常称为“机器精度”(machine epsilon),对 JavaScript 的数字来说,这个值通常是 2^-52 (2.220446049250313e-16) 。
ES6中有一个Number.EPSILON可供我们使用。为兼容ES6之前的版本需要加上:
if (!Number.EPSILON) {Number.EPSILON = Math.pow(2,-52);
}
然后用这个误差值来进行判断:
function isEqual4Numbers(n1,n2) {return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
isEqual4Numbers( a, b ); // true
isEqual4Numbers( 0.0000001, 0.0000002 ); // false
2. 整数的安全范围(Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER)
Number.MAX_SAFE_INTEGER = 9007199254740991Number.MIN_SAFE_INTEGER = -9007199254740991
3. 整数检测(Number.isInteger、Number.isSafeInteger)
Number.isInteger用来检测值是否是整数,是ES6新增的方法。ES6之前的版本需要加上:
if (!Number.isInteger) {Number.isInteger = function(num) {return typeof num == 'number' && num % 1 == 0;};
}
用法:
Number.isInteger( 520 ); // true
Number.isInteger( 520.000000 ); // true
Number.isInteger( 520.1314 ); // false
Number.isSafeInteger用来检测值是否是安全的整数,是ES6新增的方法。ES6之前的版本需要加上:
if (!Number.isSafeInteger) {Number.isSafeInteger = function(num) {return Number.isInteger( num ) &&Math.abs( num ) <= Number.MAX_SAFE_INTEGER;};
}
用法:
Number.isSafeInteger( Number.MAX_SAFE_INTEGER ); // true
Number.isSafeInteger( Math.pow( 2, 53 ) ); // false
Number.isSafeInteger( Math.pow( 2, 53 ) - 1 ); // true
4. 无穷数(Infinity)
var a = 1 / 0; // Infinity
var b = -1 / 0; // -Infinity
5. 零值(+0 和 -0)
var a = 0 / -3; // -0
var b = 0 * -3; // -0
加法和减法运算不会得到负零(negative zero)。
负零在开发调试控制台中通常显示为 -0 ,但在一些老版本的浏览器中仍然会显示为 0 。
对负零进行字符串化会返回 "0" :
var a = 0 / -3;
a; // -0
a.toString(); // "0"
a + ""; // "0"
String( a ); // "0"
JSON.stringify( a ); // "0"
字符串转换为数字:
+"-0"; // -0
Number( "-0" ); // -0
JSON.parse( "-0" ); // -0
比较神奇的一个事情是JSON.stringify(-0) 返回 "0" ,而 JSON.parse("-0") 返回 -0 。
区分-0和0的方法:
function isNegZero(n) {n = Number( n );return (n === 0) && (1 / n === -Infinity);
}
isNegZero( -0 ); // true
isNegZero( 0 / -3 ); // true
isNegZero( 0 ); // false
6. 特殊等式(Object.is)
Object.is是ES6新增的一个方法,ES6之前的版本需要加上:
if (!Object.is) {Object.is = function(v1, v2) {// 判断是否是-0if (v1 === 0 && v2 === 0) {return 1 / v1 === 1 / v2;}// 判断是否是NaNif (v1 !== v1) {return v2 !== v2;}// 其他情况return v1 === v2;};
}
用法:
var a = 2 / "foo";
var b = -3 * 0;
Object.is( a, NaN ); // true
Object.is( b, -0 ); // true
Object.is( b, 0 ); // false
《你不知道的JavaScript(中卷)》读后笔记 —— JavaScript中“Number”的冷门知识点相关推荐
- 精读《你不知道的javascript》中卷
前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书< ...
- 如何从JavaScript中的给定数字中形成最小的数字
by Prashant Yadav 通过Prashant Yadav 如何从JavaScript中的给定数字中形成最小的数字 (How to form the smallest possible nu ...
- 现在JavaScript日期–如何在JavaScript中获取当前日期
Many applications you build will have some sort of a date component, whether it's the creation date ...
- 了解React Native中的不同JavaScript环境
by Khoa Pham 通过Khoa Pham 了解React Native中的不同JavaScript环境 (Get to know different JavaScript environmen ...
- javascript基础系列:javascript中的变量和数据类型(一)
javascript基础系列:javascript中的变量和数据类型(一) 今天开始去重新系统温习一遍js基础,并作下记录 javascript是由三部分组成: ECMASCRIPT(ES): 描述了 ...
- 如何从JavaScript中的对象数组中获得不同的值?
本文翻译自:How to get distinct values from an array of objects in JavaScript? Assuming I have the followi ...
- JavaScript杂记(持续更新中)
1. HTML 表单自动验证 HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性会阻止表单提交: <!DOCTYPE html> ...
- JavaScript 实时监听input 中值变化
JavaScript 实时监听input 中值变化 在 <input> 标签中,添加属性 oninput ,oninput 事件在元素获得用户输入时发生. 当 <input> ...
- JavaScript中数据在内存中的存储方式
JavaScript中数据在内存中的存储方式 1.js数据类型分类 简单数据类型:Number.String.Boolean.Undefined.Null 复杂数据类型:Object.Array.Fu ...
最新文章
- 机器学习实践中的10个小秘诀!
- mysql count() 写法,MySQL COUNT()用法及代碼示例
- 掌握ADO.NET的十个热门技巧
- log4j2 无垃圾模式
- 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...
- 【渝粤教育】广东开放大学 社会调查与方法 形成性考核 (35)
- postforobject 设置代理_Spring RestTemplate和代理身份验证
- 计算机点击右键出现错误,电脑右键个性化打不开了怎么办
- 传智播客 GIL(全局解释器锁)学习
- POJ - 3624 (01背包问题)(动态规划-滚动数组)
- 普元EOS开发积累第二篇(常见错误解决方法) 持续更新
- 新手使用GitHub客户端提交本地项目到GitHub网站详细步骤
- 三维空间平面和直线的夹角计算
- 利用计算机视觉看懂病历,广东省中山市2019年九年级下册中考语文第二次模拟测试语文试题卷(二模含答案和解析).doc...
- 计算机初学者先学什么语言,计算机语言入门先学什么?
- Git清理历史大文件
- Springboot 整合百度地图 API
- 《做有质感的民族》方文山
- python实现账号密码登录
- 基于Java+Springmvc+vue+element员工信息管理系统详细设计
热门文章
- 用内网服务器对接微信公众号服务
- alook浏览器哪个好 夸克浏览器_简单搜索、X浏览器、夸克浏览器、Via极简移动浏览器,到底哪个最好用?...
- 阿里云移动研发平台EMAS是什么?移动研发平台EMAS有什么特色?
- 【一】1D测量 Measuring——translate_measure()算子
- [小样本图像分割]PANet: Few-Shot Image Semantic Segmentation with Prototype Alignment
- 【磁力链接】专用链接双向转化
- Visual Studio 实用插件推荐
- 如何区别计算机体系结构与计算机组成这两个概念?
- Tableau自定义分类调色板
- Java1.5泛型指南中文版