【问题标题】:Typescript: Length of empty array not zero [duplicate]打字稿:空数组的长度不为零[重复]
【发布时间】:2017-12-30 13:57:57
【问题描述】:

我有一个数组,它有一个元素,我用以下代码删除它:

delete array[0]

此时数组为空。因此,我很困惑为什么array.length 的输出为1

当我使用console.log 时,它会显示以下内容:

我是在做一些根本错误的事情还是如何检查数组是否为空?也许对打字稿数组内存管理的解释会很有用。

【问题讨论】:

  • 阅读Description for delete operator,其内容为... the delete operator has nothing to do with directly freeing memory。因此,在您的情况下,它删除了值,但没有删除数组使用的内存。
  • @jonrsharpe 我已经解释了为什么这不是问题中的重复项
  • 从表面上看也没有任何意义,因为 "TypeScript 数组内存管理" 不是一个东西。 TS编译成JS,记住;运行时没有 TypeScript。
  • 虽然我同意您的问题不是完全重复的,但链接的问题和答案确实提供了一些有趣的见解,感觉他们也回答了您的问题。我试图制定更具体的内容,如果我没有正确理解您的需求,请随时发表评论。

标签: javascript arrays typescript


【解决方案1】:

TL;DR;

如果您预计数组元素会缩小,则不应使用 delete 删除它。

基本上它会删除第一个元素的引用,但不会缩小数组。

元素 [0] 为空 -> 数组显示为 [empty],因为数组中有一个 empty 点!大小仍保留在内存中。而且length属性还是1。

所以,这不是一个空数组,它是一个有一个空点的非空数组

其他例子:

var a = [3, 4];
delete a[0];

a 在我的 JS 控制台结果为 [empty, 4]


我是否在做一些根本错误的事情,或者我如何检查 数组为空?

如果你想检查这样的数组是否只包含emptys,你可以简单地过滤未定义的值:

var a = [3, 4];
delete a[0];
delete a[1];
if (a.filter(x => x !== undefined).length === 0) {
  console.log('array looks empty!');
} else {
  console.log('array doesn't look empty!');
}

(当然,如果你有实际的 undefined 值,这是行不通的,我希望不是这样)


也许对 typescript 数组内存管理的解释是 有用。

这很简单:没有 TypeScript 内存管理。

正如在 cmets 中已经指出的,TypeScript 转向了 Javascript,在运行时它只运行 JavaScript,它是 Javascript 数组,仅此而已。

Typescript 在这里为您做的并没有什么特别之处。这将被逐字转译成javascript。


有关 JS 数组和删除的更多信息,请参阅链接的潜在重复问题以获取详细信息和解释:

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 2018-06-15
    • 2016-07-22
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多