- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
JavaScript
的类型
JavaScript
的类型都有哪几类?
Undefined
-
Undefined
类型表示未定义,这个类型里只有一个值,就是undefined
。 -
任何变量在赋值之前都是
Undefined
类型,值为undefined
。 -
其中,有个JavaScript代码设计的失误也与
undefined
有关:JavaScript有一个全局变量叫undefined
,因为是个变量,不是关键字。所以,如果有什么比较神奇的代码不小心把这个全局变量改了,会很难发现问题。当然可以用void 0
来获取undefined
值替代直接使用全局变量。
Null
-
与
Undefined
不同,表示定义了但是为空。Null
类型也只有一个值,就是null
,表示空值。 -
与
undefined
不同,null
是JavaScript
的关键字。所以,在任何代码中,都可以放心null
关键字来获取null
值。 -
这可能就是为什么有一些JavaScript代码规范里说的:尽可能使用
null
,尽可能不用undefined
Boolean
- 逻辑意义上的真和假,有关键字
true
和false
表示两个值。
String
-
表示的是字符串的UTF16编码,编码最大长度是2^53-1。
-
操作字符串的
charAt
、charCodeAt
、length
等方法针对的都是UTF16编码。 -
因为最近正好有在看字符集,简单说下UTF和Unicode:字符是以Unicode的方式表示的,每一个Unicode码表示一个字符。理论上,Unicode的范围是无限的。UTF是Unicode的编码方式。常见的有UTF16和UTF8。Unicode通常用U+xxxx来表示,其中xxxx是十六进制值。0-65536(U+0000-U+FFFF)的码被称为基本字符区域(BMP)。
-
JavaScript字符串把每个UTF16单元当做一个字符来处理,又因为每个字符都是独一无二的编码,所以JavaScript的字符串因是有值类型的特征:就是当字符串创造出来之后,无法用任何方式来改变字符串的内容(这里指的是字符串本身的值)。
Number
- 基本符合IEEE754规定的双精度浮点数的规则,一共有2^62-2^53+3个值。
- 其他的2^53-2个非数字的值,统一用
NaN
(Not-a-Number)来表示。 - 所以,NaN之间不能区分,所以这里有一个隐藏的知识点:
NaN === NaN
这个表达式是false。 - 另外,还有两个特殊值:
+Infinity
和-Infinity
,表示正无穷大和负无穷大。 - 所以,有2^62-2^53个有限值,一个正数对应会有一个负数,正数和负数是一半一半。
- 最后说一下0,有+0和-0。当比较
+0 === -0
的时候,会返回true,在进行toString()
操作,也会都转为0,但是如果放在运算中,正负0就会影响运算结果。比如1/0 === 1/(-0)
,返回false,这是因为+Infinity !== -Infinity
,所以在比较0的时候,会借助正无穷不等于负无穷来比较。 - 关于数值类型(Numeric Type)
- 最新的ECMAscript里规定了两种内置的数值类型,一种是Number,另一种是BigInt。
- BigInt:随着大数据的出现,发现一些数值,超过了IEEE754规定的双精度浮点数的最大值,BigInt的出现就很有必要了。
- 数值可以是任何大小,不限定位宽。
- 同时,规定了和Number类型一样的操作
Symbol
- ES6引入的新类型,是一切非字符串的对象键的集合。
- 一些大家都知道的
Symbol
,也逐渐成为了一类接口形式,使用这些标准中的Symbol
,可以写出更贴合语言特征的API。
Object
- JavaScript的核心机制之一,最复杂的类型。
- 为了避免混淆,上文介绍的类型称为基本类型,在对象类型中可以找到类似的:
Number
、String
、Boolean
、Symbol
, - 需要注意的是:
- 3和Number(3)是完全不同的值,一个是Number类型,一个是对象类型
- JavaScript试图模糊对象和基本类型之间的关系: 对象和基本类型的方法可以互相使用,这部分就涉及到了类型转换。
总结
-
以上是JavaScript的基本类型相关的一些小知识。
-
如果在一些点上的表述有问题,欢迎讨论。