【问题标题】:Change array size by just adding element and no push javascript通过仅添加元素而不推送 javascript 来更改数组大小
【发布时间】:2015-11-24 20:48:44
【问题描述】:

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

然而,今天我在 angularJS 中看到了一段代码,它做了这样的事情:

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

doSmth();

function doSmth() {
   service.pages[1] = "abc";
   service.pages[5] = "def";
}

我在浏览器上运行调试器,发现在调用doSmth()之前,pages[1]是未定义的,但之后,pages[1]被赋值,没有任何错误。

这怎么可能?

【问题讨论】:

  • 因为页面已经在 pages: [] 中初始化。如果没有 pages:[],您会看到未定义的错误。
  • 将值分配给等于或超过数组长度的索引将调整其大小以适应。
  • 您期望什么行为?记住function doSmth 被提升了
  • 您总是可以在数组的任何索引处添加一个元素,它会“调整大小”(只要长度看起来是最大索引 + 1)以适应。 push 函数只是为了方便给myarray[myarray.length]添加一个元素
  • @PTN:Javascript 中没有 OutOfBounds。

标签: javascript angularjs


【解决方案1】:

这正是 JavaScript 所允许的魔法。如果您来自 Java 或 C 之类的语言,这似乎是一个奇怪的想法,但您可以随时设置数组中任何索引的值,数组将扩展为该大小!

考虑:

var t = [];
t.length === 0;
t[10000] = 'value';
t.length === 10001;

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 === [];

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

【讨论】:

  • 注意:数组可能实际上不会扩展。它的行为就像它一样,但在内部,取决于实现,它很可能实际上没有分配任何额外的空间。
  • 所有这些都在规范ecma-international.org/ecma-262/5.1/#sec-15.4.5.1中正式描述
【解决方案2】:

JavaScript 中的数组只是一个具有一些特殊属性的对象。本质上,它们只是具有正整数属性名称的对象。还有一些其他关键区别,但我们的想法是您可以这样做:

var obj = { };
obj['1'] = 'abc';

所以你可以对数组做同样的事情。

但是!你不应该。现代 JavaScript 引擎通常通过使用快速的本地实现来支持数组来优化数组。通过设置当前未分配的索引会将您的代码反优化为更像对象的东西,这会慢得多。

【讨论】:

  • 但这不是正在发生的事情
  • var obj = { };
  • @CodeiSir:以什么方式?
  • @minitech 看到我的回答,它不是同一个命名空间
  • @tanjir,我明白,数组只是专门的 JS 对象。我展示了如何在对象上设置任何属性的基本方法。我最喜欢 Brennan 解释额外的魔法。
【解决方案3】:

function doSmth() 中的页面与service 中的页面不在同一个命名空间中,即service.pages

您的pages[1] 必须是在其他地方声明的全局变量。

但是,您将 pages 初始化为一个空(但存在)数组:pages: [],

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

doSmth();

function doSmth() {
    pages[1] = "abc";
    pages[5] = "def";
}

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多