JavaScript判断变量是否是数组

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

在很多时候,我们都需要对一个变量进行数组本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】类型的判断。JavaScript中如何判【版权所有,侵权必究】【版权所有,侵权必究】断一个变量是数组Array类型呢?我最近【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net研究了一下,并分享给大家,希望能对大家有转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】所帮助。

未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】

JavaScript中检测对象的方法【版权所有,侵权必究】

【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【作者:唐霜】

1.typeof操作符【原创内容,转载请注明出处】

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

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

【作者:唐霜】【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】
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只能检测基本数据类型,而引用【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net类型则全部是object,因为JavaS【版权所有,侵权必究】转载请注明出处:www.tangshuang.netcript里面,所有的引用类型,都是基于【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。Object扩展而来的。

【转载请注明来源】原创内容,盗版必究。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】

2.instanceof操作符【原创内容,转载请注明出处】

【版权所有,侵权必究】【版权所有,侵权必究】【作者:唐霜】【作者:唐霜】

这个操作符和JavaScript中面向对转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。象有点关系,了解这个就先得了解JavaS【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】cript中的面向对象。因为这个操作符是【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。检测对象的原型链是否指向构造函数的pro【版权所有,侵权必究】【未经授权禁止转载】totype对象的。

【未经授权禁止转载】【转载请注明来源】本文版权归作者所有,未经授权不得转载。
var arr = [1,2,3,1];
alert(arr instanceof Array); // true

3.对象的constructor属性原创内容,盗版必究。

【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【未经授权禁止转载】

除了instanceof,每个对象还有c转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】onstructor的属性,利用它似乎也【原创内容,转载请注明出处】【原创内容,转载请注明出处】能进行Array的判断。

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true

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

原创内容,盗版必究。转载请注明出处:www.tangshuang.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未经授权,禁止复制转载。【未经授权禁止转载】or这两种方法在iframe下的缺点的根【转载请注明来源】本文作者:唐霜,转载请注明出处。源是,这两个方法只允许用在当前页声明的变著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。量上,当跨iframe去访问其他页面的变著作权归作者所有,禁止商业用途转载。【本文受版权保护】量时,要么在当前页根本没有声明这个变量,【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】要么在当前页申请的这个变量根本不是数组,【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】所以检测会错误。

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

检测数组类型方法【原创内容,转载请注明出处】

本文作者:唐霜,转载请注明出处。【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】

以上那些方法看上去无懈可击,但是终究会有【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】些问题,接下来向大家提供一些比较不错的方【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。法,可以说是无懈可击了。

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

1.Object.prototype.t原创内容,盗版必究。【本文受版权保护】oString

未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

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

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

【作者:唐霜】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net

2.Array.isArray()转载请注明出处:www.tangshuang.net

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【本文受版权保护】【原创不易,请尊重版权】

ECMAScript5将Array.is【原创内容,转载请注明出处】【转载请注明来源】Array()正式引入JavaScrip【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】t,目的就是准确地检测一个值是否为数组。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。IE9+、 Firefox 4+、Saf本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。ari 5+、Opera 10.5+和C【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.nethrome都实现了这个方法。但是在IE8【本文受版权保护】未经授权,禁止复制转载。之前的版本是不支持的。

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

3.较好参考【版权所有,侵权必究】

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【版权所有,侵权必究】

综合上面的几种方法,有一个当前的判断数组本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net的最佳写法:

转载请注明出处:www.tangshuang.net【访问 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中如何判断一个变量是【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。数组Array类型呢?以上便是我为大家分著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】享的JavaScript中判断一个变量是未经授权,禁止复制转载。【转载请注明来源】数组Array类型的方法,希望能对大家有原创内容,盗版必究。【未经授权禁止转载】所帮助。

未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

2016-07-29 4402

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

本文价值44.02RMB