如何判断JavaScript变量类型

typeof

typeof运算符会返回一个字符串表示变量的类型。
主要用来判断 基本类型变量和对象。

typeof "Hello world"; // string
typeof 123;           // number
typeof true;          // boolean
typeof undefined;     // undefined
typeof null;          // object
typeof {a:1};         // object
typeof function(){}   // function

说明:
typeof是根据变量的二进制数据前三位来表示类型的。
'000'表示object类型,而null的二进制数据全为0,所以typeof会把null判断为object类型。

Object.prototype.toString.call()

toString()会返回一个表示该对象的字符串(包含对象子类型信息)。
可以用来判断内嵌对象子类型和基本类型变量。

let toString = Object.prototype.toString;

toString.call([]);            // '[object Array]'
toString.call(new Date);      // '[object Date]'
toString.call(function(){});  // '[object Function]'

toString.call(123);           // '[object Number]'
toString.call("Hello");       // '[object String]'

toString.call(undefined);     // '[object Undefined]'
toString.call(null);          // '[object Null]'
toString.call(true);          // '[object Boolean]'

说明:

  • Object原型的toString方法会被对象"继承",同时也有可能被"覆盖",所以这里调用的是Object原型的方法,而不是对象本身的方法。
  • toString返回的是对象内部属性[[Class]]的值,所以该方法无法判断自定义构造函数创建的对象类型。
function Foo(){}
let foo = new Foo();
Object.prototype.toString.call(foo);  // [object Object]

instanceof

instanceof运算符 用来判断 一个对象是否是某个构造函数的实例。

[] instanceof Array;         // true
new Date() instanceof Date;  // true
let foo = new Foo();
foo instanceof Foo;          // true
1 instanceof Number;         // false

说明:

/**
 * instanceof用于判断一个对象是否是某个构造函数的实例。
 * 原理:检查构造函数的prototype原型对象是否在对象的原型链上。
 */
function instanceof(obj,func){
    let prototype = func.prototype;
    let proto = Object.getPrototypeOf(obj);
    while(proto){
        if(prototype == proto){
            return true;
        }
        proto = Object.getPrototypeOf(proto);
    }
    return false;
}

总结

  1. 优先使用Object.prototype.toString.call(),可用于准确判断内置对象子类型和基本类型变量。
  2. typeof可用于区分对象类型和基本类型。
  3. instanceof可用于判断自定义构造函数的实例对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值