内置类型
js中有七种内置类型:
- null
- undefined
- boolean
- number
- string
- object
- symbol
我们可以用 typeof 运算符来查看值的类型,它返回的是类型的字符串值。
下面我们看看几种特殊情况:
(1)typeof 对 null 的处理有问题:
typeof null === "object" //true
这是js中的bug,所以我们需要使用复合条件来检测 null 值的类型:
(!null && typeof null === 'object')
(2)function 不是内置类型
typeof function a() {} === 'function'
这样看来,function也像是js的一个内置类型,但是 function 实际上是 object 的一个“子类型”。具体来说,函数是“可调用对象”,它有一个内部属性 [[Call]] ,该属性使其可以被调用。
函数不仅是对象,还可以拥有属性:
function a(b, c) {}
a.length // 2
函数对象的length属性是其声明的参数个数。
undefined 和 undeclared
在作用域中声明但还没有赋值的变量,是 undefined 的。相反,还没有在作用域中声明过的变量,是 undeclared 的。
var a
a // undefined
b // b is not defined
但是 typeof 处理 undeclared 的方式却和 undefined 相同。
var a
typeof a // "undefined"
typeof b // "undefined"
虽然 b 是一个 undeclared 变量,但是 typeof b并没有报错,这是因为 typeof 有一个特殊的安全防范机制。
接下来我们看看typeof的安全防范机制的实际运用:
// DEBUG在特定环境下才会定义
if (DEBUG) {} // 会报错
if (typeof DEBUG !== 'undefined') {} // 安全