简介
走起,来吧少年 ,咋们直接奔入主题
1. 不是很厉害的typeof方法
var ary = [1,2,3];
console.log(typeof ary);
- 由此可见typeof是无法判断变量是否是数组类型,只能判断其类型
2. instanceof 方法
var ary = [1,2,3];
console.log(ary instanceof Array)
3. constructor 方法
var ary = [1,2,3];
console.log(ary.__proto__.constructor==Array);
console.log(ary.constructor==Array)
ary.__proto__.constructor==Array和ary.constructor==Array ary是有一个叫Array的函数实例化的
4. isArray() 方法
const a = [];
const b = {};
Array.isArray(a);
Array.isArray(b);
- 很显然isArray是可以判断变量是不是数组的,但是,Array.isArray() 是ECMAScript5中引入了方法,用于专门判断一个对象是不是数组,是返回true,不是返回false;目前所有主流浏览器和IE9+都对其进行了支持,IE8及以下浏览器不支持该方法。
5. 用Object的toString方法判断
var ary = [1,23,4];
function isArray(o){
return Object.prototype.toString.call(o)=='[object Array]';
}
console.log(isArray(ary));
Object.prototype里面有个toString()方法
Object.prototype.toString = function(){
在函数里this正常指向的就是调用这个函数的对象也就是(Object.prototype)
js中call()方法是改变this的指向, a.call(b), b替换了a
}
instanceof 和 constructor 缺陷
```js
//例子
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var arr = [1,2,3];
xArray = window.frames[0].Array; //iframe中的构造函数
var arrx = new xArray(4,5,6);
console.log(arrx instanceof Array); //false
console.log(arrx.constructor == Array);// false
```
- 由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共/享原型链的,因此导致instanceof和constructor失效。