只需添加元素即可更改数组大小,无需推送javascript

PTN*_*PTN 6 javascript angularjs

我知道改变数组大小的通用方法是使用.push().

但是,今天我在angularJS中看到了一段代码:

var service = {
   pages: [],
   doSmth: doSmth
};

doSmth();

function doSmth() {
   service.pages[1] = "abc";
   service.pages[5] = "def";
}
Run Code Online (Sandbox Code Playgroud)

我在浏览器上运行调试器,发现在doSmth()调用之前,pages[1]未定义,但在此之后,pages[1]分配值没有任何错误.

这怎么可能?

Bre*_*nan 14

这只是JavaScript允许的魔力.如果你来自Java或C这样的语言,这可能看起来像一个奇怪的想法,但你可以随时设置数组中任何索引的值,并且数组将扩展到那个大小!

考虑:

var t = [];
t.length === 0;
t[10000] = 'value';
t.length === 10001;
Run Code Online (Sandbox Code Playgroud)

JavaScript只是在幕后处理这个问题.值得一提的是,这种行为并非特定于JavaScript.在其他解释语言中也可以看到这一点.例如,Ruby允许您执行相同的操作.

另外在JavaScript中,length是数组的可写属性,因此您可以轻松截断或清除整个数组:

var t = [1];
t[4] = 0;
t === [1, undefined, undefined, undefined, 0];
t.length = 2;
t === [1, undefined];
t.length = 0;
t === [];
Run Code Online (Sandbox Code Playgroud)

将长度设置为0是清除阵列的最快速和最简单的方法之一.它可能不是最直观的解决方案,但它是我的首选.

  • 注意:数组可能不会*实际*展开.它的行为就像它一样,但在内部,取决于实现,它可能实际上没有分配任何额外的空间. (3认同)
  • 规范http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.5.1正式描述了所有这些内容 (2认同)