用JavaScript判断一个对象是否数组?
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判断一个对象是否数组?的更多相关文章
- javascript判断是否为数组 面试题
		1.方法 instanceof:多框架下有问题(看示例代码). Object.prototype.toString.call():兼容性很好 Array.isArray: IE9+以上 constru ... 
- javascript-如何判断一个对象为数组
		Q:如何判断一个对象是否为数组? A1:判断对象的constructor是否指向Array, 接着判断对应的特殊属性,如length,splice之类.这个很容易冒充. A2:使用instanceof ... 
- JavaScript判断对象和数组
		在调用后端接口时,由于后端接口的不规范统一,接口最外层在没有数据时返回的是空数组(其实更想要的是空json对象,接口返回的data数据应该统一返回json对象,便于扩展),而在有数据时返回的是json ... 
- JavaScript判断一个对象是否为空
		本文介绍了判断一个对象是否为空的几种方法 测试用例 test1 = 1; test2 = {}; test3 = {a:1,b:2} 1. 判断Object.keys()的长度 function _i ... 
- javascript  判断是否是数组
		function isArray(object){ return object && typeof object==='object' && typeof object ... 
- JavaScript判断是否是数组
		在 ECMAScript5中定义了一个新的方法Array.isArray(). 如果参数是数组的话,就返回true eg: Array.isArray([]); // true 如果里面换一个类似数组 ... 
- JavaScript 判断一个对象的数据类型。
		1.isString var isString1 = function (obj){ return Object.prototype.toString.call(obj)==="[objec ... 
- JavaScript 判断一个对象{}是否为空对象的简单方法
		第一种: function isEmptyObject(obj) { for (var key in obj) { //返回false,不为空对象 return false; } return tru ... 
- js面试之--判断一个对象是不是数组类型,一共几种方法???
随机推荐
- 怎么把一个整数转化为3个十六进制字节 delphi
			如何把一个整数转化为3个十六进制字节 delphi比如把整数149259(都是6位数据整型数) 转换为十六进制为2470B然后再分开为三个字节02 47 0B,求实现代码示例var ID: Integ ... 
- Zlib编译
			转自原文 编译和使用zlib 由于要编译Cesium Terrain Build,其中不仅需要gdal,还用到了zlib,所以此时不得不总结一下Zlib的编译之道了. 在windows下用到zlib库 ... 
- Understanding Objective-C Blocks
			The aim of this tutorial is to give a gentle introduction to Objective-C blocks while paying special ... 
- smartsvn学习(三)  Error validating server certificate for
			Error validating server certificate for 'xxxxxxxxxxxx:443': - The certificate is not issued by a tr ... 
- 主机屋 ubuntu 14安装nginx
			http://www.cnblogs.com/piscesLoveCc/p/5794926.html 安装gcc g++的依赖库 1 sudo apt-get install build-essent ... 
- 2016.11.29 activiti实战--第19章--统一身份管理(含自定义用户与数组的实现)
			学习资料:<Activiti实战> 第十九章 统一身份管理 本章讲解如何统一业务系统与activiti的用户管理系统. 第5章的时候已经讲解过activiti的用户与组.一般来说业务系统都 ... 
- 2016.12.5 在Eclipse中为实现类impl自动生成对应接口
			参考来自:http://jingyan.baidu.com/article/ab69b270d63f572ca6189f51.html 在Spring应用中,常常会用到“接口+实现类”的形式,即要实现 ... 
- Openstack nova代码部分凝视一
			做个一个没怎么学过python的菜鸟.看源代码是最好的学习方式了,如今就从nova入手,主要凝视一下 nova/compute/api.py 中的 create_instance函数 def _cre ... 
- GUID概念
			 GUID概念 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是 ... 
- Reverse Linked List II -- 翻转部分链表
			Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given1->2 ... 
