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 相关文章推荐
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
Feb 03 Javascript
javascript判断非数字的简单例子
Jul 18 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
使用jQuery简单实现模拟浏览器搜索功能
Dec 21 Javascript
创建js对象和js类的方法汇总
Dec 24 Javascript
vue.js初学入门教程(2)
Nov 07 Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 Javascript
基于bootstrap实现多个下拉框同时搜索功能
Jul 19 Javascript
React中的render何时执行过程
Apr 13 Javascript
layui 动态设置checbox 选中状态的例子
Sep 02 Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 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
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
js中日期的加减法
2015/05/06 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
小程序转发探索示例
2019/02/19 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python实现绘制树枝简单示例
2014/07/24 Python
实例讲解Python中的私有属性
2014/08/21 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
高中军训感言1000字
2014/03/01 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
李开复演讲稿
2014/05/24 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
教师节感想
2015/08/11 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL