JavaScript中的有效属性名称,属性赋值和访问权限

jab*_*tta 5 javascript properties object accessor identifier

更新的问题

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

注意

我原来的问题(见下文)的答案有助于澄清一些事情,但也开辟了一堆新的蠕虫.既然我已经有机会对JavaScript更加熟悉了,我相信我已经能够解决很多问题了.

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

原始问题

最初,MDN JavaScript指南(对象文字)存在一些混淆.具体来说,我想知道为什么他们声称如果属性名称不是有效的JavaScript标识符,那么它必须用引号括起来.然而,他们提供了示例代码,表明可以使用数字7 - 没有引号 - 作为属性名称.

事实证明,指南只是忽略了一个重要部分,Pointy对其进行了更新(粗体更改):

如果属性名称不是有效的JavaScript标识符或数字,则必须用引号括起来.

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

jab*_*tta 2

简答

\n\n

对象属性名称可以是任何有效的标识符数字文字字符串文字(包括空字符串)。

\n\n

话虽如此,关于 JavaScript 属性名称,需要记住一些可能令人困惑的复杂问题,如下所述。

\n\n

除非您使用有效(非负整数)数组索引,否则最好将所有数字属性名称显式分配为字符串。

\n\n

负数

\n\n

看起来像负数的实际上是表达式 \xe2\x80\x94 ,属性名称不支持该表达式。

\n\n
// SyntaxError\nconst obj = { -12: \'nope\' };\n
Run Code Online (Sandbox Code Playgroud)\n\n

幸运的是,括号符号可以为我们处理表达式。

\n\n
// Successful property assignment.\nconst obj = {};\nobj[-12] = \'yup\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

类型转换

\n\n

所有属性名称在存储之前都会被类型转换为字符串。

\n\n
const obj = {\n  12: \'12\'\n};\n\nconsole.log(typeof Object.keys(obj)[0]); // -> string\n
Run Code Online (Sandbox Code Playgroud)\n\n

解析

\n\n

但即使在类型转换发生之前,键也会根据所使用的语法进行解析,并转换为十进制文字。

\n\n
const obj = {\n  // Valid string literal\n  \'022\': \'022\',\n\n  // Interpreted as decimal\n  6: \'6\',\n\n  // Interpreted as floating-point\n  .345: \'0.345\',\n\n  // Interpreted as floating-point\n  1.000: \'1\',\n\n  // Interpreted as floating-point\n  8.9890: \'8.989\',\n\n  // Interpreted as decimal\n  000888: \'888\',\n\n  // Interpreted as octal\n  0777: \'511\',\n\n  // Interpreted as hexadecimal\n  0x00111: \'273\',\n\n  // Interpreted as binary\n  0b0011: \'3\',\n};\n\n\n/* Quoted property name */\nconsole.log(obj[\'022\']); // "022"; as expected\nconsole.log(obj[022]); // undefined; 022 is an octal literal that evaluates to 18 before our lookup ever occurs\n\n/* Valid (non-negative integer) array index */\nconsole.log(obj[6]); // "6"; as expected\nconsole.log(obj[\'6\']); // "6"; as expected\n\n/* Non-valid array index */\nconsole.log(obj[0x00111]); // "273"; we\'re accessing the property name as it was assigned (before it was parsed and typecasted)\nconsole.log(obj[\'0x00111\']); // undefined; after parsing and typecasting, our property name seems to have disappeared\nconsole.log(obj[\'273\']); // "273"; there it is, we found it using the evaluation of our original assignment\n
Run Code Online (Sandbox Code Playgroud)\n