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前台数据获取实现代码
Mar 16 Javascript
js 3种归并操作的实例代码
Oct 30 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
May 28 Javascript
基于gulp合并压缩Seajs模块的方式说明
Jun 14 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
微信小程序 wx:for的使用实例详解
Apr 27 Javascript
Angular.JS中的this指向详解
May 17 Javascript
实例学习JavaScript读取和写入cookie
Jan 29 Javascript
JS实现的邮箱提示补全效果示例
Jan 30 Javascript
使用原生js编写一个简单的框选功能方法
May 13 Javascript
React路由鉴权的实现方法
Sep 05 Javascript
JavaScript手写数组的常用函数总结
Nov 22 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 MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python传递参数方式小结
2015/04/17 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python数据类型之List列表实例详解
2019/05/08 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
Foreo国际站:Foreo International
2018/10/29 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
生物专业个人自荐信范文
2013/11/29 职场文书
活动主持人开场白
2015/05/28 职场文书
繁星春水读书笔记
2015/06/30 职场文书
中秋节祝酒词
2015/08/12 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
高三英语教学反思
2016/03/03 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
golang 实现Location跳转方式
2021/05/02 Golang