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基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
Aug 05 Javascript
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 Javascript
JavaSript中变量的作用域闭包的深入理解
May 12 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
如何使用angularJs
May 08 Javascript
JavaScript生成简单等差数列
Nov 28 Javascript
代码详解Vuejs响应式原理
Dec 20 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
Dec 25 jQuery
js 计算图片内点个数的示例代码
Apr 04 Javascript
vue实现图片裁剪后上传
Dec 16 Vue.js
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
一个显示天气预报的程序
2006/10/09 PHP
php 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
爬山算法简介和Python实现实例
2014/04/26 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
python内置数据类型之列表操作
2018/11/12 Python
Python循环实现n的全排列功能
2019/09/16 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
Django通过json格式收集主机信息
2020/05/29 Python
详解python polyscope库的安装和例程
2020/11/13 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
给护士表扬信
2014/01/19 职场文书
六年级数学教学反思
2014/02/03 职场文书
消防先进事迹材料
2014/02/10 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
科技活动总结范文
2015/05/11 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫