JavaScript君,请您坦诚相待~~~
最近在学习的途中发现了javascript
中一些有趣又不理解的特性,于是乎就发出来和大家一起分享分享。这些看似不理解的东西其实和我们的基础相关,于是就好好的查找资料,本着加强基础的想法把这些东西弄得。当然这里面还有好多一知半解和一些根本不知道的,希望有大佬可以解释一下。
看着这些有没有一种被欺骗的感jio,为什么输入9999999999999999
得到的是10000000000000000
,为什么0.5+0.1==0.6
而0.1+0.2
就不等于0.3
了,还有最奇怪的是[] == ![]
。
不急~~~,让我们来冷静分析。
1、typeof NaN
其实这是一个很简单的题目,NaN是一种特殊的number。通常都是在计算失败时,作为 Math 的某个方法的返回值出现(例如:Math.sqrt(-10)),或尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("aaa"))。并且注意NaN == NaN
是false
,但是我们可以用Object.is()
方法来判断两个值是否相等;
2、9999999999999999
在javascript
中只有一种数值类型(number
),javascript
没有真正意义上的整数,整数就是不带没有小数的十进制数,产生这种原因是因为javascript
在计算的时候会有浮点数误差。
3、0.1 + 0.2 !== 0.3
javascript
中的数字类型是基于IEEE 754
标准来实现的,该标准也通常被称为“浮点数”,由于在二进制浮点数中0.1
和0.2
并不是十分精确,所以0.1+0.2
不等于0.3
。但是我们可以使用Number.EPSILON()
,来判断两个数是否在机器精度的误差范围内。 点击这里了解更详细
4、Math.max()&Math.min()
Math.min()
返回了Infinity
,这个值对应了Number.POSITIVE_INFINITY
常量。Math.max()
返回了-Infinity
,这个值对应了Number.NEGATIVE_INFINITY
常量。
我真的也不知道为什么(脑壳痛),这两个方法在我们平常的使用中都会传入至少两个参数,但是如果不传参数就会返回这样的结果,真让人摸不着头脑,就算抛出个错误感觉也比这样要好一些。
5、[] !== [] but [] == ![]
[] !== []
,因为数组是引用值,当我们创建了两个数组的数组的时候,它们的指针指向堆中的内存空间不相同所以不相等。[] == ![]
,这看起来似乎有点疯狂,因为!
的优先级高于==
所以先进行![]
的转换,!
可将变量转换成布尔类型,null
、undefined
、NaN
以及空字符串('')取反都为true
,其余都为false
,所以[] == ![]
变为[] == false
,所以[] == ![]
。
6、[] + {} = "[object Object]"
这里的,{}
出现在+
运算符表达式中,{}
被当作一个空对象来处理,{}
会被强制转换为"[object Object]"
,[]
会被强制转换为""
,所+
执行字符串拼接操作结果为"[object Object]"
7、{} + [] = 0
这里的{}有些不同,它会被当作一个代码块来处理,所以最后的结果相当于执行+[]
,然后[]
被强制转换为0
; 最后转换的代码如下:
{
}
+[]
复制代码
8、91 - '1' & 9 + '1'
- 91 - '1':这里
-
先将'1'
强制转换为1,然后再执行数值的相减操作 - 9 + '1':这里执行的是字符串拼接操作
9、parseInt(1/0, 19)
因为1/0
的结果是Infinity
,所以parseInt(1/0, 19)
相当于parseInt('Infinity', 19)
,因为第一个字符是'I'
,以19
为基数时值为18
。
10、typeof a
虽然这里的a
还没有被定义但是typeof a
的返回结果任然是undefined
,着也许是JavaScript
设计的一个缺陷,在ES6
之前typeo
f是一个绝对安全的操作,因为不会抛出错误,但是再ES6
之后意味着typeof
不是绝对安全的操作了:
let
声明的变量存在一个暂时性死区。 11、NaN !== NaN
这也许是javascript中唯一一个自身不等于自身的值了,但是可以通过Object.is(NaN,NaN),来判断,最后得到的结果是true。
12、.42 == 0.42
因为JavaScript中规定小数点前面的0可以省略。相信大家在CSS中也用过,transition: width .2s
。
13、[1][0] == 1
这里相当于把[1]看作一个数组,然后取它的第0项的值。 相当于:
let arr = [1]
arr[0]
复制代码
14、== & ===
==
允许在相等比较中进行强制类型转换,而===
不允许。所以true == 1
结果为true
true===1
结果为false
由于本人才疏学浅,肯定有表述不是很正确的地方,敬请各位斧正。