深入js系列-类型(数字)
开头
js数字没有明确区分浮点数和整数类型,统一用number类型表示。
number 基于IEEE 754标准实现 js采用的是双精度(64位二进制)
我们看一个基于IEEE 754标准实现都有会有的经典问题
0.1 + 0.2 === 0.3 //false
// 原因是 0.1 0.2 不精确,相加不等于0.3 而是一个类似0.30000000004 的值,所以条件判断结果为false
我们很容易修正这个错误,知道是因为偏差值出现问题,我们可以定义一个偏差值,在此偏差值内我们认为两者相等。对于js来说,2^-52比较合适。目前ES6为我们提供了这个偏差值
// Number.EPSILON ES6提供的比较偏差值
// polyfill
if(!Number.EPSILON){
Number.EPSILON = Math.pow(2, -52)
}
//判断相等的方式
function numbersCloseEnoughToEqual(n1,n2) {
return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual( a, b ); // true
numbersCloseEnoughToEqual( 0.0000001, 0.0000002 ); // false
特殊值
比起其他语言,js提供了数字的很多特殊值,我们看一下它们出现的场合以及判别方式
1.NaN
不是数字的数字,表示数字运算和数字解析中的错误
,比如数字运算中操作数不为数字,或者值无法被解析为十进制或十六进制,看下面的例子
var a = 2 / "foo" //NaN
var b = parseInt("f") //NaN
判别
尝试一 、=
// 意料之外 NaN和自身不相等
NaN == NaN
NaN === NaN
尝试二 isNaN
// 全局isNaN函数
var a = 2 / "foo"
is NaN(a) // true
[ undefined, null, true, false, {}, "1" , "foo" ].forEach( e => {
console.log(e, isNaN(e))
})
// 结果 对于undefined、{} 、"foo"都返回了true,明显他们不是NaN
undefined true
null false
true false
false false
{} true
1 false
foo true
//我们需要加一层保险,目前这个方案已经被ES6实现为Number.isNaN
//polyfill
if(!Number.isNaN) {
Number.isNaN = function(n) {
return typeof n === "number" && isNaN(n)
//或者
return n!==n
}
}
2.无穷数 传统编译语言中 除以0 会抛出编译错误或者运行时错误,例如除以0,在js中,这个错误被定义为常量,无穷数 Infinity(Number.POSITIVE_INFINITY),还有在运算中结果溢出的情况也会出现Infinity
var a = 1 / 0; // Infinity(Number.POSITIVE_INFINITY)
var b = -1 / 0; // -Infinity(Number.NEGATIVE_INfiNITY)
var a = Number.MAX_VALUE; // 1.7976931348623157e+308
a + a; // Infinity
a + Math.pow( 2, 970 ); // Infinity
// 无穷除以无穷
Infinity / -Infinity //NaN
// 有穷正数除以Infinity
1 / Infinity // 0
// 有穷负数除以Infinity
-1 / Infinity // -0
3.零值(0、-0) -0 是一些数学运算中会出现
var a = 0 / -3; // -0
var b = 0 * -3; // -0
-0的转换
a.toString(); // "0"
a + ""; // "0"
String( a ); // "0"
// JSON也如此,很奇怪
JSON.stringify( a ); // "0"而不是"-0"
+"-0"; // -0
Number( "-0" ); // -0
JSON.parse( "-0" ); // -0
// 比较操作
var a = 0;
var b = 0 / -3;
a == b; // true
-0 == 0; // true
a === b; // true
-0 === 0; // true
0 > -0; // false
a > b; // false
区分0和-0
function isNegZero(n) {
n = Number(n)
return (n === 0) && (1 / n === -Infinity)
}
// 案例
isNegZero( -0 ); // true
isNegZero( 0 / -3 ); // true
isNegZero( 0 ); // false
对于特殊等式的统一处理(能够处理 NaN -0) Object.is()
var a = 2 / "foo";
var b = -3 * 0;
Object.is( a, NaN ); // true
Object.is( b, -0 ); // true
Object.is( b, 0 ); // false
//一个简单的polyfill
if (!Object.is) {
Object.is = function(v1, v2) {
// 判断是否是-0
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
// 判断是否是NaN
if (v1 !== v1) {
return v2 !== v2;
}
// 其他情况
return v1 === v2;
};
}
深入js系列-类型(数字)的更多相关文章
- 深入js系列-类型(隐式强制转换)
隐式强制转换 在其可控的情况下,减少冗余,让代码更简洁,很多地方都进行了隐式转换,比如常见的三目表达式.if().for().while.逻辑运算符 || &&,适当通过语言机制,抽象 ...
- 【转载】JS Number类型数字位数及IEEE754标准
JS的基础类型Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit.如图 意义 1位用来表示符号位 11位用来表示指数 52位表示尾数 浮 ...
- JS Number类型数字位数及IEEE754标准
JS的基础类型Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit.如图 意义 1位用来表示符号位 11位用来表示指数 52位表示尾数 浮 ...
- 深入js系列-类型(显式强制转换)
什么是显式 这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是"显式",相反你不知道的话,对你就是"隐式" 抽象操作 字符串.数字. ...
- 深入js系列-类型(对象)
开篇 值的传递方式 1.值传递 表示传递过程中复制了值 2.引用传递 表示传递过程中传递的是值的引用 js的传递方式 值传递 看下面的例子 // 这里值传递很容易理解 var a = 1 var b ...
- 深入js系列-类型(null)
首先null是表示什么状态呢 这个是需要和上篇的undefined做一个区分 undefined 从未赋值 非关键词(也就是可以定义为变量名或者赋值给它) null 曾经赋值.目前没值 关键词 typ ...
- 深入js系列-类型(开篇)
思考 作为一个编程人员,你可能从来没仔细思考过,为什么这么多高级语言会有类型这东西. 实际上,类型有点类似生活中的类别,我们日常生活,早已经把这个概念理解到了,切肉和切水果会用不同的刀. 语言级别的类 ...
- js中的数字格式变成货币类型的格式
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- 【D3.V3.js系列教程】--(十二)坐标尺度
[D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...
随机推荐
- 快速学会使用Vuex
一.Vuex简介 官方定义 Vuex是一个专门为Vue.js应用程序开的状态管理模式 它采用集中式存储管理应用的所有组件的状态 并以相应的规则保证以一种可预测的方式发生变化 二.应用场景 多个视图依赖 ...
- Neo4j 第八篇:投射和过滤
投射子句用于定义如何返回数据集,并可以对返回的表达式设置别名,而过滤子句用于对查询的结果集按照条件进行过滤 一,Return子句 使用return子句返回节点,关系和关系. 1,返回节点 MATCH ...
- keyword:react native bridge
js engine native react native bridge https://cn.bing.com/images/search?view=detailV2&id=AAF39636 ...
- 《 .NET并发编程实战》实战习题集 - 3 - CRUD项目中使用FP
先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.
- WPF 精修篇 WPF 使用ActiveX
原文:WPF 精修篇 WPF 使用ActiveX WPF 实现远程桌面功能 首先使用 开发人员命令提示 进入 自己的项目文件根目录下 输入 aximp C:\windows\System32\msts ...
- c# 合并两个DataTable
当两个DataTable 结构相同可以用自带方法(Merge)合并 // // 摘要: // 将指定的 System.Data.DataTable 与当前的 DataTable 合并,指示是否在当前的 ...
- IdentityService4学习笔记之Authorization Code
前文 本文所有内容来自官方文档,如果有写不明白的地方请下方留言或查看官方文档. 今天介绍Authorization Code模式,适用于保密类型的客户端,保密类型客户端可以理解为在服务器端生成页面(比 ...
- 初识Markdown
目录 一.基础语法 二.语法规则 1.标题 2.列表 3.文字格式 4.链接 5.图片 6.引用 7.水平分隔线 8.代码块 9.表格 10.文档目录 11.转义定义 写在前面 Markdown(简称 ...
- SQL Server强制释放内存
--强制释放内存 CREATE procedure [dbo].ClearMemory as begin --清除所有缓存 DBCC DROPCLEANBUFFERS --打开高级配置 EXEC (' ...
- css的尺寸、display的属性、以及浮动和清除浮动的方法
css的尺寸width heightline-height 行高是由三部分构成,上间距 文本高度 下间距,且上下间距相等.所以文字居中.行高:一旦设置了行高,元素内部必须有内容.line-height ...