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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
jQuery 白痴级入门教程
Nov 11 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 Javascript
JavaScript隐式类型转换
Mar 15 Javascript
jQuery根据name属性进行查找的用法分析
Jun 23 Javascript
mpvue跳转页面及注意事项
Aug 03 Javascript
Echarts之悬浮框中的数据排序问题
Nov 08 Javascript
微信小程序修改数组长度的问题的解决
Dec 17 Javascript
JavaScript 语句之常用 for 循环详解
Mar 29 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开发的一些注意点总结
2010/10/12 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
编写Python CGI脚本的教程
2015/06/29 Python
python中的随机函数小结
2018/01/27 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
家长对孩子评语
2014/01/30 职场文书
2014年德育工作总结
2014/11/20 职场文书
高考学习决心书
2015/02/04 职场文书
会计试用期自我评价
2015/03/10 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
介绍信格式样本
2015/05/05 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js
Python 阶乘详解
2021/10/05 Python
python中的random模块和相关函数详解
2022/04/22 Python