为什么删除项目时Javascript中的数组大小不调整?

svb*_*net 6 javascript arrays

在许多语言中,删除项目后,标准动态列表(非固定大小数组)类型将重新调整大小:

蟒蛇:

myList = ['a', 'b', 'c']
del(myList[0])
print(len(myList)) # Prints '2'
Run Code Online (Sandbox Code Playgroud)

C#:

var myList = new List<string> {"a", "b", "c"};
myList.RemoveAt(0);
Console.WriteLine(myList.Count); // Prints '2'
Run Code Online (Sandbox Code Playgroud)

等等。

但是,在Javascript中,即使元素的计算结果为,列表的长度也保持不变undefined告诉我它与有所不同array[index] = undefined):

Javascript:

var myArray = ['a', 'b', 'c']
delete myArray[0]
console.log(myArray.length) // Prints '3'
console.log(myArray) // Prints "[ , 'b', 'c' ]" in node, '[undefined × 1, "b", "c"]' in Chrome

myArray[0] = undefined
console.log(myArray) // Prints "[ undefined, 'b', 'c' ]" on both node and Chrome

myArray.splice(0, 1)
console.log(myArray) // Prints "['b', 'c']"
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • JS数组的delete行为是设计使然还是出于担心破坏遗留代码而无法解决的疏忽?
  • 替换删除的数组元素的“未定义类”值到底是什么?

T.J*_*der 4

您对deletetoRemoveAt和 such 的比较是不正确的。delete不做他们所做的事;为此,您可以使用splice

\n\n

\r\n
\r\n
var myArray = [\'a\', \'b\', \'c\']\r\nmyArray.splice(0, 1);\r\nconsole.log(myArray.length) // Prints \'2\'
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

delete删除该条目而不重新排序其他条目,从而创建一个稀疏数组(一些条目完全丢失的数组)。delete并不是真正用于数组,而是用于从对象中删除属性;但它适用于数组,因为 JavaScript 中的标准(例如,非类型化)数组根本不是真正的数组*,它们是对某些属性进行特殊处理的对象,例如那些名称为“数组索引”的对象(它们被定义为字符串名称“...其数值i在范围内+0 \xe2\x89\xa4 i < 2^32-1”) 和length

\n\n

length如果您执行以下操作,\ 的值就会更改:

\n\n
    \n
  • 使用任何方法添加或删除条目(splicepush等)。
  • \n
  • 通过分配等于或大于 的索引来添加条目length
  • \n
  • 直接赋值给length:如果增加length,则使数组变得稀疏;如果减少它,则会删除该索引或更高索引处的所有条目。例如,如果您有一个数组[\'a\', \'b\', \'c\', \'d\', \'e\']并执行theArray.length = 3,它将不再有索引 3 ( \'d\') 或 4 ( \'e\') 处的条目。
  • \n
\n\n
\n

JS 数组删除行为是设计使然还是由于担心破坏遗留代码而无法修复的疏忽?

\n
\n\n

通过设计。如上所述,delete主要是从对象中删除属性。

\n\n
\n

替换已删除数组元素的“类似未定义”值到底是什么

\n
\n\n

没有一个。这是标准数组是对象这一事实的另一个副产品:如果您尝试从对象不具有的属性中读取属性的值,则“get”操作的结果就是 value undefined。这并不是说该对象中存在具有undefined类似值的东西,而是该对象中根本不存在具有该名称的属性。此图可能有用:

\n\n

\r\n
\r\n
var o = {}; // A non-array object\r\nconsole.log(o.noSuchProperty);    // undefined\r\nconsole.log(o["noSuchProperty"]); // undefined\r\nconsole.log(o[2]);                // undefined\r\n\r\nvar a = []; // An array object\r\nconsole.log(a.noSuchProperty);    // undefined\r\nconsole.log(a["noSuchProperty"]); // undefined\r\nconsole.log(a[2]);                // undefined
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n


\n\n

* (这是我贫血的小博客上的一篇文章)

\n