我们知道函数里面的参数实际上是一个以数组形式储存的对象 但它并非一个数组
如果我们要将它转换为数组可以调用Array.prototype.slice() 这个方法
分析一下这个方法:
Array.prototype:Array其实一个类名,但是调用类里面的方法只能够通过类的实例对象调用所以这里用了 Array.prototype 通过它自身的原型对象调用
其次是slice():这个是Array类里面的一个方法功能是截取数组里面的某一部分内容,它接收两个参数slice('数组下标起始位置','数组下标结束位置')
call()方法:把某一方法放到另外一个执行环境里面执行,此方法也是有两个参数call('执行环境','为调用的方法传参(可忽略)')
好了再看看实例:
function convertToArray(nodes){ var arr = null; //兼容ie try{ arr = Array.prototype.slice.call(nodes,0); //因为 slice是 array类的方法 //而传进来的参数是一个 DOM对象的数组 //所以通过call 方法把 array类的方法放到这个对象里面执行 //call 的第二个参数是表示向被调用的方法传进参数 //这里的0 表示从index为0的地方开始 }catch(ex){ arr = new Array(); for (var i = 0; i < nodes.length; i++) { arr.push(nodes[i]); } } return arr; }
这是高程里面的一个例子:通过一个函数传进一个childNodes的实例对象,然后将这个子元素模型的对象转换成数组
childNodes属性都包含一个NodeList对象,NodeList是一种类数组对象保存一组有序节点,可以通过位置访问这些节点元素
为了兼容ie<9 子类是以COM对象来的我们不能像使用JScript对象那样使用这种对象,所以在catch里面我们通过for遍历childNodes 属性里面的 NodeList对象 并实例化一个array 保存这些遍历出来的节点元素