每天一点点-EXT源码分析之二
2012-01-15 22:07
381 查看
function(a, i, j, res){ res = []; Ext.each(a, function(v) { res.push(v); }); return res.slice(i || 0, j || res.length); } :
下面看看这个闭包里到底有什么东西。
isIterable = function(v){ //check for array or arguments if(Ext.isArray(v) || v.callee){ return true; } //check for node list type if(/NodeList|HTMLCollection/.test(toString.call(v))){ return true; } //NodeList has an item and length property //IXMLDOMNodeList has nextNode method, needs to be checked first. return ((v.nextNode || v.item) && Ext.isNumber(v.length)); },
这个函数是判断传入的参数是否可以迭代,其实就是判断它是不是个数组和类数组。
这里涉及到一个js非常有趣的地方,就是类数组
什么是类数组?
类数组是像数组的对象。
也许就如js是鸭子类型那样,我理解的类数组,就是具有了可以像数组一样那样操作的基础,但它并不是数组或者其子类
就如上面注释那样,arguments,NodeList(node.clidenNodes返回值),HTMLCollection都是比较常见的类数组。
如下面代码(测试代码,与EXT无关)
(function test(){ f={ length:"f" }; f=Array.prototype.slice.call(f); alert(f instanceof Array);//true })();
网上很多资料都说,只要有对象有length属性,可以用下面这个小技巧将对象转换为真正的数组,call真的太灵活了
Array.prototype.slice.call(f)
但是,我实验,在标准的游览器中,length属性甚至都是不需要的,只要是对象(基本类型不行),就可以转为数组,
而在IE,没有length属性,会报错。
求人解释。
EXT也有自己转换数组的方法,这个函数比较有意思,它会立即执行,判断游览器,返回其闭包:
toArray : function(){
return isIE ?
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);
}
}(),
值得注意的是,DOM。
IE并实现DOM的方式比较特殊,是COM模型,,所以比较遗憾,并不能用
Array.prototype.slice.call(a, i || 0, j || a.length)把NodeList转换为数组。
所以对于IE采用这种方式。
function(a, i, j, res){
res = [];
Ext.each(a, function(v) {
res.push(v);
});
return res.slice(i || 0, j || res.length);
} :
相关文章推荐
- 每天一点点-EXT源码分析六
- 每天一点点-EXT源码分析之四
- 每天一点点-ext源码分析之七
- 每天一点点-EXT源码分析之五
- 每天一点点-EXTJS源码分析
- [置顶] 自己动手写CSDN博客提取器源码分析之二:处理网页保存为doc文件
- 类路径分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- extjs源码分析-007(Ext.each)
- STL源码分析之二—迭代器
- LoaderManager源码分析之二
- bt客户端源码分析之二: Storage 类
- 自己动手写CSDN博客提取器源码分析之二:处理网页保存为doc文件
- 每天进步一点点------FPGA 静态时序分析模型——reg2reg
- 每天进步一点点------时序分析基础与时钟约束实例(四)IO口时序(Input Delay /output Delay)
- mahout源码分析之Decision Forest 三部曲之二BuildForest(1)
- Cocos2d-x 实例源码分析之二 小实例的主框架
- 谈谈MySQL死锁之二 死锁检测和处理源码分析
- nhibernate源码分析之二: 会话工厂
- 分布式搜索Elasticsearch源码分析之二------索引过程源码概要分析
- libevent2源码分析之二:初始化流程