判断一个对象是否为数组

方法一:
使用instanceof操作符。instanceof操作符用来判断要检测对象的原型链上是否存在某个构造函数的prototype属性。

var a = {};
var b = [];
console.log(a instanceof Object);//true
console.log(b instanceof Object);//true

使用instanceof操作符有一个问题就是,它假定只有一个全局作用域。如果一个网页中有多个框架(iframe元素),那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数,如果你从一个框架向另一个框架传入数组,那么传入的数组与第二个框架中原生创建的数组分别具有各自不同的构造函数。传入的数组在该框架中用instanceof操作符判断就会返回false。代码如下:

var a = {};
var b = [];
console.log(a instanceof Object);//true
console.log(b instanceof Object);//true

var frame = document.createElement("iframe"); //创建一个框架
document.body.appendChild(frame);
var c = window.frames[0].Array; //取得框架全局执行环境中的Array构造函数
var d = new c(); //在框架全局执行环境中创建一个数组d
console.log(d instanceof Array);在当前页面的执行环境中用instanceof操作符判断d是否为数组,返回false
console.log(Array.isArray(d)); //true

方法二:
使用ECMAScript 5新增的Array.isArray()方法。这个方法的作用就是确定某个值到底是不是数组,而不管它到底是在哪个全局执行环境中创建的

方法三:
使用Object.prototype上的原生toString()方法判断。

使用方法如下:
Object.prototype.toString.call(value)
该方法返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[class]]属性,这个属性中就指定了上述字符串中的构造函数名
该方法不能检测非原生构造函数的函数名,因此开发人员定义的任何构造函数都将返回[object Object]

var a = {};
var b = [];

var frame = document.createElement("iframe"); //创建一个框架
document.body.appendChild(frame);
var c = window.frames[0].Array; //取得框架全局执行环境中的Array构造函数
var d = new c(); //在框架全局执行环境中创建一个数组d
console.log(Object.prototype.toString.call(a)); //[object Object]
console.log(Object.prototype.toString.call(b)); //[object Array]
console.log(Object.prototype.toString.call(c)); //[object Array]

function Person(){
    this.name = name;
}
var n = new Person();
console.log(Object.prototype.toString.call(n)); //[object Object]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值