JavaScript判断变量是否为数组的方法
来源:互联网 发布:淘宝买家信誉怎么算的 编辑:程序博客网 时间:2024/05/14 03:15
数组是编程语言中最基本而且重要的数据结构
在我们JavaScript中,数组是特殊的对象
有时候我们就会遇到判断数组的问题
今天我给大家整理一下哪些方法能够判断一个变量是否是数组
instanceof
var arr = [1,2,3];console.log(arr instanceof Array);//true
instanceof运算符会检测arr是否继承自Array.prototype
看起来没什么问题,确实返回true,证实了arr是数组
这种方法确实能检测出大部分数组,但是某种情况无法检测
一会儿我们再来讨论
constructor
数组的原型中一定存在constructor保存着它的构造器Array
var arr = [1,2,3];console.log(arr.constructor === Array);//true
和上面的方法一样,看似无懈可击,实则不能检测某种特例
Object.prototype.toString
这个方法会获取对象内部的属性[[class]],然后返回你一个字符串
利用顶级原型的属性,再利用call,可以达到我们检测数组的目的
一起来看一下
var arr = [1,2,3];console.log(Object.prototype.toString.call(arr) === '[object Array]');//true
注意:不能直接使用arr.toString
var arr = [1,2,3];console.log(arr.toString());//'1,2,3'
虽然Array也继承自Obejct,但是它内部重写了toString,我们无法用它判断类型
[[Class]] 的值只可以是下面字符串:
Number,String,Boolean,Object,Function,Array,Date,Math,RegExp,Error,JSON,Arguments
Array.isArray
var arr = [1,2,3];console.log(Array.isArray(arr));//true
大部分浏览器内置Array内部实现了isArray判断数组的方法
少数低版本浏览器没有,比如IE8及以下版本 (ノಠ益ಠ)ノ彡┻━┻
问题分析
所以要是不考虑兼容问题的话,Array.isArray可以检测数组没问题
Object.prototype.toString是最无懈可击的方法
下面我们来看看instanceof和constructor的缺点
它们的缺点就是在多窗口和多框架的web页面中兼容不好
做一个实验
我在服务器上挂在了子页面并声明了一个数组
//child.htmlvar arr = [1,2,3];
然后挂载父页面通过iframe标签引入子页面
var frame = document.getElementsByTagName('iframe')[0];document.onclick = function(){ var array = frame.contentWindow.arr; console.log(array instanceof Array);//false console.log(array.constructor === Array);//false console.log(Array.isArray(array));//true console.log(Object.prototype.toString.call(array) === '[object Array]');//true}
点击页面发现了问题
其中一个框架页面中的数组不是另一个框架页面的Array()构造函数的实例
instanceof和constructor方法都不好用了
而Array.isArray和Object.prototype.toString却表现的很好
我们来封装一个完美的函数
function myIsArray(value){ if(Array.isArray){ return Array.isArray(value); }else{ return Object.prototype.toString.call(value) === '[object Array]'; }}
这是原生js判断数组的方法
如果使用js库的话就更方便了
比如jQuery的$.type()就可以完美判断
最后总结一下
总结
判断数组的方法
- arr instanceof Array【不能跨页面判断】
- arr.constructor === Array【不能跨页面判断】
- Array.isArray(arr)【兼容问题】
- Object.prototype.toString.call(arr)
==主页传送门==
- JavaScript判断变量是否为数组的方法
- JavaScript判断变量是否为数组的方法(Array)
- javascript判断是否为数组的方法
- 判断一个变量是否为数组的几种方法
- JS、JQ判断变量是否为数组的方法(Array)
- javascript判断变量是否为空的方法
- javascript 判断是否为数组
- javascript判断是否为数字的方法
- php中判断变量是否为数组
- js判断一个变量是否为数组
- javascript 判断变量是否为数字
- JavaScript判断变量是否为空
- 判断Javascript变量是否为空
- JavaScript判断变量是否是数组
- PHP判断变量是否为0的方法
- Javascript判断变量是否定义的方法,欢迎补充
- 【自学笔记】 原生JavaScript判断一个变量是否为数组,利用原型对象
- PHP中判断数组是否为空的方法
- Android开发者的混淆使用手册
- 对象的序列化和反序列化详解
- 通俗易懂地介绍梯度下降法(以线性回归为例,配以Python示例代码)
- MATLAB中fft的频率轴坐标设置
- JAVA基础:类、对象、包
- JavaScript判断变量是否为数组的方法
- 4.model
- JVM各区域的用途
- HDU——1286找新朋友(欧拉函数)
- JAVA基础:对象的行为注意细节
- 1、微信小程序笔记---框架
- HDU 5092 Seam Carving 递推
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题
- 6. 移动端Web开发调试之Chrome远程调试(Remote Debugging)