JavaScript 中的有效属性名称、属性分配和访问

2023-11-25

更新的问题

到底什么才是 Javascript 中有效的属性名称?各种财产分配方式有何不同?属性名称如何影响属性访问?

Note

我最初问题的答案(见下文)有助于澄清一些事情,但也带来了新的麻烦。现在我有机会更加熟悉 JavaScript,我believe我已经弄清楚了很多。

由于我很难将这些信息合并为一个解释,因此我认为扩展我原来的问题并尝试回答它可能会有所帮助。

原始问题

原本,大家都有些困惑MDN JavaScript 指南(对象文字)。具体来说,我想知道为什么他们声称如果属性名称不是有效的 JavaScript 标识符,则必须将其括在引号中。然而,他们提供了示例代码,显示数字 7 可以(不带引号)用作属性名称。

事实证明,该指南只是遗漏了一个重要部分,并且Pointy更新了它(更改以粗体显示):

如果属性名称不是有效的 JavaScript 标识符或号码,它必须用引号引起来。

我还想知道为什么属性名称被允许偏离适用于标识符的“不能以数字开头”规则。这个问题实际上揭示了我对属性名称的完全误解,也是促使我做更多研究的原因。


回答第一个问题:

是的,MDN 指南中给出的声明并不是 100% 准确,但在您的日常工作中最好遵循它作为规则。您确实不需要创建数字属性名称。

回答第二个问题:

属性名称不能以数字开头,但名称中不含任何其他字符的数字属性名称就可以。

存在此异常的原因是名称编号相同的属性indexes.

让我们试试这个:

var obj = {7: "abc"};
obj[7]; // works fine
obj.7; // gives an error (SyntaxError)

现在尝试打电话Array.push放在物体上并观察会发生什么:

Array.prototype.push.call(obj, "xyz");
console.log(obj);
console.log(obj[0]);

// Prints
Object {0: "xyz", 7: "abc", length: 1}
"xyz"

您可以看到很少有新属性(一个名称为0另一个有名字的length) 已添加到对象中。此外,您可以将该对象用作数组:

var obj = { "0": "abc", "1": "xyz", length: 2 };

Array.prototype.pop.call(obj); // Returns: "xyz"
Array.prototype.pop.call(obj); // Returns: "abc"

您可以在对象上使用数组的方法,这称为Duck Typing.

数组只不过是具有一些预定义方法的对象。

From MDN:

数组元素是对象属性,就像 length 是属性一样,但尝试使用点表示法访问数组元素会引发语法错误,因为属性名称无效。 JavaScript 数组和导致这种情况的属性没有什么特别的。以数字开头的 JavaScript 属性不能用点表示法引用,必须使用方括号表示法访问。

现在您可以理解为什么属性名称的数字是有效的。这些被称为索引,它们在 JavaScript 数组中使用。由于 JavaScript 需要与其他语言保持一致,因此数字对于索引/属性名称是有效的。

希望这能够清楚地说明这一点。

以下是一些有趣的文章:

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

JavaScript 中的有效属性名称、属性分配和访问 的相关文章

  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • Android 设备上的 PhoneGap 蓝牙插件

    我一直在尝试让 PhoneGap 工作的蓝牙插件 但我似乎不知道哪里出了问题 首先 我的测试设备是 Galaxy S3 GT 19305T 应用程序是使用PhoneGap CLI http docs phonegap com en 3 0
  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐