最近在学习的途中发现了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之前typeof是一个绝对安全的操作,因为不会抛出错误,但是再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
由于本人才疏学浅,肯定有表述不是很正确的地方,敬请各位斧正。

京公网安备 11010502036488号