【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解

 我们知道函数里面的参数实际上是一个以数组形式储存的对象 但它并非一个数组

 如果我们要将它转换为数组可以调用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 保存这些遍历出来的节点元素