值的分类:typeof 和 instanceof
如果你想要对值进行分类,你需要注意原始值和对象之间的区别。 typeof 运算可以用来区分原始值和对象。instanceof 可以用来区分对象,而且,instanceof 对于所有的原始值都返回 false。
typeof
typeof 可以用来判断原始值的类型,以及区分对象值和原始值:
复制代码 代码如下:
> typeof "abc"
'string'
> typeof 123
'number'
> typeof {}
'object'
> typeof []
'object'
typeof 返回以下字符串:
参数 结果undefined "undefined"
null "object"
布尔值 "boolean"
数字 "number"
字符串 "string"
函数 "function"
其他 "object"
注释:
•typeof 在操作 null 时会返回 "object",这是 JavaScript 语言本身的 bug。不幸的是,这个 bug 永远不可能被修复了,因为太多已有的代码已经依赖了这样的表现。这并不意味着,null 实际上就是一个对象[4] 。
•typeof 还可以让检查一个变量是否已声明,而不会抛出异常。 没有任何一个函数可以实现此功能,因为你不能把一个未声明的变量传递给函数的参数。
复制代码 代码如下:
> typeof undeclaredVariable
'undefined'
> undeclaredVariable
ReferenceError: undeclaredVariable is not defined
•函数也是对象类型;这可能是很多人无法理解的,但有时候却是非常有用的。
•数组是一个对象。
更多关于 typeof 的信息 [5] 和 [6]。
instanceof
instanceof 可以检测一个值是否是某个构造函数的实例:
复制代码 代码如下:
value instanceof Constructor
如果上面的表达式返回 true,则表示 value 是 Constructor 的一个实例。它等价于:
复制代码 代码如下:
Constructor.prototype.isPrototypeOf(value)
大多数对象是 Object 的实例,因为原型链的末端(prototype chain)是 Object.prototype。 原始值不是任何对象的实例:
复制代码 代码如下:
> "abc" instanceof Object
false
> "abc" instanceof String
false