变量类型的检测有两种常见的操作符: typeof 和instanceof
typeof 操作符:
typeof操作符是一个操作符而不是函数,它操作数可以是变量也可以是数值字面量。typeof能够正确的判断基本数据类型,但是除了null, typeof null 输出的是对象
typeof操作符检测一个变量时返回值只能是几种情况,具体如下:
- 返回值是"undefined" ----如果这个变量是未声明的或者是声明了但没有初始化的变量
- 返回值是"boolean" ----如果这个变量是布尔值
- 返回值是"string" ----如果这个变量是字符串
- 返回值是"number" ----如果这个变量是数值
- 返回值是"object" ----如果这个变量是对象或者null
- 返回值是"function" ----如果这个变量是函数
具体使用代码如下:
var message = 'hello world';
alert(typeof message);// string
alert(typeof (message));// string
alert(typeof 95);// number
几种常见的类型判断:
typeof(undefined) == 'undefined'
typeof(null) == 'object'
typeof("") == 'string'
typeof(0) == 'number'
typeof(false) == 'boolean'
- Boolean([ ]):true
- Number([ ]):0
- Number({}):NAN
- Number(false):0
“==”运算符(连个操作数的类型不相同时)
- 如果一个值是null,另一个是undefined,则它们相等(undefined值是派生自null值的)
- 如果一个值是数字,另一个值是字符串,先将字符串转换为数字,然后使用转换后的值进行比较
- 如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值再进行比较
注:0跟null是不相等的
instanceof操作符:
如果我们想知道某个对象(变量)是什么类型的,这时typeof操作符是不起作用的,需要用到instanceof操作符。instanceof操作符的返回类型是boolean,要么是true,要么是false,如果对象与比较的类型匹配就返回true,反之。原理是instanceof 是通过原型链判断的,A instanceof B, 在A的原型链中层层查找,是否有原型等于B.prototype,如果一直找到A的原型链的顶端(null;即Object.prototype.__proto__
),仍然不等于B.prototype,那么返回false,否则返回true.
instanceof的内部实现源代码:
// L instanceof R
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显式原型
L = L.__proto__; // 取 L 的隐式原型
while (true) {
if (L === null) //已经找到顶层
return false;
if (O === L) //当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__; //继续向上一层原型链查找
}
}
instanceof可以准确的判断复杂数据类型,但是不能正确判断基本数据类型
具体使用代码如下:
alert(person instanceof Object); //变量person是Object吗
alert(color instanceof Array); //变量color是Array吗
alert(pattern instanceof RegExp); //变量pattern是RegExp吗
注意:所有引用类型的值都是object的实例。因此在检测一个引用类型(指那些可能由多个值构成的对象)和Object构造函数时,instanceof 操作符始终会返回true;当然使用instanceof 操作符检测基本类型的值,该操作符会始终返回false。