Array.prototype 的泛型应用分析


Posted in Javascript onApril 30, 2010

题目
请说明下面语句的输出:

x = {shift:[].shift}; 
x.shift(); 
console.info(x.length);

如果你回答正确,那么说明你已经了解 Array 函数的泛型应用。在理解这到题目之前,我 我们首先要了解数组(Array)的 shift 定义。

MDC 中已经对相关的说明描述得非常的清楚

shift is intentionally generic; this method can be called or 
applied to objects resembling arrays. Objects which do not 
contain a length property reflecting the last in a series of 
consecutive, zero-based numerical properties may not behave 
in any meaningful manner.

同时,EMCAScript 中的定义也同时定义了对于 shift 操作对于对象 length 属性的改变, 那么基本上我们可以了解到上题中的答案为
0

扩散思维
如果对于上面的题目还无法理解,那么我们更清楚的说明 Array.prototype.shift 对对象 的 length 的影响。
x = {}; 
Array.prototype.shift.call(x); 
console.info(x.length);

很明显,对于对象如果为定义 length 属性,则 shift 则会自动加上 length 属性并设置 为 0 。

既然已经说到这里,那么下面的题目输出什么留给大家去思考。

x = function (a, b, c) {}; 
Array.prototype.shift.call(x); 
console.info(x.length);

重新认识泛型
很明显,上面的题目有可能还是无法说明本篇文章的题目。泛型(Generic)应用其实 期前也说明过,但这里主要说明 Array 方法对于“类数组”的操作使用。

强制转换为数组

var args = Array.prototype.slice.call(arguments);

这个用法比较火星,其实期前也用过,详细参见这里。

迭代数据

Array.prototype.forEach.call(arguments, function(i) { 
console.info(i); 
});

如果对象能够被递归,则出了“传统”的 for、while 等语句以外,还可以考虑使用 Array 的 forEach 属性(注意 IE 会是悲剧)。Array 的 forEach 方法详见这里。

其他的 Array 扩展用法可以散发自己的思维,如果对应浏览器的 Array 没有对应的实现方 法,可以参见这里。

其实,不仅仅是 Array 方法,很多浏览器原生对象的方法都是泛型,我们完全可以利用这 这些特性使代码更为的清晰
使用原生方法,效率更高。

Javascript 相关文章推荐
JS获取IUSR_机器名和IWAM_机器名帐号的密码
Dec 06 Javascript
豆瓣网的jquery代码实例
Jun 15 Javascript
js的写法基础分析
Jan 17 Javascript
jQuery find和children方法使用
Jan 31 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
js实现一个链接打开两个链接地址的方法
May 12 Javascript
解决WordPress使用CDN后博文无法评论的错误
Dec 15 Javascript
node.js使用cluster实现多进程
Mar 17 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
Dec 28 Javascript
基于JavaScript实现滑动门效果
Mar 16 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
微信小程序修改checkbox的样式代码实例
Jan 21 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
Apr 30 #Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
Apr 29 #Javascript
匹配任意字符的正则表达式写法
Apr 29 #Javascript
jquery ajax提交表单数据的两种实现方法
Apr 29 #Javascript
jQuery 动画弹出窗体支持多种展现方式
Apr 29 #Javascript
jQuery 工具函数学习资料
Apr 29 #Javascript
IE JS无提示关闭窗口不提示的方法
Apr 29 #Javascript
You might like
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
css样式标签和js语法属性区别
2013/11/06 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
python paramiko实现ssh远程访问的方法
2013/12/03 Python
python机器学习之神经网络(三)
2017/12/20 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Django实现发送邮件功能
2019/07/18 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
python中字符串的编码与解码详析
2020/12/03 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
你所在的项目是如何确定版本号的
2015/12/28 面试题
抽样调查项目计划书
2014/04/24 职场文书
就业协议书
2014/09/12 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
民主生活会汇报材料
2014/12/15 职场文书
销售人员管理制度
2015/08/06 职场文书