Javascript中判断变量是数组还是对象(array还是object)


Posted in Javascript onAugust 14, 2013

怎样判断一个JavaScript变量是array还是obiect?
答案:
1、如果你只是用typeof来检查该变量,不论是array还是object,都将返回‘objec'。
此问题的一个可行的答案是是检查该变量是不是object,并且检查该变量是否有数字长度(当为空array时长度也可能为0)。
然而,参数对象【arguments object】(传给制定函数的所有参数),也可能会适用于上述方法,技术上来说,参数对象并不是一个array。
此外,当一个对象有a.length属性的时候,这个方法也不成立。

// Real array 正在的数组 
var my_array = []; 
// Imposter! 冒名顶替的! 
var my_object = {}; 
my_object.length = 0; 
// Potentially faulty 潜在的错误 
function is_this_an_array(param) { 
if (typeof param === 'object' && !isNaN(param.length)) { 
console.log('Congrats, you have an array!'); 
} 
else { 
console.log('Bummer, not an array'); 
} 
} 
// Works 成功 
is_this_an_array(my_array); 
// Works, but is incorrect 成功了,但是不正确 
is_this_an_array(my_object);

2、回答这个问题的另一个答案是用一个更加隐蔽的方法,调用toString( )方法试着将该变量转化为代表其类型的string。
该方法对于真正的array可行;参数对象转化为string时返回[object Arguments]会转化失败;此外,
对于含有数字长度属性的object类也会转化失败。
// Real array 真正的数组 
var my_array = []; 
// Imposter! 冒名顶替的! 
var my_object = {}; 
my_object.length = 0; 
// Rock solid 坚如磐石(检验函数) 
function is_this_an_array(param) { 
if (Object.prototype.toString.call(param) === '[object Array]') { 
console.log('Congrats, you have an array!'); 
} 
else { 
console.log('Bummer, not an array'); 
} 
} 
// Works 成功了 
is_this_an_array(my_array); 
// Not an array, yay! 不是数组(array)! 
is_this_an_array(my_object);

3、此外,在可能不可靠的多框架DOM环境中,instanceof是个完美合适的操作。
扩展阅读:"Instanceof Considered Harmful…"
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray
var my_array = []; 
if (my_array instanceof Array) { 
console.log('Congrats, you have an array!'); 
}

4、对于Javascript 1.8.5(ECMAScript 5),变量名字.isArray( )可以实现这个目的
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/isArray
var my_array = []; 
if (Array.isArray(my_array)) { 
console.log('Congrats, you have an array!'); 
}
Javascript 相关文章推荐
在JavaScript中使用inline函数的问题
Mar 08 Javascript
javascript 写类方式之九
Jul 05 Javascript
javascript日期格式化示例分享
Mar 05 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
Oct 29 Javascript
angularjs基础教程
Dec 25 Javascript
ajax如何实现页面局部跳转与结果返回
Aug 24 Javascript
Bootstrop实现多级下拉菜单功能
Nov 24 Javascript
jQuery实现大图轮播
Feb 13 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
小程序登录态管理的方法示例
Nov 13 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
Dec 28 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
Aug 14 #Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 #Javascript
js中return false(阻止)的用法
Aug 14 #Javascript
JavaScript中window、doucment、body的解释
Aug 14 #Javascript
onmouseover和onmouseout的一些问题思考
Aug 14 #Javascript
js之onload事件的一点使用心得
Aug 14 #Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 #Javascript
You might like
php中异常处理方法小结
2015/01/09 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python实现点云投影到平面显示
2020/01/18 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
遇到的Mysql的面试题
2014/06/29 面试题
2014年小学教师工作自我评价
2014/09/22 职场文书
商场广播稿范文
2015/08/19 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android
服务器nginx权限被拒绝解决案例
2022/09/23 Servers