Q:如何判断一个对象是否为数组?

A1:判断对象的constructor是否指向Array, 接着判断对应的特殊属性,如length,splice之类.这个很容易冒充。

A2:使用instanceof判断对象是否为数组的实例。一般情况下可行,在某些极端情况下,会出错。例如,有个A页面定义了一个数组a,页面又嵌套了一个iframe,在Iframe里面通过 top.a instanceof Array, 是返回false的.其他情况,见下面详解。

A3:通过Object.prototype.toString.call(obj)这样就可以了,JQ源码也是这样写的。Extjs也是这样写的。这样会返回[Object Array]。如果obj是一个对象,并且拥有一些数组的属性和方法,会返回[object Object],如下:

var obj = {
length:3,
slice:function(){}
};
Object.prorotype.toString.call(obj);//[object Object]

A4:ES5定义了Array.isArray:

Array.isArray([]);//true

对于不支持这个方法的浏览器,可以添加这个方法:

if(typeof Array.isArray === "undefined"){
Array.isArray = function(arg){
return Object.prototype.toString.call(arg) === "[object Array]";
};
}

instanceof相关:

1.构造函数的prototype指向Array的prototype:

function Test(){}
Test.prototype = Array.prototype;
var t = new Test();
alert(t instanceof Array);//true

2.构造函数的prototype指向一个数组:

function Test(){}
Test.prototype = [];
var t = new Test();
alert(t instanceof Array);//true

知道了instanceof的原理,那么前面所说的 top.arr instanceof Array这个问题也自然知道什么原因了,Array实质是window.Array(可以试着判断下), 自然top.Array和iframe内的window.Array是不同的,所以会导致instanceof失效。如果top.arr instanceof top.Array 这样就没问题了。

javascript-如何判断一个对象为数组的更多相关文章

  1. 用JavaScript判断一个对象是否数组?

    Q:如何判断一个对象是否为数组? A1:判断对象的constructor是否指向Array, 接着判断对应的特殊属性,如length,splice之类.这个很容易冒充. A2:使用instanceof ...

  2. Javascript中判断变量是数组还是对象(array还是object)

    怎样判断一个JavaScript变量是array还是obiect? 答案: 1.如果你只是用typeof来检查该变量,不论是array还是object,都将返回‘objec'. 此问题的一个可行的答案 ...

  3. JavaScript如何判断变量是数组还是对象

    编辑 方法一:通过判断变量的类型,并且变量的length属性(除了有一种例外是arguments对象–当给函数传参时数据存储的地方) var arr=[2,3,4]; var obj={"n ...

  4. javascript 如何判断一个对象的类型

    <!DOCTYPE html> <html> <head> </head> <body> <script type="tex ...

  5. javascript如何判断一个对象是否是窗口

    <!DOCTYPE html> <html> <head> </head> <body> <script type="tex ...

  6. js面试之--判断一个对象是不是数组类型,一共几种方法???

  7. js判断一个对象是否为数组

    1,真正的数组的判断方法 javascript中最简单的声明数组方法为: var a = []; 判断是否为数组的最直接的方法为: 复制代码 代码如下: a instanceof Array //tr ...

  8. JavaScript判断一个对象是否为空

    本文介绍了判断一个对象是否为空的几种方法 测试用例 test1 = 1; test2 = {}; test3 = {a:1,b:2} 1. 判断Object.keys()的长度 function _i ...

  9. javascript是判断对象是否是数组

    JS中的数据类型: 2大类 原始类型:值保存在变量本地的数据类型 5种:Number String Boolean undefined null Number:8bytes 舍入误差-->四舍五 ...

随机推荐

  1. C#中NULL,"",DBNULL,String.Empty,Convert.IsDBNull()的区别

    C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享. (1)NULL null 关键字是表示不引用任何对 ...

  2. 关于audio元素在实际项目中遇到的问题总结

    在ios高版本的微信浏览器下(ios10.0以上),audio标签如果添加autoplay属性的话.导致的问题是:通过二维码扫码第一次进入没有问题,第二次扫码进入之后直接卡死在loading页面. 解 ...

  3. 四、Protocol 类似java的接口

    概念:是一系列方法的列表,其中声明的方法可以被任意类实现.这种模式称为代理.和JAVA接口不同的是,Protocol可以不用被实现所有的方法. 使用场景:想要监听一些按钮的操作 1声明一个协议 //& ...

  4. Delphi7 安装ICS,与简单使用

    官网 http://www.overbyte.be/ 下载 OverbyteIcsV816 完成后解压到E:\Delphi7\OverbyteIcsV816\ 1.在library里加入E:\Delp ...

  5. web页面的回流,认识与避免

    一.什么是回流? 回流是会导致页面重新渲染的一些元素,从而影响性能. 二.哪些因素会导致回流? 1.调整窗口的大小: 2.改变字体,如果用rem  设置了根目录的字体大小,这样就减少了回流的次数: 3 ...

  6. 卫星轨道和两行数据TLE

    最近由于Sino-2和北斗的关系,很多网友贴了表示卫星运行轨道的TLE数据.这里想对卫星轨道参数和TLE的格式做一个简单介绍.虽然实际上没有人直接读TLE数据,而都是借助软件来获得卫星轨道和位置信息, ...

  7. 20135328信息安全系统设计基础第一周学习总结(Linux应用)

    学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Linux中用户管理命令/ ...

  8. IOS开发之—— 客服QQ(调用qq网页聊天),客服热线(拨打电话)

    @property (nonatomic,strong) UIButton *but;@property (nonatomic,strong) UIButton *but1;@property (st ...

  9. 利用window.name+iframe跨域获取数据详解

    详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...

  10. checkbox radio select绑定

    index11.html <html><head> <title>checkbox radio select绑定</title> <script ...