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 相关文章推荐
Javascript之this关键字深入解析
Nov 12 Javascript
浅析用prototype定义自己的方法
Nov 14 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
JS实现的打字机效果完整实例
Jun 20 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
JS基于正则表达式实现的密码强度验证功能示例
Sep 21 Javascript
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
jquery radio 动态控制选中失效问题的解决方法
Feb 28 jQuery
AngularJS 监听变量变化的实现方法
Oct 09 Javascript
layui数据表格重载实现往后台传参
Nov 15 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 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
php4的session功能评述(一)
2006/10/09 PHP
apache+php+mysql安装配置方法小结
2010/08/01 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
php输入流php://input使用浅析
2014/09/02 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
node跨域请求方法小结
2017/08/25 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
Windows环境下python环境安装使用图文教程
2018/03/13 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
Python socket聊天脚本代码实例
2020/01/02 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
入党后的感想
2015/08/10 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
mysql配置SSL证书登录的实现
2021/09/04 MySQL