js检测变量类型--typeof && instanceof

变量类型的检测有两种常见的操作符: typeof 和instanceof

 

typeof 操作符:

typeof操作符是一个操作符而不是函数,它操作数可以是变量也可以是数值字面量。typeof能够正确的判断基本数据类型,但是除了null, typeof null 输出的是对象

typeof操作符检测一个变量时返回值只能是几种情况,具体如下:

  1. 返回值是"undefined" ----如果这个变量是未声明的或者是声明了但没有初始化的变量
  2. 返回值是"boolean" ----如果这个变量是布尔值
  3. 返回值是"string" ----如果这个变量是字符串
  4. 返回值是"number" ----如果这个变量是数值
  5. 返回值是"object" ----如果这个变量是对象或者null
  6. 返回值是"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

“==”运算符(连个操作数的类型不相同时)

  1. 如果一个值是null,另一个是undefined,则它们相等(undefined值是派生自null值的)
  2. 如果一个值是数字,另一个值是字符串,先将字符串转换为数字,然后使用转换后的值进行比较
  3. 如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值再进行比较

注: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值