js中将具有数字属性名的对象转换为数组


Posted in Javascript onMarch 06, 2011

虽然不太常用,但我们的确可以给对象添加以数字为属性名的属性:

var obj = {}; 
obj[0] = 1; 
obj[1] = 2;

这个对象并不是数组类型,那有没有办法把它转换为数组类型呢?jQuery代码中采用了Array.prototype.slice把这种对象转换为数组,但我试了好几遍,就是不行:
var obj = {}; 
obj[0] = 1; 
obj[1] = 2; 
alert(Array.prototype.slice.call(obj));

上面这段代码在IE下直接报错,在Firefox下虽然没有报错,输出内容却是空。也就说,转换失败了。这种内置方法的问题最好还是查查ECMA-262,slice方法的执行流程的前两步如下:
1. Let A be a new array created as if by the expression new Array(). 
2. Call the [[Get]] method of this object with argument "length".

这里提到了参数length。obj对象虽然有数字索引,但是却没有length属性。其实问题就在这:slice方法不知道这个对象的长度。简单修改一下代码,添加length属性:
var obj = {}; 
obj[0] = 1; 
obj[1] = 2; 
obj.length = 2; 
alert(Array.prototype.slice.call(obj));

输出内容是"1,2",复制成功。那是不是说明,只要调用slice方法的this有数字索引和length属性,就可以转换为数组呢?。

这个定律在大部分浏览器下成立。然而,在IE环境下,对于HtmlCollection这样的DOM元素集合,即使具有上述特征,它在调用slice的时候也会报错。

Javascript 相关文章推荐
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
引用外部脚本时script标签关闭的写法
Jan 20 Javascript
jquery批量设置属性readonly和disabled的方法
Jan 24 Javascript
微信JSSDK上传图片
Aug 23 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
浅谈javascript中执行环境(作用域)与作用域链
Dec 08 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
Node层模拟实现multipart表单的文件上传示例
Jan 02 Javascript
解决vue路由name同名,路由重复的问题
Aug 05 Javascript
使用compose函数优化代码提高可读性及扩展性
Jun 16 Javascript
js 优化次数过多的循环 考虑到性能问题
Mar 05 #Javascript
淘宝搜索框效果实现分析
Mar 05 #Javascript
再论Javascript下字符串连接的性能
Mar 05 #Javascript
再论Javascript的类继承
Mar 05 #Javascript
Array的push与unshift方法性能比较分析
Mar 05 #Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 #Javascript
判断用户是否在线的代码
Mar 05 #Javascript
You might like
php设计模式 Builder(建造者模式)
2011/06/26 PHP
php构造函数与析构函数
2016/04/23 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
python查找指定具有相同内容文件的方法
2015/06/28 Python
python:socket传输大文件示例
2017/01/18 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
python爬虫如何解决图片验证码
2021/02/14 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
心得体会的写法
2014/09/05 职场文书
小班教师个人总结
2015/02/05 职场文书
2015年财务部工作总结
2015/04/10 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
Python语言规范之Pylint的详细用法
2021/06/24 Python