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 这样就没问题了。

本文转自:http://www.cnblogs.com/linda586586/p/4227146.html

用JavaScript判断一个对象是否数组?的更多相关文章

  1. javascript判断是否为数组 面试题

    1.方法 instanceof:多框架下有问题(看示例代码). Object.prototype.toString.call():兼容性很好 Array.isArray: IE9+以上 constru ...

  2. javascript-如何判断一个对象为数组

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

  3. JavaScript判断对象和数组

    在调用后端接口时,由于后端接口的不规范统一,接口最外层在没有数据时返回的是空数组(其实更想要的是空json对象,接口返回的data数据应该统一返回json对象,便于扩展),而在有数据时返回的是json ...

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

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

  5. javascript 判断是否是数组

    function isArray(object){ return object && typeof object==='object' && typeof object ...

  6. JavaScript判断是否是数组

    在 ECMAScript5中定义了一个新的方法Array.isArray(). 如果参数是数组的话,就返回true eg: Array.isArray([]); // true 如果里面换一个类似数组 ...

  7. JavaScript 判断一个对象的数据类型。

    1.isString var isString1 = function (obj){ return Object.prototype.toString.call(obj)==="[objec ...

  8. JavaScript 判断一个对象{}是否为空对象的简单方法

    第一种: function isEmptyObject(obj) { for (var key in obj) { //返回false,不为空对象 return false; } return tru ...

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

随机推荐

  1. 【IntelliJ IDEA】升级之后又要激活的解决方法

    用了几个月的idea,在它升级之后,又不听话了.启动时候需要重新激活. 解决方法: 1.找到C:\Windows\System32\drivers\etc\下的hosts文件 在文件中添加如下: 0. ...

  2. 数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 201 ...

  3. VS2010 C#调用C++ DLL文件 【转】

    http://www.soaspx.com/dotnet/csharp/csharp_20110406_7469.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第 ...

  4. 获取类路径中含有beans.xml的jar包名称

    获取类路径中含有beans.xml的jar包名称 package com.stono; import java.io.File; import java.io.IOException; import ...

  5. mysql跨服务器查询

    MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK 摘要: 本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似 ...

  6. CXF webservice 一个简单的demo

    新建一个maven项目(or下载cxf所需jar包),pom.xml如下 1.pom.xml <project xmlns="http://maven.apache.org/POM/4 ...

  7. wifi认证Portal开发系列(三):portal协议

    中国移动WLAN业务PORTAL协议规范介绍 一.用户上线认证流程 上线流程完成用户账号的认证,并把认证结果通知Portal Server,Portal server将会通知WLAN用户并且显示相应的 ...

  8. 用GetTickCount()计算一段代码执行耗费的时间的小例子

    var aNow,aThen,aTime:Longint; begin aThen := GetTickCount(); Sleep();//代码段 aNow := GetTickCount(); a ...

  9. 在hibernate3中如何利用HQL语句查询出对象中的部分数据并且返回该对象?

    例如现在有一个Customer对象 public class Customer{ private Integer cid; private String cname; private Integer ...

  10. golang截取字符串

    对于字符串操作,截取字符串是一个常用的, 而当你需要截取字符串中的一部分时,可以使用像截取数组某部分那样来操作,示例代码如下: package main import "fmt" ...