JS中判断对象是不是数组的方法

JavaScript中检测对象的方法

1.typeof操作符

这种方法对于一些常用的类型来说那算是毫无压力,比如Function、String、Number、Undefined等,但是要是检测Array的对象就不起作用了。 利用typeof除了array和null判断为object外,其他的都可以正常判断

alert(typeof null); // "object"

alert(typeof function () {

return 1;

}); // "function"

alert(typeof ‘梦龙小站‘); // "string"

alert(typeof 1); // "number"

alert(typeof a); // "undefined"

alert(typeof undefined); // "undefined"

alert(typeof []); // "object"

2.instanceof操作符

这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。

var arr = [1,2,3,1];

alert(arr instanceof Array); // true

3.对象的constructor属性

除了instanceof,每个对象还有constructor的属性,利用它似乎也能进行Array的判断。

var arr = [1,2,3,1];

alert(arr.constructor === Array); // true

第2种和第3种方法貌似无懈可击,但是实际上还是有些漏洞的,当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效

var iframe = document.createElement(‘iframe‘); //创建iframe

document.body.appendChild(iframe); //添加到body中

xArray = window.frames[window.frames.length-1].Array;

var arr = new xArray(1,2,3); // 声明数组[1,2,3]

alert(arr instanceof Array); // false

alert(arr.constructor === Array); // false

检测数组类型方法

以上那些方法看上去无懈可击,但是终究会有些问题,接下来向大家提供一些比较不错的方法,可以说是无懈可击了。

1.Object.prototype.toString

Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这 个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。

function isArrayFn (o) {

return Object.prototype.toString.call(o) === ‘[object Array]‘;

}

var arr = [1,2,3,1];

alert(isArrayFn(arr));// true

call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是‘[object Array]‘,以判断其是否是Array的实例。为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有 toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则是老虎的屁股,很少有人敢去碰它的,所以能一定程度保证其“纯洁性”:)

JavaScript 标准文档中定义: [[Class]] 的值只可能是下面字符串中的一个: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String.

这种方法在识别内置对象时往往十分有用,但对于自定义对象请不要使用这种方法。

2.Array.isArray()

ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。

3.较好参考

综合上面的几种方法,有一个当前的判断数组的最佳写法:

var arr = [1,2,3,1];

var arr2 = [{ abac : 1, abc : 2 }];

function isArrayFn(value){

if (typeof Array.isArray === "function") {

return Array.isArray(value);

}else{

return Object.prototype.toString.call(value) === "[object Array]";

}

}

alert(isArrayFn(arr));// true

alert(isArrayFn(arr2));// true

原文地址:https://www.cnblogs.com/ranyonsue/p/11103315.html

时间: 2024-10-28 22:50:25

JS中判断对象是不是数组的方法的相关文章

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

js中判断对象具体类型

大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2");//string alert(typeof [1,2,3]);//object alert(typeof {"name":"zhuhui"})//object </script> 从上面中我们可以看出数组和普通对象用typeof判断出来都是object

jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?

1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本.随后服务器端返回的数据会根据这个值解析后,传递给回调 函数.可用值: •"xml": 返回

js中判断对象数据类型的方法

1.类型定义 JS是一种弱类型语言.JS拥有动态类型,相同的变量可以用作不同的类型.JS有7种数据类型:三种基本类型(数字,字符串,布尔),两种引用数据类型(对象,数组),两种特殊数据类型(undefined,null). JS有5种原始类型:数字,字符串,布尔,undefined,null. 2.类型判断 对js中不同数据的布尔值类型总结:false:空字符串:null:undefined:0:NaN.true:除了上面的false的情况其他都为true: 如下: var o = { 'nam

js中判断鼠标滚轮方向的方法

  前  言 LiuDaP 最近无聊,在做自己的个人站,其中用到了一个关于鼠标滚轮方向判断的方法,今天闲来无聊,就给大家介绍一下吧!!!! 在介绍鼠标事件案例前,让我们先稍微了解一下js中的event对象 一.JS中的Event对象 Event对象:它代表的是事件的状态,例如可以表示鼠标的位置.鼠标按钮的状态.键盘按键的状态等等. >>>事件通常与函数结合使用,函数不会在事件发生前被执行! 二.JS中如何判断鼠标滚轮方向 判断鼠标滚轮的方向,有着两个派别:一是谷歌.IE派别(这次IE没有

JS中树形对象与数组之间的相互转换

在工作中经常会遇到树形结构的对象转为数组或者数组转为树形对象的需求,那么如何实现呢? 1.首先是要将一个具有树形结构的数组转化为树形结构的对象 // 将一个扁平化的对象数组,转化为树形结构 // 现在有一个对象组成的数组,每个元素有id属性和parent_id属性,根据其id属性和parent_id属性,将其转换为树结构的对象 const arr = [ { id: '1', parent_id: 'root', name:'abc' }, { id: '2', parent_id: 'root

在JS中,对象和数组的区别理解

学习js一段时间,一度搞不清楚“数组”和对象的根本区别.二者都可以用来表示数据的集合. 比如说一个数组是a=[1,2,3,4],一个对象是a={0:1,1:2,2:3,3:4} 输出alert(a[1]),二者的输出结果相同.花了一点时间整理了我对对象和数组的理解. 区别一: 数组是有序数据的集合,而对象是无序数据的集合. 区别二: 数组的数据没有名称,只有下标,而对象的数据需要指定名称. 学过其他语言的人可能会提出“关联数组“是可以有名称的. 比如在js中,可以这样定义一个关联数组: a[“城

[javascript] js中判断对象是否为空的三种实现方法

在写js脚本的时候经常遇到对象为空或者不是对象的情况,出现这种情况我们可以用if去判断它,然后去执行相应的处理方法,具体判断他们的方法有以下几种: 1.if (typeOf(x) == "undefined")2.if (typeOf(x) != "object")3.if(!x) 其中第三种是最简单的方法,但是第三种就不能用if(x)这种互斥的方法去判断,只能在对象前面加!(java里面!x为true的时候x肯定为false了,但是这里是不可以的)

js中Array对象的属性和方法总结

一:属性 length length除了常见的读取数组的长度以外,也可以通过修改length的值来给数组增加或者删除元素,当length数值减少的时候,从数组末尾删除相应元素:增加的时候增加相应数量的元素,但是新增元素没有赋值的时候,初始值为undefined; 二:方法 检测数组 if(obj instanceof Array){ //执行对数组的操作 } 但是这种方法有一个问题.当页面由框架组成的时候,不同的框架中的Window对象是不同的,而Array对象实际上是Window对象的一个属性