为什么delete会保留Array元素?

2023-12-26

今天我在 Stack Overflow 上偶然发现了一个问题 -如何从 JavaScript 关联数组中删除对象? https://stackoverflow.com/questions/346021。令我震惊的是,所接受的答案既具有误导性,又受到高度赞扬,因此我强调了可能的陷阱。

然而,当我拼凑出正确的答案时,我意识到我不知道why这是有道理的delete保留元素分配undefined而不是移除。

var elements = new Array()
elements.push(NaN)
elements.push(NaN)
elements.push(NaN)
delete elements[1]
console.log("number of elements: ", elements.length)   // returns 3

这背后有什么道理吗?


我意识到我不知道为什么它有意义delete分配未定义而不是删除。

事实并非如此。delete从对象中删除属性,确实如此not将它们设置为undefined。这是一个简单的方法:

var a = ['a', 'b', 'c'];
console.log(1 in a); // logs "true"
delete a[1];
console.log(1 in a); // logs "false"

请注意,之后delete, a没有名为的属性1不再了。完全没有。

对比:

var a = ['a', 'b', 'c'];
console.log(1 in a); // logs "true"
a[1] = undefined;
console.log(1 in a); // logs "true"

There, a还有一个属性叫1,只是该财产的价值是undefined.

理解 JavaScript 中的这一点很有用:数组根本不是真正的数组 http://blog.niftysnippets.org/2011/01/myth-of-arrays.html。它们只是对象,数组“索引”只是属性名称(它们是字符串 - 是的,实际上,我们只是倾向于将它们写为数字),数组对全数字(索引)的属性名称有特殊处理,一个特殊的属性名称。length属性,以及它们从中获得的一些函数Array.prototype。这在第15.4节 http://es5.github.com/#x15.4规格的。一旦你牢牢记住 JavaScript 数组并不是真正的数组,它们就更有意义了。 :-)

从数组中删除数组“索引”属性不会改变其length(即使删除编号最大的那个也不会);它只是在数组中创建了一个洞(JavaScript“数组”本质上是稀疏数组;例如,它们可以有间隙)。因此,在上面的第一个示例中,我得到的数组与执行此操作时得到的数组完全相同:

var a = [];
a[0] = 'a';
a[2] = 'c';

注意间隙,数组没有1元素/属性。

如果你说:

var foo = a[3];

...foo可以得到值undefined出于两个完全不同的原因:

  1. a有一个属性叫做3具有价值的undefined, or:
  2. a没有名为3根本没有;对不具有该名称属性的对象执行属性访问器操作的结果是undefined。这个如果-无-财产-回报-undefined规范以相当复杂的方式涵盖了这些内容,但主要是在第8.12.3节 http://es5.github.com/#x8.12.3.

这些是非常不同的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么delete会保留Array元素? 的相关文章

  • 亚马逊联属网络营销搜索广告脚本:未捕获类型错误:无法读取 null 属性“getBoundingClientRect”

    我在我的网站上嵌入了亚马逊联属原生搜索广告 当我在我的开发笔记本电脑上进行测试时 搜索广告 显示没有任何问题 但是 当部署到托管提供商时 遇到运行时错误并且亚马逊搜索广告未显示 请在这里帮忙 Error Uncaught TypeError
  • JavaScript CSV 验证

    如何检查文本框中的逗号分隔值并在未找到时发出警报 如果有的话 里面应该有字符 比如A B C D function validate validate text box
  • 如何在 React JS 中根据键创建动态表?

    我正在尝试在 React JS 中创建一个动态表组件 该组件当前只有一个静态标头 其中包括最常见的结果键 有些结果还包含更多信息 例如电话号码 学位 如何根据键 值的存在动态地使用附加列扩展表 我应该与state并在存在时使其可见 或者我应
  • 无法将消息发布到服务工作人员,因为控制器值为空

    我正在尝试做一个website https secure depths 31934 herokuapp com 在 Service Worker 的帮助下可以离线使用 以缓存页面所需的文件 我试图让用户控制他希望缓存的图像 为此 我使用一个
  • 在 IE8 中使用 javascript __proto__

    你好 我在 javascript 中有这两个对象 var john firstname John lastname Smith var jane firstname Jane 这样做 jane proto john 我可以访问 Jane 的
  • 如何在 Lambda 中将对象上传到 S3?

    似乎无法将对象上传到 Lambda 中的 S3 本地一切正常 日志中没有错误可以显示出了什么问题 代码如下 console log Loading function var AWS require aws sdk var s3 new AW
  • Mongoose 查询执行后回调函数从未被调用

    以下是我的代码 mongoose connect mongodb localhost mydatabase var db mongoose connection db on error console error bind console
  • 如何从 javascript 错误对象读取错误消息

    有人可以帮我解决以下问题吗 我正在通过 redux 操作进行后调用 如下所示 export const addEmployee firstName surname contactNumber email gt async dispatch
  • 使用非常大的背景位置偏移是否存在性能问题?

    我正在构建一个进度条控件 并且正在研究它实际上并不显示进度 而只是旋转 正在发生某事 的指示器的情况 我的设计基本上是交替的对角条纹 本质上是一个像这样的理发杆 但是 旋转 由于希望将尽可能多的负载转移给渲染引擎 我想为此使用 CSS 过渡
  • JavaScript 可以检测用户的浏览器是否支持 gzip 吗?

    我可以使用 JavaScript 来检测用户的浏览器是否支持 gzip 压缩内容 客户端 而不是 Node js 或类似内容 我正在尝试支持以下边缘情况 有很多可能的文件可以加载到特定的 Web 应用程序上 最好在应用程序运行时根据需要加载
  • jslint 配置 |传递全局变量

    我如何提醒 jshint 我有全局变量 即命名它们 我知道你可以做到这一点 但我不记得语法了 我在这里定义了一个全局的 function window glob1 local var 稍后像这样使用 不同的 IIFE function gl
  • setTimeout范围问题

    我在控制玩家重生的函数内部定义了一个 setTimeout 我正在创建一个游戏 var player death function this alive false Console log death var timer3 setTimeo
  • Angular UI-Router:多个 URL 到单一状态

    我已经开始使用 Angular 的 ui router 并且我正在尝试弄清楚如何让多个 URL 引用单个状态 例如 orgs 12354 overview retyrns the same pages as org overview 我的
  • 在 UIWebView 中禁用复制和粘贴

    几乎 我已经尝试了一切方法来禁用复制 粘贴UIWebView但对我来说没有任何作用 我正在加载我的UIWebView来自字符串 字符串数组 如下所示 webView loadHTMLString NSString stringWithFor
  • 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

    我正在尝试验证字符串以使它们成为有效的网址 我只需要保留 A Z 0 9 并使用以下命令从字符串中删除其他字符javascript or jquery 例如 贝儿餐厅 我需要将其转换为 百丽餐厅 所以字符被删除 只保留 A Z a z 0
  • 在 Chrome 开发者工具中禁用调试器语句

    我正在尝试对恶意 JavaScript 进行逆向工程 当我最初加载侧面时 会注入 JS 代码 其中包括 debugger 语句并将断点注入我的 chrome 开发人员控制台 通过stackoverflow阅读 禁用所有断点does not帮
  • ES6 静态方法引用 self? [复制]

    这个问题在这里已经有答案了 我有两节课 存储库和用户存储库 我想在 Repository 中定义一个静态方法 该方法在运行时调用 UserRepository 中的静态函数 有什么干净的方法可以做到这一点吗 class Repository
  • 如何将项目插入到特定索引处的空数组中?

    我想将一个项目插入到空数组的指定索引中 我看到有 Array prototype splice 方法 但是 如果我在空数组上使用 splice 它只会添加项目来结束数组 如下所示 var a a splice 3 0 item 3 cons
  • 在 Meteor 应用程序中实现 MongoDB 2.4 的全文搜索

    我正在考虑向 Meteor 应用程序添加全文搜索 我知道 MongoDB 现在支持此功能 但我对实现有一些疑问 启用文本搜索功能的最佳方法是什么 textSearchEnabled true 在 Meteor 应用程序中 有没有办法添加索引
  • 使用
    元素作为 JavaScript 代码的输入。这是最好的方法吗?

    各位 显然 我是编码新手 所以最近完成了一些有关 HTML 和 Javascript 的 Lynda 课程后 我的简单 HTML 页面遇到了困难 基本上 我想要的是使用 JavaScript 进行基本计算 让用户使用 HTML 输入两个数字

随机推荐