JavaScript有七种内置类型:

  • 空值 null
  • 未定义 undefined
  • 布尔值 boolean
  • 数字 number
  • 字符串 string
  • 对象 object
  • 符号 symbol(ES6新增)
    除对象之外,其他统称为“基本类型”
    可以使用typeof运算符来查看值得类型,它返回的是类型的字符串值。这七种类型和它们的字符串值并不一一对应
    1. typeof undefined === "undefined" // true
    2. typeof true === "boolean" // true
    3. typeof 42 === "number" // true
    4. typeof "42" === "string" // true
    5. typeof {life: 42} === "object" // true
    6. // ES6新增
    7. typeof Symbol() === "symbol" // true
    null比较特殊
    1. typeof null === "object" // true
    正确结果应该是”null”,但是这个bug由来已久,在JavaScript中已经存在将近二十年,也许永远不会修复,因为牵涉到太多的Web系统,“修复”它会产生更多的bug,令许多系统无法正常工作。
    需要使用复合条件来检测null的值的类型
    1. var a = null
    2. (!a && typeof a === "object") //true
    null是“假值”(falsy或者false-like),也是唯一一个用typeof检测会返回”object”的基本类型值。
    还有一种情况:
    1. typeof function a(){} === "function" // true
    这样看来,function也是JavaScript的一个内置对象。查阅规范得知,它实际上是object的一个“子类型”。具体来说,函数是“可调用对象”,它有一个内部属性[[Call]],该属性使其可以被调用。
    函数不仅是对象,还可以拥有属性,如
    1. function a(b, c) {
    2. /* ... */
    3. }
    函数对象的length属性是其声明的参数的个数:
    1. a.length // 2
    因为该函数声明了两个命名参数,所以length为2
    JavaScript数组是否也是一个特殊类型?
    1. typeof [1,2,3] === "object" // true
    数组也是对象。确切的说,它也是object的一个“子类型”,数组的元素按数字顺序来进行索引(而非像普通对象那样通过字符串键值),其length属性是元素的个数。