js判断一个对象是不是一个数组!
判断对象类型一共有几种方式
判断类型首先就想到了 typeof,
- typeof 只能判断原始类型!
- typeof 不能判断引用类型的详细。
- null 是一个对象 : null适用于一个释放一个对象的引用,null经常用来打断对象的引用,代替对象中变量地址,让变量不在引用。
- 所以null也是一个特殊的空地址。null是一个没有意义的空对象。
let n = 10,
str = "hello",
b = true,
nu = null,
un;
let arr = [1,2,3,4];
let obj = {};
typeof(n) // number
typeof(str) // string
typeof(b) // blooean
typeof(nu) // object
typeof(un) // undefined
typeof(arr) // object
typeof(obj) // object
判断方法
- 判断对象的prototype
//判断是不是一个数组
let arr = [1,2,3,4];
obj.__proto__ == Array.prototype; //true
- 因为__proto__可能被浏览器禁用,所以有等效函数来完成__proto的任务;Object.getPrototypeOf(child)
Object.getPrototypeOf(arr) === Array.prototype;
- 还有一个更直接的函数isPrototype(child)
Array.prototype.isPrototype(arr);
- 用父级原型对象中的constructor属性
arr.constructor == Array; //true
- 用instanceof
arr instanceof Array; //true
以上五种有一个缺陷就是将对象的原型对象改成数组的原型对象,以上五种都失效,
let obj = {};
obj.__proto__ = Array.prototype;
obj instanceof Array; // true.
obj.constructor == Array; //true
- 输出对象的隐藏class,利用.call()调用顶级的父元素的toString,.call()可以让一个对象调到原本不属于他自己的函数。。
//对象
let obj = { };
obj.__proto__ = Array.prototype;
obj.toString = [object,Object];
//数组的原型对象是重写了toString 方法默认会取出数组里面的内容转成字符串并用逗号间隔!!
let arr = [1,2,3,4];
arr.toString();
//输出结果是: 1,2,3,4;
//所以要用.call()方法,调用顶端的原型对象。
Object.prototype.toString.call(arr);
//输出 [object Array]
//判断方法
Object.prototype.toString.call(arr)=[object Array]
- ES5中新增了一个用来判断一个对象是不是数组的函数:
let arr = [1,2,3,4];
Array.isArray(arr)