JavaScript中的一些奇特概念

213 阅读4分钟

最近在学习的途中发现了javascript中一些有趣又不理解的特性,于是乎就发出来和大家一起分享分享。这些看似不理解的东西其实和我们的基础相关,于是就好好的查找资料,本着加强基础的想法把这些东西弄得。当然这里面还有好多一知半解和一些根本不知道的,希望有大佬可以解释一下

看着这些有没有一种被欺骗的感jio,为什么输入9999999999999999得到的是10000000000000000,为什么0.5+0.1==0.60.1+0.2就不等于0.3了,还有最奇怪的是[] == ![]

不急~~~,让我们来冷静分析。

1、typeof NaN

其实这是一个很简单的题目,NaN是一种特殊的number。通常都是在计算失败时,作为 Math 的某个方法的返回值出现(例如:Math.sqrt(-10)),或尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("aaa"))。并且注意NaN == NaNfalse,但是我们可以用Object.is()方法来判断两个值是否相等;

2、9999999999999999

javascript中只有一种数值类型(number),javascript没有真正意义上的整数,整数就是不带没有小数的十进制数,产生这种原因是因为javascript在计算的时候会有浮点数误差。

3、0.1 + 0.2 !== 0.3

javascript中的数字类型是基于IEEE 754标准来实现的,该标准也通常被称为“浮点数”,由于在二进制浮点数中0.10.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 [] == ![]

  • [] !== [],因为数组是引用值,当我们创建了两个数组的数组的时候,它们的指针指向堆中的内存空间不相同所以不相等。
  • [] == ![],这看起来似乎有点疯狂,因为!的优先级高于==所以先进行![]的转换,可将变量转换成布尔类型,nullundefinedNaN以及空字符串('')取反都为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




由于本人才疏学浅,肯定有表述不是很正确的地方,敬请各位斧正。