问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么判断一个变量是数组Array类型

发布网友 发布时间:2022-05-01 18:15

我来回答

2个回答

热心网友 时间:2022-04-22 12:39

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

热心网友 时间:2022-04-22 13:57

JavaScript中检测对象的方法
1.typeof操作符
这种方法对于一些常用的类型来说那算是毫无压力,比如Function、String、Number、Undefined等,但是要是检测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"

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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
分手后说过的话精选185句 分手说的精选113句 分手怎么挽回女朋友的句子精选162句 现在工作忙的要死,女朋友因为这跟我分手,我该怎么办? ...任意组成两个不同的两位小数,并把它们改写成以0.001为计数单位... m3/MW▪h怎么换算m3/s▪GW? 交通银行的刷卡金怎么使用呢? 什么时候刷卡金 ...突然前面两条腿好像断了一样 走路前面两腿都无法支撑 吃饭就坐着吃... 王者荣耀:伤害与回复兼备的杨戬,为何不受待见,真废了吗? 以下PHP代码为什么会输出10个array?请详细说明下.... 美团点评单屏收银机安装 我微信没给对方发语音,对方那边确显示语音已取消。这是怎么回事 Array[10]代表数组Array有10个元素。Array[2]=30是代表第二个元素等于30还是第三个元素等于30 VB中经常看到的arr与array 有什么区别? C++ array的问题 微信语音或视频打进来时有时响铃有时却没有,只发来一条未接已取消的消息_百度问一问 有array这个关键字吗 如何将数组array(1,2,'a',array(4,5,'b'))变成array(2,4,'a',array(8,10,'b')) 不是深圳户口能在深圳这边补买一年的社保吗 php怎么判断数组里面还有数组 Array的详细讲解,帮我把下面的详细讲解下,谢 深圳社保断缴超过三个月可以补吗 C# 中Array 是个什么角色啊,数组?集合?还是别的,有什么用途,怎么用... 余额宝升级后三个基金那个安全? php中array[a]和array['a']有什么区别呢? 在使用delete删除数组array时,有时看到还补充array=0是为了什么? (array)与array()有什么区别? 我有一台华硕的电脑为什么每次上网都要重新输入IP呢 华硕win10网络诊断中怎么修复ip地址? 美团1010收款机能连蓝牙吗 php请问下如何取得下面array中的值? 微信语音申请,主叫方没显示接听。主叫取消,显示已取消,能因为手机卡顿,其实被叫方听到了吗? 输出数组前面总是有个Array 美团收银台点评机器没有显示结账金额怎么设置? 手机微信总是弹出对方拨打语音挂断提示(对方已取消)但是对方又没有打是什么问题? 有了arraylist为什么还要用数组 为什么微信一直显示跟某人语音通话中,但是并没有呀,每次点开那个提示,都会多一个对方已取消 健美操如何编队形 16人的排舞队形 十六个人的广场舞怎样变队形好看 18个人跳健美操要变多少次队形和变什么队形好.? 大众健美操第三套第一级6个人如何变换队形 健美操三人队形怎么变? 有关于哈士奇的一些问题 今天买了个小土猫,怎么养??? 华为手机制造的商业模式对那种类型的制造企业有借鉴作用? 小猫(大约两周)怎么喂养。详细一点,偶是新手~~~就是饮食起居全面的~~ 养猫需要注意的 怎样养猫咪?