zoukankan      html  css  js  c++  java
  • js 判断是否为数组的方式 及 类数组转换成数组格式

    1. 判断是否为数组的通用方式

    Object.prototype.toString.call(o)=='[object Array]'

    其他方式: typeof ,  instanceof,  ary.__proto__.constructor==Array  || ary.constructor==Array  

    typeof 不能判断出Array对象,基本类型能准确判断,

    后面两种方式,如果没有iframe的话后面两种判断没有问题,但是如果设计frame框架的话就有问题了。

    instanceof 和constructor 判断的变量,必须在当前页面声明,比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个ary,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false;

    原因:

    1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。

    2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!

    这种解释有待商榷。

    2. 将类数组转换成数组

    类数组目前知道的有两种,一种是arguments对象(函数参数),一种是NodeList对象,它们都有相同的特点,都可以通过中括号获取属性,并且都有length属性,但是不能使用Array的方法, 转换方法是:

    var newA = Array.prototype.slice.call(obj, 0);

    但是IE8及更早版本对NodeList不支持,IE8及更早版本将NodeList对象实现为COM对象,而我们不能像使用js对象那样使用这种对象,因此会导致错误,要想在IE中将NodeList转换为数组,必须手动枚举所有成员,兼容方式:

    function convertToArray(nodes){

      var array = null;

      try{

        array = Array.prototype.slice.call(nodes, 0);

      }catch(ex){

        array = new Array();

        for(var i = 0; i < nodes.length; i++){

          array.push(nodes[i]);

        }

      }

    }

    前面提到过HTMLCollection 对象,它和NodeList很类似,也可以通过上述方法转换成Array对象,并拥有Array的方法。

    var d = document.getElementsByTagName('div');

    var arr = Array.prototype.slice.call(d,0);

    转化后arr和d就没有关系了,d是动态的,页面中再动态添加div,d的长度会增加,而arr的长度不变。

  • 相关阅读:
    How to build Linux system from kernel to UI layer
    Writing USB driver for Android
    Xposed Framework for Android 8.x Oreo is released (in beta)
    Linux Smartphone Operating Systems You Can Install Today
    Librem 5 Leads New Wave of Open Source Mobile Linux Contenders
    GUADEC: porting GNOME to Android
    Librem 5 – A Security and Privacy Focused Phone
    GNOME and KDE Join Librem 5 Linux Smartphone Party
    Purism计划推出安全开源的Linux Librem 5智能手机
    国产系统之殇:你知道的这些系统都是国外的
  • 原文地址:https://www.cnblogs.com/wenwenli/p/arguments_NodeList_HTMLCollection.html
Copyright © 2011-2022 走看看