如何判断数组对象类型,以及如何判断其是否为空

203 阅读4分钟

如何判断数组和对象?

判断一个参数的数据类型是否是数组

Array.prototype.isPrototypeOf()

console.log(Array.prototype.isPrototypeOf(arr)); //true
console.log(Object.prototype.isPrototypeOf(arr)); //true
console.log(Array.prototype.isPrototypeOf(obj1)); //false

Array.isArray(arr)

返回一个布尔值,用来表示参数的数据类型是否为数组。

const arr=[];
const abj={};
console.log(Array.isArray(arr)); //true 
console.log(Array.isArray(obj)); //false 

typeof

返回一个字符串,表示未经计算的操作数的类型

console.log(typeof (1));                //number
console.log(typeof('1'));               //string
console.log(typeof (undefined));        //undefined
console.log(typeof ([]));               //object
console.log(typeof ({}));               //object
console.log(typeof(true));              //boolean
console.log(typeof(null));              //object
console.log(typeof (function () { }));  //function
console.log(typeof(console));           //object

可以发现Array、Object、null使用typeof判断出来的类型都是Object。

*如果我们想要判断一个变量是否存在,可以使用typeof,如果使用if进行判断的话,若变量未生命则会报错。(如下)

console.log(typeof (obj));
if (obj) {
    console.log(true);
}

// undefined
// f:\LYJ\笔记整理\JS\typeofAndInstanceOf.js:13
// if (obj) {
// ^

instanceof

instanceof用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。

原理:通过Object.getPrototypeOf()方法获取参数的原型对象。顺着原型链去查找,直到找到相同的原型对象。结果返回true和false。

let fun = function () { };
let funtest = new fun();
console.log(funtest instanceof fun); //true

let str = new String('xxx');
let str1 = 'xxx';
console.log(str instanceof String); //true
console.log(str1 instanceof String); //false

typeof和instanceof的区别

① typeof返回变量的基本类型,instanceof返回一个布尔值

②instanceof可以准确地判断复杂引用数据类型,但不能正确判断基础数据类型

③typeof可以判断基础数据类型但引用数据类型中,除function类型外,其他的也无法判断

Object.prototype.toString() 通用检测数据类型

Object.prototype.toString({})       // "[object Object]"
Object.prototype.toString.call({})  // 同上结果,加上call也ok
Object.prototype.toString.call(1)    // "[object Number]"
Object.prototype.toString.call('1')  // "[object String]"
Object.prototype.toString.call(true)  // "[object Boolean]"
Object.prototype.toString.call(function(){})  // "[object Function]"
Object.prototype.toString.call(null)   //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g)    //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([])       //"[object Array]"
Object.prototype.toString.call(document)  //"[object HTMLDocument]"
Object.prototype.toString.call(window)   //"[object Window]"

全局通用的数据类型判断方法

function getType(obj){
  let type  = typeof obj;
  if (type !== "object") {    // 先进行typeof判断,如果是基础数据类型,直接返回
    return type;
  }
  // 对于typeof返回结果是object的,再进行如下的判断,正则返回结果
  return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); 
}

参考 vue3js.cn/interview/J…

总结:
Array.prototype.isPrototypeOf() 返回一个布尔值,可以判断一个变量是否是数组。
Array.isArray(arr) 返回一个布尔值,表示参数是否是数组类型。
typeof 可以判断出基本数据的类型,而引用类型数据均为Object,无法区分。
instanceof 返回一个布尔值,可用来判断钩爪函数的prototype是否在某个实例对象的原型上。
Object.prototype.toString() 通用检测数据类型。可以正确检测出来所有的数据类型。

如何判断数组Array和对象Object是否为空?

注意array=[]和array=null是有区别的

// array=[]
if(arrray) //true
//array=null
if(array)  //false

(1)if语句中的判断

js 的if 判断实际上是 Boolean(a) ==true 来判断的,先将 a 转化为Boolean 对象 ,然后判断 这个布尔对象是true 还是false。

// 判断一个数组是否为空
const arr = [];
if (arr) {
   console.log("if直接判断arr:    ",true);
} else {
   console.log("if直接判断arr:    ",false);
}

// 判断一个对象是否为空
const obj={}
if (obj) {
   console.log("if直接判断obj:    ",true);
} else {
   console.log("if直接判断obj:    ",false);
}

结果:

if判断arr和obj为空结果.png

原因:

console.log(Boolean(arr)); //true
console.log(Boolean(obj)); //true

因此,在写代码时,应注意不要直接通过if(obj)的方式来做判断。

下面,来看看null和undefined

const arr=[];
const obj={};

arr==='null'; // false 
obj==='null'; // false 

let arr,obj;
arr==='undefined'; // false 
obj==='undefined'; // false 

原因,在对比时,会先转为bool类型然后才进行比较。

那么我们来了解一下,Boolean()函数。 如果省略该参数或参数值为 0、-0、null、false、NaN、undefined,或空字符串(""),则该对象具有的初始值为 false。所有其它值,包括任何对象,空数组([])或字符串 "false",都会创建一个初始值为 true 的对象。 'null'和'undefined'是字符串,所以不能直接比较。

想将对象转为bool值得时候,除了通过Boolean函数,还可以通过 双重非(!!) 的方式。

(2)判断Array是否为空

Array.length()>0

Array==false //true

const arr=[];
if(arr==false){
    console.log('数组为空');
}

数组和bool类型做比较的时候,会将这两者都转为数字number进行比较。空数组转为number结果为0.

参考 blog.csdn.net/tangxiujian…

(3)判断Object是否为空

JSON.stringify(obj)=="{}"

console.log(JSON.stringify(obj) == "{}"); //true

for...in...

var fun = function (obj) {
    for (var key in obj) {
        return false;
    }
    return true;
}
objIsNull = fun(obj);
console.log(objIsNull); //true

Object.getOwnPropertyNmages()

var objarr = Object.getOwnPropertyNames(obj);
console.log(objarr.length == 0); //true

使用Object.getOwnPropertyNmages()可以获取到对象中的属性名并返回数组对象。判断此数组是否为空,即对象是否为空。

Object.keys() --ES6的新方法

var objKeys = Object.keys(obj);
console.log(objKeys.length==0); //true

使用Object.keys()可以获取到对象中的属性名并返回数组对象。判断此数组是否为空,即对象是否为空。

参考: cloud.tencent.com/developer/a…

总结

总结:
判断数组为空:Array.length()==0;
判断对象为空:
    Object.keys(obj).length()==0; 
    Object.getOwnPropertyNames(obj).length==0