JavaScript判断变量是否是数组

广告位招租
扫码页面底部二维码联系

在很多时候,我们都需要对一个变量进行数组【版权所有,侵权必究】【本文受版权保护】类型的判断。JavaScript中如何判【版权所有,侵权必究】【作者:唐霜】断一个变量是数组Array类型呢?我最近未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。研究了一下,并分享给大家,希望能对大家有原创内容,盗版必究。【原创不易,请尊重版权】所帮助。

【本文受版权保护】【原创内容,转载请注明出处】

JavaScript中检测对象的方法

1.typeof操作符

这种方法对于一些常用的类型来说那算是毫无本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net压力,比如Function、String本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】、Number、Undefined等,但【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net是要是检测Array的对象就不起作用了。

【本文受版权保护】【转载请注明来源】未经授权,禁止复制转载。【本文受版权保护】
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"

typeof只能检测基本数据类型,而引用原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】类型则全部是object,因为JavaS转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netcript里面,所有的引用类型,都是基于未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。Object扩展而来的。

【本文首发于唐霜的博客】【本文受版权保护】转载请注明出处:www.tangshua本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】ng.net本文作者:唐霜,转载请注明出处。

2.instanceof操作符

这个操作符和JavaScript中面向对【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net象有点关系,了解这个就先得了解JavaS【转载请注明来源】【作者:唐霜】cript中的面向对象。因为这个操作符是【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net检测对象的原型链是否指向构造函数的pro【原创不易,请尊重版权】【本文受版权保护】totype对象的。

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshua本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ngnet】【本文首发于唐霜的博客】【访问 www.tangshuang.n著作权归作者所有,禁止商业用途转载。【转载请注明来源】et 获取更多精彩内容】
var arr = [1,2,3,1];
alert(arr instanceof Array); // true

3.对象的constructor属性

除了instanceof,每个对象还有c未经授权,禁止复制转载。【转载请注明来源】onstructor的属性,利用它似乎也【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net能进行Array的判断。

【本文受版权保护】【版权所有】唐霜 www.tangshu【未经授权禁止转载】【原创不易,请尊重版权】ang.net
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true

第2种和第3种方法貌似无懈可击,但是实际【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】上还是有些漏洞的,当你在多个frame中【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。来回穿梭的时候,这两种方法就亚历山大了。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】由于每个iframe都有一套自己的执行环本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。境,跨frame实例化的对象彼此是不共享【本文受版权保护】未经授权,禁止复制转载。原型链的,因此导致上述检测代码失效!

【本文首发于唐霜的博客】未经授权,禁止复制转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。ng.net
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

constructor是原型链上的方法。未经授权,禁止复制转载。未经授权,禁止复制转载。instanceof和construct著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netor这两种方法在iframe下的缺点的根转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net源是,这两个方法只允许用在当前页声明的变【作者:唐霜】【版权所有,侵权必究】量上,当跨iframe去访问其他页面的变【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。量时,要么在当前页根本没有声明这个变量,未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net要么在当前页申请的这个变量根本不是数组,【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】所以检测会错误。

【本文受版权保护】【转载请注明来源】转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】ng.net【作者:唐霜】

检测数组类型方法

以上那些方法看上去无懈可击,但是终究会有【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。些问题,接下来向大家提供一些比较不错的方【原创内容,转载请注明出处】【转载请注明来源】法,可以说是无懈可击了。

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】

1.Object.prototype.toString

Object.prototype.toS原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】tring的行为:首先,取得对象的一个内【未经授权禁止转载】【本文首发于唐霜的博客】部属性[[Class]],然后依据这个属【转载请注明来源】著作权归作者所有,禁止商业用途转载。性,返回一个类似于”[obj转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netect Array]”的字符本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】串作为结果(看过ECMA标准的应该都知道本文作者:唐霜,转载请注明出处。【作者:唐霜】,[[]]用来表示语言内部用到的、外部不原创内容,盗版必究。原创内容,盗版必究。可直接访问的属性,称为“内部属性”)。利原创内容,盗版必究。未经授权,禁止复制转载。用这 个方法,再配合call,我们可以取【原创内容,转载请注明出处】【本文首发于唐霜的博客】得任何对象的内部属性[[Class]],原创内容,盗版必究。原创内容,盗版必究。然后把类型检测转化为字符串比较,以达到我【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net们的目的。

原创内容,盗版必究。【版权所有】唐霜 www.tangshu转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。ang.net原创内容,盗版必究。未经授权,禁止复制转载。
function isArrayFn (o) {
   return Object.prototype.toString.call(o) === '[object Array]';
}
var arr = [1,2,3,1];
alert(isArrayFn(arr)); // true

call改变toString的this引本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】用为待检测的对象,返回此对象的字符串表示【转载请注明来源】【作者:唐霜】,然后对比此字符串是否是'[object【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net Array]’,以判断其是【原创不易,请尊重版权】原创内容,盗版必究。否是Array的实例。为什么不直接o.t著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。oString()?嗯,虽然Array继本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】承自Object,也会有 toStrin【转载请注明来源】【原创不易,请尊重版权】g方法,但是这个方法有可能会被改写而达不转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net到我们的要求,而Object.proto原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】type则是老虎的屁股,很少有人敢去碰它【转载请注明来源】【作者:唐霜】的,所以能一定程度保证其“纯洁性”:)
【关注微信公众号:wwwtangshua未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netngnet】 JavaScript 标准文档中定义:本文作者:唐霜,转载请注明出处。原创内容,盗版必究。 [[Class]] 的值只可能是下面字本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】符串中的一个: Arguments, A本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】rray, Boolean, Date,本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。 Error, Function, JS【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。ON, Math, Number, Ob【转载请注明来源】【未经授权禁止转载】ject, RegExp, String本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net.这种方法在识别内置对象时往往十分有用,【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】但对于自定义对象请不要使用这种方法。

【未经授权禁止转载】【版权所有】唐霜 www.tangshu本文版权归作者所有,未经授权不得转载。【本文受版权保护】ang.net【本文受版权保护】

2.Array.isArray()

ECMAScript5将Array.is原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。Array()正式引入JavaScrip本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。t,目的就是准确地检测一个值是否为数组。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】IE9+、 Firefox 4+、Saf【未经授权禁止转载】【原创内容,转载请注明出处】ari 5+、Opera 10.5+和C【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。hrome都实现了这个方法。但是在IE8本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】之前的版本是不支持的。

转载请注明出处:www.tangshua【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】ng.net【版权所有】唐霜 www.tangshu未经授权,禁止复制转载。未经授权,禁止复制转载。ang.net

3.较好参考

综合上面的几种方法,有一个当前的判断数组【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】的最佳写法:

原创内容,盗版必究。未经授权,禁止复制转载。
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

JavaScript中如何判断一个变量是转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】数组Array类型呢?以上便是我为大家分本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。享的JavaScript中判断一个变量是【转载请注明来源】未经授权,禁止复制转载。数组Array类型的方法,希望能对大家有转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】所帮助。

【作者:唐霜】【本文受版权保护】【原创内容,转载请注明出处】【作者:唐霜】

2016-07-29 4575

为价值买单,打赏一杯咖啡

本文价值45.75RMB