一.为什么alert(2n)输出的是2,而控制台输出2n
最近在控制台写了一个代码
window.alert(BigInt(2n)),发现弹框弹出的是2,但console.log(BigInt(2n))结果是2n,
平时写代码很少会用到原生alert,最基础的反而最不重视。
我去查了MDN,官方的解释是显示一个警告对话框,上面显示有指定的文本内容以及一个"确定"按钮。注意文本二字,原来alert内部给输入的参数都强制转化成字符串了。
拓展:如何让alert函数输出的内容能和控制台一样输出完整的html或某个标签,而非显示[object]? 参考:知乎:重写全局的alert方法,利用Object.prototype.toString.call先判断输入类型,再进行不同数据的转换
二.为什么0.1+0.2不等于0.3
先要知道JS中number的储存方式:采用的是IEEE754双精度64位:
参考计算ieee754,数字先转二进制,再转科学计数法,到最后一个有效尾数停止。而在这个计算的过程中,0.1和0.2会损失精度,所以结果不等于0.3。
解决方法:(0.1* 10 + 0.2 * 10)/10
拓展:
- JS中的Number类型只能安全地表示 -(2^53-1)和2^53-1之间的整数,超出此范围会丢失精度
- 引入BigInt类型,支持任意长度的整数,MDN文档中表示大于2^53的整数使用BigInt
- 为什么Javascript中最大安全整数是2^53-1?(这一条可参考掘金文章
- 手机计算器为什么10%+10%=0.11,其实和精度缺失没关系,使用的是单步计算法: