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 插件 人性化的消息显示
Jan 21 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
js星星评分效果
Jul 24 Javascript
EasyUI实现第二层弹出框的方法
Mar 01 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
深入理解JavaScript函数参数(推荐)
Jul 26 Javascript
深入理解JavaScript中Ajax
Aug 02 Javascript
javascript设计模式之策略模式学习笔记
Feb 15 Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
JavaScript Canvas实现验证码
Aug 02 Javascript
JavaScript enum枚举类型定义及使用方法
May 15 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递归实现层级树状展开
2016/04/01 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
python ip正则式
2009/05/07 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
粗略分析Python中的内存泄漏
2015/04/23 Python
Python聚类算法之基本K均值实例详解
2015/11/20 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
Python 处理文件的几种方式
2019/08/23 Python
Python中six模块基础用法
2019/12/08 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
金融学专业大学生职业生涯规划
2014/03/07 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
倡议书的写法
2014/08/30 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
劳模先进事迹材料
2014/12/24 职场文书
学校捐书活动总结
2015/05/08 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python