js如何判断一个对象是不是Array?
在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢?
typeof 操作符
对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时
| 1 | vararr=newArray("1","2","3","4","5"); | 
| 2 | alert(typeof(arr)); | 
你会收到一个object 的答案,有点让人失望。
instanceof 操作符
JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。 使用方法:result = object instanceof class,还是刚刚的数组,再来一次,嗯,成功的返回 true。
| 1 | vararrayStr=newArray("1","2","3","4","5"); | 
| 2 | alert(arrayStr instanceofArray); | 
小总结:看样子我们今天讨论的问题已经得到了解答,但事实上在多个frame中穿梭就会产生大问题了。
| 1 | variframe = document.createElement('iframe');    | 
| 2 | document.body.appendChild(iframe);    | 
| 3 | xArray = window.frames[window.frames.length-1].Array;       | 
| 4 | vararr = newxArray("1","2","3","4","5");//这个写法IE大哥下是不支持的,FF下才有 | 
| 5 |         | 
| 6 | alert(arr instanceofArray); // false | 
| 7 | alert(arr.constructor === Array); // false | 
返回结果为两个False,让人大失所望。
ECMA-262 写道
Object.prototype.toString( ) When the toString method is called, the following steps are taken:
- Get the [[Class]] property of this object.
- Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
- Return Result (2)
上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在ECMA标准中Array的描述吧。
ECMA-262 写道
new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.
于是利用这点,第三种方法登场了。
| 1 | functionisArray(obj) {   | 
| 2 |   returnObject.prototype.toString.call(obj) === '[object Array]';    | 
| 3 | } | 
call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)
与前面几个方案不同,这个方法很好的解决了跨frame对象构建的问题,经过测试,各大浏览器兼容性也很好,可以放心使用。一个好消息是,很多框架,比如jQuery、Base2等等,都计划借鉴此方法以实现某些特殊的,比如数组、正则表达式等对象的类型判定,不用我们自己写了。
另外Ext3 也已经换成这样的写法了
| 1 | isArray : function(v){ | 
| 2 |             returntoString.apply(v) === '[object Array]'; | 
| 3 |         } | 
js如何判断一个对象是不是Array?的更多相关文章
- js如何判断一个对象是不是Array?(转载)
		js如何判断一个对象是不是Array? 在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢? typeof 操作符 对于Function, String, Nu ... 
- js如何判断一个对象是不是Array? 三种方法总有一种可以帮上忙
		转载:http://www.nowamagic.net/librarys/veda/detail/1250 在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢? ... 
- js如何判断一个对象是不是Array
		typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 var arr=new Array(&quo ... 
- 如何用js判断一个对象是不是Array
		.如何用js判断一个对象是不是Array 1.Array.isArray(obj) 调用数组的isArray方法 2.obj instanceof Array 判断对象是否是Array的实例 3.Ob ... 
- js如何判断数组是Array类型
		在说明如何判断一个对象为数组类型前,我们先巩固下js的数据类型,js一共有六大数据类型:number.string.object.Boolean.null.undefined.var str=&quo ... 
- JS如何判断一个对象是否为空、是否有某个属性
		一.js判断一个对象是否为空 方法一: let obj1 = {} let obj2 = {a:1} function empty(obj){ for (let key in obj){ return ... 
- js中判断一个对象的类型的种种方法
		javascript中检测对象的类型的运算符有:typeof.constructor.instanceof. typeof:typeof是一个一元运算符,返回结果是一个说明运算数类型的字符串.如:&q ... 
- [转]JS如何判断一个对象是否为空、是否有某个属性
		原文地址:https://www.cnblogs.com/crackedlove/p/10039105.html 一.js判断一个对象是否为空 方法一: let obj1 = {} let obj2 ... 
- js/jquery判断一个对象是否为空
		一.js判断一个对象是否为空对象 1)通过JSON自带的.stringify方法来判断 //JSON自带的stringify方法,将json转成json字符串 var c = {}; if(JSON. ... 
随机推荐
- 从零开始学Kotlin-类和对象(5)
			定义一个类 定义一个类,使用关键字class声明,后面跟类名(不使用new) class demo5 {//定义一个类,使用关键字class声明,后面跟类名 fun test() {//类中定义方法 ... 
- week5-Link Layer
			Technology:Internets and Packets course Layer 1 : Link Introduction/The Link Layer moving from histo ... 
- [转帖]Vim编辑器使用方法详解
			Vim编辑器使用方法详解 程序员小新人学习 2018-12-16 12:26:23 转载于https://www.cnblogs.com/libaoliang/articles/6961676.htm ... 
- Python进阶-字符串格式化
			目录 前言 %格式化 str.format() f-Strings 特殊符号处理 前言 在 Python 3.6 之前,字符串格式化方法主要有两种: %格式化 str.format() 在Python ... 
- SVN for Mac
			SVN for Mac https://www.wikihow.com/Install-Subversion-on-Mac-OS-X https://subversion.apache.org/pac ... 
- Spring之AOP注解配置
			1.导入相应jar包 2.引入约束并配置XML文件 <beans xmlns="http://www.springframework.org/schema/beans" xm ... 
- robotframework常用的几个快捷键
			robotframework常用的几个快捷键 重命名(F2) 搜索关键字(F5) 执行用例(F8) 创建新工程(ctrl+n) 创建新测试套(ctrl+shift+f) 创建新用例(ctrl+shif ... 
- contentInsetAdjustmentBehavior各个值之间的区别
			iOS11也出了不少时候了网上说适配的文章一大堆.关于contentInsetAdjustmentBehavior这个参数之间的区别,好像没什么人能说明.往下看的前提是你已经知道什么是安全区域,没看明 ... 
- Git合并的代码 不提交服务器的方法
			使用Git下载代码的时候,常遇到合并的情况,然后再上传的时候,系统就会自动把合并代码的过程也上传,有时候会感觉非常的烦Merge remote-tracking branch 'choose_remo ... 
- 【UOJ #351】新年的叶子(树的直径,期望)
			题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所 ... 
