zoukankan      html  css  js  c++  java
  • 不存在的数组元素

    数组字面量是个神奇东西,试在chrome的控制台打印如下内容:

    >>>[]
    []
    >>>[,]
    []
    >>>[,,]
    []
    

    但这不是真相,我们用火狐的firebug看看:

    >>> []
    []
    >>> [,]
    [undefined]
    >>> [,,]
    [undefined, undefined]
    

    这种显示方式类似其他语言的inspect方法,我们不妨再看看其toString方法:

    >>> [].toString()
    ""
    >>> [,].toString()
    ""
    >>> [,,].toString()
    ","
    

    我们发现最一个逗号总是被省去的,本来应该是两个元素夹半一个逗号,现在[,]里面只有一个元素undefined

    >>>[,].length
    1
    

    我们再用ecma262v5新增的元编程方法,Object.getOwnPropertyDescriptor看看。此方法是用于查看某个对象的某个属性对应的特征描述。

    >>>Object.getOwnPropertyDescriptor([,], 0)
      undefined //由于它基本不存在第一个元素(索引值为0),因此当然没有对应的特征描述
    

    相对应,如果它存在元素,即使其值为undefined

    >>>Object.getOwnPropertyDescriptor([undefined], 0) //chrome 的结果
    Object
       configurable: true
       enumerable: true
       value: undefined
       writable: true
       __proto__: Object
    //=============================================================
    >>> Object.getOwnPropertyDescriptor([undefined], 0) //firebug的结果
    Object { writable=true, enumerable=true, configurable=true}
    

    但当然,上面的都是非常规范与超前的东西,这些东西在IE下可能就行不通了,如[,].length在IE678显示为2!更多怪异的现象见下面这个比较,对于数组的undefined元素不同生成方式,其可遍历性也不一样。

          var a1 = [,,,];
          var a2 = new Array(3);
          var a3 = [undefined,undefined,undefined];
         
          alert(0 in a1);
          alert(0 in a2);
          alert(0 in a3);
    
          //FF4     false false true
          //opera10 false false true
          //chrome  false false true
          //IE6     false false false
          //IE8     false false false
          //IE8     false false false
          //IE9     false false true
          //IE10p   false false true
          //搜狗2.2 false false true
          //360极速 false false true
    
  • 相关阅读:
    OC-KVO简介
    注册审核
    应用权限
    关于函数执行的一点知识
    设置权限
    文件操作实例:文件管理器(网页版)
    文件操作
    正则表达式
    全局变量和递归
    案例:简单留言板
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2046570.html
Copyright © 2011-2022 走看看