判断一个对象是不是一个数组

判断一个对象是不是一个数组的方法:
1.验证原型对象
如果一个对象的原型对象是Array.prototype

Object.getPrototypeOf(obj)==Array.prototype
var bool=father.isPrototypeOf(child)

var obj=[];
console.log(Array.prototype.isPrototypeOf(obj));//true

判断father是否是child的父对象
2.验证构造函数:
如果一个对象的构造函数是Array

obj.constructor==Array
Var bool=obj instanceof Array

var obj=[];
console.log(obj3 instanceof Array);//true

判断obj是否是由构造函数Array创建出来
instance:实例:一个类型中的一个具体的对象
实例化:用new创建一个对象
问题:验证不够严格
只要是原型链上的都能够排序,即使常见时不是使用数组创建的,但是只要原型链上有数组类型,也认为是数组。

var obj1={};
var obj2=[];
var obj3={};
obj3.__proto__=obj2;
console.log(obj3 instanceof Array);//true
console.log(Array.prototype.isPrototypeOf(obj3));

在这里插入图片描述
3.检查内部属性class:
class是每个对象中记录对象创建时使用的类型的属性
一旦对象被创建,class属性就无法被修改
如何获得class:
唯一的方法:调用Object.prototype中的toString()
输出结果:”[object Object]”
引用类型的对象 class
问题:几乎所有内置对象的原型对象都重写了object中的tostring方法 ,所有的内置对象的子对象,都无法直接调到Object的toString
解决:call(调用方法)几乎无所不能
任意对象的任意方法.call(替换的方法)
什么东西放在原型里,什么东西放在重载对象里
内置对象的原型对象

var obj1={};
var obj2=[];
var obj3={};
obj3.__proto__=obj2;
//判断对象的class属性
console.log(Object.prototype.toString.call(obj2)=="[object Array]");//true
console.log(Object.prototype.toString.call(obj3)=="[object Array]");//false

在这里插入图片描述
4.isArray()和第三种都是严格的判断 ES5新增原理就是第三种方法

var obj1={};
var obj2=[];
var obj3={};
obj3.__proto__=obj2;
//判断对象的class属性
console.log(Array.isArray(obj1));//false
console.log(Array.isArray(obj2));//true
console.log(Array.isArray(obj3));//false

猜你喜欢

转载自blog.csdn.net/qq_41805715/article/details/84834476