zoukankan      html  css  js  c++  java
  • JavaScript:数组能越界?

    https://gist.github.com/4157754,这里看到的.

    var a = [];                                               //定义一个空数组
    a[Math.pow(
    2, 32) - 2] = "最大索引"; //改变length属性,使得a成为一个装满的稀疏数组.数组的最大元素个数为Math.pow(2, 32) - 1个(4294967295),由于数组索引从0开始,所以最大的索引号就是Math.pow(2, 32) - 2 console.log(a.length === Math.pow(2, 32) - 1); //true,a的length已经不能再大了 try { a.push("我比最大索引还大1", "我比最大索引还大2"); //再往里面push元素,铁定抛出异常
    }
    catch (e) { console.log(e instanceof RangeError); // true,数组越界 } console.log(a.length === Math.pow(2, 32) - 1); // true,长度没变,还是4294967295,那元素呢?push进去没有? console.log(a[Math.pow(2, 32) - 1] === "我比最大索引还大1");// true,居然能访问,而且值还存进去了! console.log(a[Math.pow(2, 32)] === "我比最大索引还大2"); // true,这个也是! try { a.push("我比最大索引还大3?"); // 再push一个
    }
    catch (e) { console.log(e instanceof RangeError); // true,仍然报错 } console.log(a[Math.pow(2, 32) + 1]); //undefined,没有存上? console.log(a[Math.pow(2, 32) - 1]) //"我比最大索引还大3?",原来是覆盖了第一个越界的元素 console.log(a[Math.pow(2, 32)]) //"我比最大索引还大2",这个没被覆盖

    JavaScript中的数组就是一个稍微有点特殊的普通对象.在Array.prototype.push方法执行时,会先把每个要push的元素push进去,也就是定义多个自身属性(ES5 15.4.4.7.5).

    然后才设置数组的length属性为最大的索引值+1(ES5 15.4.4.7.5),这个例子中就是Math.pow(2, 32) + 1,这时才会报错(ES5 15.4.5.1.3.d),但上面的元素已经push进去了.

    如果再次push的话,还会从当前的length属性-1的那个索引处开始push,也就出现了覆盖而不是继续追加的情况.

  • 相关阅读:
    HTML有2种路径的写法:绝对路径和相对路径
    ZB本地设置
    java main函数
    java static 关键字
    03013_动态页面技术-JSP
    Oracle数据库的文件以及Oracle体系架构
    记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
    rtmp规范1.0全面指南
    程序员小哥教你秋招拿大厂offer
    ubuntu配置samba解决linux的svn使用舒适问题
  • 原文地址:https://www.cnblogs.com/ziyunfei/p/2793435.html
Copyright © 2011-2022 走看看