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 相关文章推荐
jquery选择器(常用选择器说明)
Sep 28 Javascript
JS网页播放声音实现代码兼容各种浏览器
Sep 22 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
jQuery表格插件datatables用法总结
Sep 05 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
JS简单测试循环运行时间的方法
Sep 04 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
Dec 26 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
详解在React-Native中持久化redux数据
May 22 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
May 23 jQuery
微信小程序开发实现消息推送
Nov 18 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 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
根据中文裁减字符串函数的php代码
2013/12/03 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
浅谈python多线程和队列管理shell程序
2015/08/04 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
如何理解python对象
2020/06/21 Python
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
超市促销活动方案
2014/03/05 职场文书
战略合作意向书范本
2014/04/01 职场文书
学习经验演讲稿
2014/05/10 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
南京大屠杀观后感
2015/06/02 职场文书
安全生产培训心得体会
2016/01/18 职场文书
工作一年自我鉴定
2019/06/20 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
六年级作文之关于梦
2019/10/22 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python