本节书摘来自异步社区《JavaScript框架设计》一书中的第1章,第1.3节,作者:司徒正美 更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.3 数组化

浏览器下存在许多类数组对象,如function内的arguments,通过document.forms、form. elements、doucment.links、select.options、document.getElementsByName、document.getElementsBy TagName、childNodes、children等方式获取的节点集合(HTMLCollection、NodeList),或依照某些特殊写法的自定义对象。

var arrayLike = {0: "a",1: "1",2: "2",length: 3
}

类数组对象是一个很好的存储结构,不过功能太弱了,为了享受纯数组的那些便捷方法,我们在处理它们前都会做一下转换。

通常来说,只要[].slice.call就能转换了,但旧版本IE下的HTMLCollection、NodeList不是Object的子类,采用如上方法将导致 IE 执行异常。我们看一下各大库怎么处理的。

//jQuery的makeArray
var makeArray = function(array) {var ret = [];if (array != null) {var i = array.length;// The window, strings (and functions) also have 'length'if (i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval)ret[0] = array;elsewhile (i)ret[--i] = array[i];}return ret;
}

jQuery对象是用来储存与处理dom元素的,它主要依赖于setArray方法来设置和维护长度与索引,而setArray的参数要求是一个数组,因此makeArray的地位非常重要。这方法保证就算没有参数也要返回一个空数组。

Prototype.js的$A方法:

function $A(iterable) {if (!iterable)return [];if (iterable.toArray)return iterable.toArray();var length = iterable.length || 0, results = new Array(length);while (length--)results[length] = iterable[length];return results;
};

mootools的$A方法:

function $A(iterable) {if (iterable.item) {var l = iterable.length, array = new Array(l);while (l--)array[l] = iterable[l];return array;}return Array.prototype.slice.call(iterable);
};

Ext的toArray方法:

var toArray = function() {returnisIE ?function(a, i, j, res) {res = [];Ext.each(a, function(v) {res.push(v);});return res.slice(i || 0, j || res.length);} :function(a, i, j) {return Array.prototype.slice.call(a, i || 0, j || a.length);}
}()
Ex
t```
的设计比较巧妙,功能也比较强大。它一开始就自动执行自身,以后就不用判定浏览器了。它还有两个可选参数,对生成的纯数组进行操作。dojo的_toArray和Ext一样,后面两个参数是可选的,只不过第二个是偏移量,最后一个是已有的数组,用于把新生的新组元素合并过去。

(function() {

var efficient = function(obj, offset, startWith) {return (startWith || []).concat(Array.prototype.slice.call(obj, offset || 0));
};
var slow = function(obj, offset, startWith) {var arr = startWith || [];for (var x = offset || 0; x > obj.length; x++) {arr.push(obj[x]);}returnarr;
};
dojo._toArray =dojo.isIE ? function(obj) {return ((obj.item) ? slow : efficient).apply(this, arguments);
} :efficient;

})();

最后是mass的实现,与dojo一样,一开始就进行区分,W3C方直接[].slice.call,IE自己手动实现一个slice方法。

$.slice = window.dispatchEvent ? function(nodes, start, end) {

return [].slice.call(nodes, start, end);

} : function(nodes, start, end) {

var ret = [],n = nodes.length;
if (end === void 0 || typeof end === "number" && isFinite(end)) {start = parseInt(start, 10) || 0;end = end == void 0 ? n : parseInt(end, 10);if (start < 0) {start += n;}if (end > n) {end = n;}if (end < 0) {end += n;}for (var i = start; i < end; ++i) {ret[i - start] = nodes[i];}
}
return ret;

}

《JavaScript框架设计》——1.3 数组化相关推荐

  1. 《JavaScript框架设计(第2版)》之语言模块

    本文摘自:人民邮电出版社异步图书<JavaScript框架设计(第2版)> 试读本书:http://www.epubit.com.cn/book/details/4849 敲重点: 活动规 ...

  2. javascript框架设计之种子模块

    javascript框架设计之种子模块 本文给大家介绍的是司徒正美的javascript框架设计的第二章种子模块的相关内容,算是一个小小的读后感,小伙伴们可以参考下. 种子模块也叫核心模块,是框架中最 ...

  3. 第一章 : javaScript框架分类及主要功能

      从内部架构和理念划分,目前JavaScript框架可以划分为5类. 第一种是以命名空间为导向的类库或框架,如果创建一个数组用new Array(),生成一个对象用new Object(),完全的j ...

  4. JavaScript 框架之战结束:React 是最终赢家?

    编译 | 张仕影 出品 | CSDN(ID:CSDNnews) 框架之间的论战一直以来都是 JavaScript 社区的热门话题,也是业内的圣战之一.从刚开始的 jQuery,到后来的 Angular ...

  5. 打造属于自己的underscore系列 ( 一 ) - 框架设计

    underscore作为开发中比较常用的一个javascript工具库,提供了一套丰富的函数式编程功能,该库并没有拓展原有的javascript原生对象,而是在自定义的_对象上,提供了100多个方法函 ...

  6. 从零开始写JavaScript框架

    有一定Web前端开发经验的人,很多都会有这么个想法:那些写框架的人好厉害,什么时候我才能写一个自己的框架呢?有时候看看别人的框架代码,又觉得很复杂,不知道从何看起,只有很少的人突破了这个界限,领悟到了 ...

  7. javascript框架库_2019年使用的最佳JavaScript框架,库和工具

    javascript框架库 似乎有比开发人员更多JavaScript框架,库和工具. 在2018年底, 在GitHub上的快速搜索显示230万个JavaScript项目. npm已成为全球最大的模块系 ...

  8. JavaScript 框架比较

    显著增强 JavaScript 开发的框架概览 Joe Lennon, 软件开发人员, 自由职业者 简介: 现代 Web 站点和 Web 应用程序倾向于依赖大量客户端 JavaScript 来提供丰富 ...

  9. 【JavaScript框架封装】公共框架的封装

    版权声明:本文为博主原创文章,未经博主允许不得转载.更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/ ...

最新文章

  1. 如果再写for循环,我就锤自己!
  2. java单链表输出_数据结构基础------1.线性表之单链表的创建与输出方法(Java版)...
  3. html javascript 引号
  4. JavaWeb学习总结(三):Tomcat服务器学习和使用(二)
  5. HDU 1850 Being a Good Boy in Spring Festival
  6. DIoU Loss论文阅读
  7. xftp6无法使用处理
  8. 一种基于加权处理的无线传感器网络平均跳距离估计算法(W-DVHop)
  9. 装备制造新亮点 机器人红利时代到来
  10. java web 部署_一步一步将java web项目部署到云服务器
  11. 计算机技术和信息技术结合,浅谈通信技术与计算机技术融合发展
  12. 组策略 计算机配置 安全设置,使用组策略配置 Windows 防火墙设置
  13. mysql.sock.lock的作用_mysql.sock的作用
  14. 安卓sqlite的使用
  15. Three.js 学习历程与总结
  16. JPEG算法解密 JPEG原理详解 (转载 by jinchao)
  17. 【Linux操作系统】基础概念和常用指令(一)
  18. 6月2亚欧盘黄金走势分析交易策略小心空头反击高位谨慎追多
  19. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(七)之LayIM与MVC数据交互实现单聊和群聊
  20. 一、logo载入界面

热门文章

  1. android omx,android OMX相关4:编码输入线程和输出线程
  2. 导入python库linux_Linux下Python安装PyMySQL成功,但无法导入的问题
  3. vscode创建工作区_区领导调研工业区高楼村乡村振兴示范村创建工作!
  4. matlab在命令行注册,命令行运行matlab
  5. 如何在Python中调用Windows的cmd命令?
  6. 不同分辨率下Apriltag识别精度测试
  7. 安装 Arduino IDE 中STM32 软件包,ESP8266软件包
  8. 2021年春季学期-信号与系统-第十次作业参考答案-第二小题
  9. 实验台通用继电器接口
  10. 新版信标的信号板调试