一.判断一个值是对象还是数组
1. 通过es6的一个方法Array.isArray()判断
Array.isArray( ) 用于确定传递的值是否是一个数组,返回一个布尔值。
let a = [1,2,3]
Array.isArray(a); //true
Array.isArray({}/null/function); //false
这个方法只能判断出变量是否为数组,并不能确定是否为对象
2. 通过 instanceof 运算符判断
instanceof运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值。
let a = [];
a instanceof Array; //true
a instanceof Object; //truelet b = {};
b instanceof Array; //false
b instanceof Object; //true
通过上面代码可以发现,数组不仅是Array类型的实例,也是Object类型的实例。因此我们在判断一个变量是数组还是对象时,应该先判断数组类型,然后再去判断对象类型。
⚠️不用typeof判断的原因:
null、对象、数组返回的都是object类型(引用类型);对于函数类型返回的则是function。
3. 通过 constructor 属性判断
判断一个变量是否是数组或者对象,从另一个层面讲,就是判断变量的构造函数是Array类型还是Object类型。因为一个对象的实例都是通过构造函数生成的,所以,我们可以直接判断一个变量的constructor属性。
let a = [];
a.constructor === Array; //true
a.constructor === Object; //false
let b = {};
b.constructor === Array; //false
b.constructor === Object; //true
每个变量都会有一个__proto__属性,表示的是隐式原型(原型链的知识)。一个对象的隐式原型指向的是构造该对象的构造函数的原型,因此,每一个变量都有constructor属性。
二. 对象或数组判空
1. a.length === 0 判断数组是否为空
2.JSON.stringfy(b) === ' { } ' 判断对象是否为空
三. 对象或数组中是否包含某个值
1.判断数组中存在某个值
1)for循环
for (let i = 0; i < array.length; i++) { if (array[i] == 3) { return true } }
2) includes
array.includes(3) //输出true表示存在
3)indexOf
array.indexOf(3) // 输出这个数的下标 ,不为-1则表示存在
4)filter
array.filter(c=>c==3).length>0 // 输出true 存在 filter返回的是一个数组
5)find
array.find(c=>c===3}) // 输出3 find返回的是找到的第一个元素
6)some
array.some(c=>c===3) // 输出true some找到第一个元素则返回布尔值,且不在继续检测
7)Set中has
new Set(array).has(3) // 输出true
2. 判断对象中存在某个值
1) 使用“!==”进行判断(属性的值为undefined的时候无法区分)
let obj = {name:"zhang" , age:undefined,};
obj.name !== undefined; // true 有这个属性
obj.sex !== undefined; // fasle 无 sex 这个属性obj.age !== undefined; // fasle 但有这个属性
2) in 运算符,in 的语法是: attr in obj ,表达式返回一个布尔值。(in可以区分存在但值为undefined的属性)
'name' in obj; // true 有这个属性
'sex' in obj;// fasle 无 sex 这个属性'age ' in obj ; // true
3) 对象的 hasOwnProperty() 方法也可以检测指定属性名是否在对象内,返回布尔值。( 只能检测对象的私有属性,继承属性检测不出来)
obj.hasOwnProperty(‘name’); // true 有这个属性
obj.hasOwnProperty(‘sex’);// fasle 无 sex 这个属性