您的位置:首页 > Web前端 > JavaScript

js判断一个变量是否是数组

2020-04-22 08:27 826 查看

(1)通用方法

    Object.prototype.toString.call();获取对象类型

[code]var a=[1,2,3,4];
function isArray(arr){
return Object.prototype.toString.call(arr) === '[object Array]';
}
console.log(isArray(a));//true

//检验函数
Object.prototype.toString.call(functionName) === '[object Function]';
//检验数字
Object.prototype.toString.call(num) === '[object Number]';

(2)通过instanceof判断

    instanceof运算符用于检验构造函数的prototype属性是否出现在对象的原型链中的任何位置,返回一个布尔值。

[code]var a=[1,2,3,4];
console.log(a instanceof Array);//true

    instanceof运算符检测Array.prototype属性是否存在于变量a的原型链上,显然a是一个数组,拥有Array.prototype属性。

    存在问题:当我们的脚本拥有多个全局环境,例如html中拥有多个iframe对象,instanceof的验证结果可能不会符合预期。

(3)通过constructor判断(原型链方法)

    实例的构造函数属性constructor指向构造函数,那么通过constructor属性也可以判断是否为一个数组

[code]var a = [1,2,3,4];
a.constructor === Array;//true
a.__proto__.constructor === Array; //true 与上一句相同

    存在问题:也会存在多个全局环境的问题,导致的问题与instanceof相同。在IE早期版本里面__proto__是没有定义的。

    第2种方法和第3种方法局限性:

    instanceof 和constructor 判断的变量,必须在当前页面声明的,比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor,会返回false。原因:  1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array。

[code]//为body创建并添加一个iframe对象
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
//取得iframe对象的构造数组方法
xArray = window.frames[0].Array;
//通过构造函数获取一个实例
var arr = new xArray(1,2,3);
arr instanceof Array;//false
arr.constructor === Array;//false

    导致这种问题是因为iframe会产生新的全局环境,它也会拥有自己的Array.prototype属性,让不同环境下的属性相同很明显是不安全的做法,所以Array.prototype !== window.frames[0].Array.prototype,想要arr instanceof Array为true,你得保证arr是由原始Array构造函数创建时才可行。

(4)通过Array.isArray()判断

[code]var a = [1,2,3,4];
Array.isArray(a);//true

    Array.isArray() 是在ES5中提出,而对于ES5之前不支持此方法的问题,我们其实可以做好兼容进行自行封装。

[code]if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}

(5)typeof 不可以

[code]var a = [1,2,3,4];
console.log(typeof a);//输出结果是Object

(参考文章:https://www.cnblogs.com/echolun/p/10287616.htmlhttps://www.cnblogs.com/ysk123/p/9995920.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
这代码长得真好看 发布了6 篇原创文章 · 获赞 2 · 访问量 203 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: