【前端笔记】谈谈javascript中的数字

333 阅读3分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

前言

大家好哇,今天来记录一下javascript的数字,内容主要参考《你不知道的JavaScript》(中卷),同时会加上自己的思考,以及实践的例子,有道是好记性不如烂笔头,读了书一定要勤做笔记,这样不仅记的牢固,也能提升自己的水平。

正文

提前说明哦,这是一篇前端笔记类的文章,属于个人记录。各位高人请绕道勿喷,谢谢~

数字

JavaScript使用“双精度”格式(即64位二进制)

数字前的0和小数位最后的0,都可以省略。如:

0.42 === .42    // true
42.30 === 42.3  // true

特别大和特别小的数字默认指数格式显示,与toExponential()函数的输出结果相同。

let a = 5E10  // 50000000000
a.toExponential()  // "5e+10"
let c = 1/a  // "2e-11"

. 运算符优先被当作数字的一部分,然后再作为对象属性访问运算符

比如:

100.toFixed(2) // SyntaxError
.1.toFiexd(2) // 0.10
100 .toFixed(2) // 100.00
(100).toFixed(2) // 100.00
100..toFixed(2) // 100.00

即:如果把 . 算在旁边的数字中合法,就会把它当作是数字的一部分


浮点数的精度, 可以用误差值范围解决,避免出现 0.1+0.2 !== 0.3 的情况。

误差值范围即设定一个误差范围值,两个数相减结果小于这个值即判定相等。

ES6定义了这个值是Number.EPSILON,对ES6之前的版本可以声明Number.EPSILON = Math.pow(2,-52)。

js最大的浮点数约是1.798e+308,定义在Number.MAX_VALUE中。

js最小的浮点数约是5e-324,定义在Number.MIN_VALUE中,无限接近于0。

整数的安全范围最大值是2^53-1,即9007199254740991,在ES6中被定义为Number.MAX_SAFE_INTEGER

整数的安全范围最小值是-9007199254740991,在ES6中被定义为Number.MIN_SAFE_INTEGER

超出一定位数的数字应该用字符串来表示,如多位的ID等。

检测整数:Number.isInteger(num),返回true或者false,等价于:

typeof num == 'number' && num%1 == 0

检测是否安全范围整数:Number.isSafeInteger(num),返回true或者false,等价于:

Number.isInteger(num) && Math.abs(num) <= Number.Max_SAFE_INTEGER

null:空值(曾赋过值,但是现在没有值),是特殊关键字,不能当成变量来使用和赋值

undefined:没有值(从未赋过值),是标识符,可以当成变量来使用或赋值(严格模式下仅能声明局部变量为undefined),重新定义undefined是不好的。

void能让表达式不返回值,如void XXX 结果是undefined

特殊数值

NaN: 不是数字的数字,但仍为数字类型,并且是js里唯一一个非自反的值,即:NaN != NaN

判断一个值是否为NaN可以用isNaN(),不过isNAN有bug,它的判断条件是,参数既不是NaN,又不是数字

在ES6中我们应该使用Number.isNaN()来判断NaN,它等价于:

typeof(n) === "number" && windows.isNaN(n)

更简单的做法是判断这个值是不是不等于自身,因为NaN是js里唯一非自反的值

无穷数: js使用有限数字表示法,当js的运算结果超出处理范围则进行就近取整为Number.MAX_VALUE或Number_MIN_VALUE,若是溢出(js的数字范围),结果就是Infinity或者-Infinity。

由有穷数可以得到无穷数,但是无穷数不能得到有穷数。

零值: js中有0和-0,对数字-0进行转字符串的操作会返回'0',但是对字符串'-0'转数字的操作会返回-0

0 === -0 // true

ES6的新方法Object.is()来处理特殊值的比较,来判断两个值是否绝对相等,可用于判断NaN和-0的情况

Object.is(NaN,NaN)  // true
Object.is(0,-0) // false

后记

你好哇,我是南极大冰块,一个技术与颜值成正比的前端工程师,崇尚一针见血的搞定前端问题,希望我的博客有帮助到了你。

关注我,前端路途一起走。嘿哈~😛