目录

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”的冷门知识点相关推荐

  1. 精读《你不知道的javascript》中卷

    前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书< ...

  2. 如何从JavaScript中的给定数字中形成最小的数字

    by Prashant Yadav 通过Prashant Yadav 如何从JavaScript中的给定数字中形成最小的数字 (How to form the smallest possible nu ...

  3. 现在JavaScript日期–如何在JavaScript中获取当前日期

    Many applications you build will have some sort of a date component, whether it's the creation date ...

  4. 了解React Native中的不同JavaScript环境

    by Khoa Pham 通过Khoa Pham 了解React Native中的不同JavaScript环境 (Get to know different JavaScript environmen ...

  5. javascript基础系列:javascript中的变量和数据类型(一)

    javascript基础系列:javascript中的变量和数据类型(一) 今天开始去重新系统温习一遍js基础,并作下记录 javascript是由三部分组成: ECMASCRIPT(ES): 描述了 ...

  6. 如何从JavaScript中的对象数组中获得不同的值?

    本文翻译自:How to get distinct values from an array of objects in JavaScript? Assuming I have the followi ...

  7. JavaScript杂记(持续更新中)

    1. HTML 表单自动验证 HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性会阻止表单提交: <!DOCTYPE html> ...

  8. JavaScript 实时监听input 中值变化

    JavaScript 实时监听input 中值变化 在 <input> 标签中,添加属性 oninput ,oninput 事件在元素获得用户输入时发生. 当 <input> ...

  9. JavaScript中数据在内存中的存储方式

    JavaScript中数据在内存中的存储方式 1.js数据类型分类 简单数据类型:Number.String.Boolean.Undefined.Null 复杂数据类型:Object.Array.Fu ...

最新文章

  1. 机器学习实践中的10个小秘诀!
  2. mysql count() 写法,MySQL COUNT()用法及代碼示例
  3. 掌握ADO.NET的十个热门技巧
  4. log4j2 无垃圾模式
  5. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...
  6. 【渝粤教育】广东开放大学 社会调查与方法 形成性考核 (35)
  7. postforobject 设置代理_Spring RestTemplate和代理身份验证
  8. 计算机点击右键出现错误,电脑右键个性化打不开了怎么办
  9. 传智播客 GIL(全局解释器锁)学习
  10. POJ - 3624 (01背包问题)(动态规划-滚动数组)
  11. 普元EOS开发积累第二篇(常见错误解决方法) 持续更新
  12. 新手使用GitHub客户端提交本地项目到GitHub网站详细步骤
  13. 三维空间平面和直线的夹角计算
  14. 利用计算机视觉看懂病历,广东省中山市2019年九年级下册中考语文第二次模拟测试语文试题卷(二模含答案和解析).doc...
  15. 计算机初学者先学什么语言,计算机语言入门先学什么?
  16. Git清理历史大文件
  17. Springboot 整合百度地图 API
  18. 《做有质感的民族》方文山
  19. python实现账号密码登录
  20. 基于Java+Springmvc+vue+element员工信息管理系统详细设计

热门文章

  1. 用内网服务器对接微信公众号服务
  2. alook浏览器哪个好 夸克浏览器_简单搜索、X浏览器、夸克浏览器、Via极简移动浏览器,到底哪个最好用?...
  3. 阿里云移动研发平台EMAS是什么?移动研发平台EMAS有什么特色?
  4. 【一】1D测量 Measuring——translate_measure()算子
  5. [小样本图像分割]PANet: Few-Shot Image Semantic Segmentation with Prototype Alignment
  6. 【磁力链接】专用链接双向转化
  7. Visual Studio 实用插件推荐
  8. 如何区别计算机体系结构与计算机组成这两个概念?
  9. Tableau自定义分类调色板
  10. Java1.5泛型指南中文版