JS 基础篇(二) 检测对象类型

前言
Javascript 数据类型分为两类:基本类型和引用类型
ES5 :Number String Null Undefined Boolean 和 Object
ES6 :新增了一个Symbol数据类型
此外,还有一个BigInt可能成为第八种数据类型,bigint 用来表示比2^53 -1更大的数
关于 Symbol和BIgInt 两位新成员 后续整理。

  1. instanceof
    let a = [];
    a instanceof Array; //true
    a.instanceof Object //true
    let b = {};
    b instanceof Array; //false
    b instanceof Object; //true
    
    let c = function(){}
    c instanceof Array; //false
    c instanceof Object; //false
    c instanceof Function; // true
    
    注意
    prototype属性是可以修改的,所以并不是最初判断为true就一定永远为真。
    其次,当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象, instanceof的验证结果可能不会符合预期,例如:
    //为body创建并添加一个iframe对象
    var iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    //取得iframe对象的构造数组方法
    xArray = window.frames[0].Array;
    //通过构造函数获取一个实例
    var arr = new xArray(1,2,3); 
    arr instanceof Array;//false
    
    解释
    导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法,所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,你得保证arr是由原始Array构造函数创建时才可行。
  2. constructor
    let arr = [1,3,4];
    let obj = {}
    let fn = function(){}
    arr.constructor === Array;//true
    obj.constructor === Object;//ture
    fn.constructor === Function;//true
    
    注意
    这种判断也会存在多个全局环境的问题,导致的问题与instanceof相同。
  3. Object.prototype.toString.call()
    let arr = [1,2,3]
    Object.prototype.toString.call(arr) === '[object Array]';//true
    let obj = {}
    Object.prototype.toString.call(obj) === '[object Object]';//true
    let fn = function(){}
    Object.prototype.toString.call(fn) === '[object Function]' ;//true
    
  4. Array.isArray()
    let arr = [1,2,3]
    Array.isArray(arr); //true
    
  5. 完成版
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}
function judgeType (obj) {
 if (typeof obj === 'undefined') {
   return 'Undefined'
 }
 if (obj === null) {
   return 'Null'
 }
 if (typeof obj === 'boolean') {
   return 'Boolean'
 }
 if (typeof obj === 'string') {
   return 'String'
 }
 if (typeof obj === 'number') {
   return 'Number'
 }
 if (!Array.isArray) {
     if (Object.prototype.toString.call(obj) === '[Object Array]') {
       return 'Array'
     }
 } else {
   if (Array.isArray(obj)) {
     return 'Array'
   }
 }
 return 'Object'
}
let num = 1
console.log(judgeType(num));
let bool = true
console.log(judgeType(bool));
let str = 'kk'
console.log(judgeType(str));
let empty = null
console.log(judgeType(empty));
let arr = []
console.log(judgeType(arr));
let obj = {}
console.log(judgeType(obj));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值