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