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 相关文章推荐
JQuery index()方法使用代码
Jun 02 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
js二维数组排序的简单示例代码
Jan 24 Javascript
动态的绑定事件addEventListener方法的使用
Jan 24 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
动态加载js文件简单示例
Apr 21 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
VSCode 配置React Native开发环境的方法
Dec 27 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 Javascript
vue中各种通信传值方式总结
Feb 14 Javascript
使用原生JS实现滚轮翻页效果的示例代码
May 31 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实现斐波那契数列的简单写法
2014/07/19 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python实现处理管道的方法
2015/06/04 Python
浅谈Python单向链表的实现
2015/12/24 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
python将数据插入数据库的代码分享
2020/08/16 Python
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
Shell如何接收变量输入
2016/08/06 面试题
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
求职信的正确写法
2014/07/10 职场文书
学生安全责任书范本
2014/07/24 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
行政撤诉申请书
2015/05/18 职场文书
高中物理教学反思
2016/02/19 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle
Tomcat弱口令复现及利用
2022/05/06 Servers