js里面的关于类型:
1,为什么有的编程规范,要求用void 0
代替undefined
呢?
Undefined
其实是js里面的一个基本类型。 这个类型里面,只有一个值,就是undefined
。而undefined
是一个变量,不是一个保留字,为了防止我们意外篡改这个变量,所以最好不用undefined
作为值,而无论void
后的表达式是什么,void操作符都会返回undefined
,所以一般用void 0
来代替undefined
。
2, String
的最大长度
String
的最大长度是2的53次方-1 。但是这里的知识点是:
String
的含义并非我以前理解的“字符串”的含义。而是“字符串的UTF16编码”,我们对字符串操作charAt charCodeAt length
都是对编码的操作。所以他的长度是收到UTF16编码长度的影响,所以有最大值。
(讲到这里,可能会认为有必要去了解UTF16
和UTF8
,但是我目前对这个还没有兴趣,也没有遇到相关的问题,所以此处略过)
3, Number
经典问题: 0.1 + 0.2 == 0.3 为什么是false。
因为他的浮点数啊。浮点数的精度问题,导致两边并不相等,有微小的差距。对于浮点数的比较方法应该是这样的:
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSION
(The Number.EPSILON property represents the difference between 1 and the smallest floating point number greater than 1.)
NaN !== NaN
NaN
其实是2的53次方-2个特殊数字的合计。所以他并不是一个精确的数据,而是一群值。所以就能解释为什么NaN !== NaN
4,装箱转换
例如:
'string'.chartAt() // chartAt方法是String对象的内置方法
那为什么'string'
可以调用对象的内置方法呢?
答案是.运算符提供了装箱操作,就是'string'
会先转换成String
对象,再去执行方法。
值得注意的是:装箱机制会频繁的产生临时的对象,在对性能要求高的情况下应该尽量避免这样的做法。使用Object
函数,可以在js中显性调用装箱能力。
4,拆箱转换
Number和String在相互转换的时候,就是先进行了拆箱转换,我的理解是先把value从对象里面取出来,再进行对比。
所以我们常见的就是先调用了valueOf/toString。再去值进行对比。
网友评论