很多人看到标题就会想到使用typeof运算符,但是实际上有些它判断不了
var a = [1,2,3]
console.log(typeof a) // "object"
//总结: typeof运算符并不能直接判断一个变量是对象还是数组,
//实际上,typeof运算符在判断基本数据类型可以,但是引用数据类型就吃力了
判断一个变量是否为数组和对象的方法
- 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);