你可能需要知道的前端小知识——JavaScript的类型

141 阅读4分钟

JavaScript的类型

JavaScript的类型都有哪几类?

Undefined

  • Undefined类型表示未定义,这个类型里只有一个值,就是undefined

  • 任何变量在赋值之前都是Undefined类型,值为undefined

  • 其中,有个JavaScript代码设计的失误也与undefined有关:JavaScript有一个全局变量叫undefined,因为是个变量,不是关键字。所以,如果有什么比较神奇的代码不小心把这个全局变量改了,会很难发现问题。当然可以用void 0来获取undefined值替代直接使用全局变量。

Null

  • Undefined不同,表示定义了但是为空。Null类型也只有一个值,就是null,表示空值。

  • undefined不同,nullJavaScript的关键字。所以,在任何代码中,都可以放心null关键字来获取null值。

  • 这可能就是为什么有一些JavaScript代码规范里说的:尽可能使用null,尽可能不用undefined

Boolean

  • 逻辑意义上的真和假,有关键字truefalse表示两个值。

String

  • 表示的是字符串的UTF16编码,编码最大长度是2^53-1。

  • 操作字符串的charAtcharCodeAtlength等方法针对的都是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的核心机制之一,最复杂的类型。
  • 为了避免混淆,上文介绍的类型称为基本类型,在对象类型中可以找到类似的: NumberStringBooleanSymbol
  • 需要注意的是:
    • 3和Number(3)是完全不同的值,一个是Number类型,一个是对象类型
    • JavaScript试图模糊对象和基本类型之间的关系: 对象和基本类型的方法可以互相使用,这部分就涉及到了类型转换。

总结

  • 以上是JavaScript的基本类型相关的一些小知识。

  • 如果在一些点上的表述有问题,欢迎讨论。