判断一个变量是数组还是对象

很多人看到标题就会想到使用typeof运算符,但是实际上有些它判断不了
var a = [1,2,3]
console.log(typeof a)  // "object"

//总结: typeof运算符并不能直接判断一个变量是对象还是数组,
//实际上,typeof运算符在判断基本数据类型可以,但是引用数据类型就吃力了

判断一个变量是否为数组和对象的方法
  1. instanceof运算符
//基本用法
var a = [1,2,3]
console.log(a instanceof Array); // true
console.log(a instanceof Object); // true

var b = {
    name:'老王',
    age:18,
}
console.log(a instanceof Array); // false
console.log(a instanceof Object); // true

//封装方法
function getDataType(o) {
    if(o instanceof Array){
        return 'Array'
    }else if(o instanceof Object){
        return 'Object'
    }else{
        return 'param is not object type'
    }
}

//有一些缺点

2.判断构造函数

var a = [1,2,3]
console.log(a.__proto__.constructor === Array)  //true
console.log(a.__proto__.constructor === Object)  //false

<!--分装方法-->
function getDataType(o) {
    //获取构造函数
    var constructor = o.__proto__.constructor || o.constructor
    if(constructor === Array){
        return 'Array'
    }else if(constructor === Object){
        return 'Object'
    }else{
        return 'param is not object type'
    }
}

<!--缺点-->
    早期的ie浏览器不支持__proto__ 这个属性

3.toString()函数

var a = [1, 2, 3];
var b = {name: 'kingx'};

console.log(Object.prototype.toString.call(a)); // [object Array]
console.log(Object.prototype.toString.call(b)); // [object Object]

<!--其实任何类型的变量在调用toString函数时候,都会返回不同的结果-->
Object.prototype.toString.call(1);  // [object Number]
Object.prototype.toString.call('kingx'); // [object String]
var c;
Object.prototype.toString.call(c);  // [object Undefined]

// 判断变量是数组还是对象
function getDataType(o) {
   var result = Object.prototype.toString.call(o);
   if (result === '[object Array]') {
       return 'Array';
   } else if (result === '[object Object]') {
       return 'Object';
   } else {
       return 'param is no object type';
   }
}

4.Array.isArray()函数

  • 在JavaScript 1.8.5 版本中增加的静态函数
  • 注意:只能判断出是否为数组,并不能确定是否为对象
// 下面的函数调用都返回“true”
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鲜为人知的事实:其实 Array.prototype 也是一个数组。
Array.isArray(Array.prototype);
 
// 下面的函数调用都返回“false”
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值