jab*_*tta 5 javascript properties object accessor identifier
究竟什么是Javascript中有效的属性名称?各种财产分配方法有何不同?属性名称如何影响属性访问?
我原来的问题(见下文)的答案有助于澄清一些事情,但也开辟了一堆新的蠕虫.既然我已经有机会对JavaScript更加熟悉了,我相信我已经能够解决很多问题了.
由于我很难将这些信息合并到一个解释中,我认为扩展我的原始问题可能会有所帮助,并尝试回答它.
最初,MDN JavaScript指南(对象文字)存在一些混淆.具体来说,我想知道为什么他们声称如果属性名称不是有效的JavaScript标识符,那么它必须用引号括起来.然而,他们提供了示例代码,表明可以使用数字7 - 没有引号 - 作为属性名称.
事实证明,指南只是忽略了一个重要部分,Pointy对其进行了更新(粗体更改):
如果属性名称不是有效的JavaScript标识符或数字,则必须用引号括起来.
我还想知道为什么允许属性名称偏离适用于标识符的"可能不以数字开头"规则.这个问题实际上揭示了我对属性名称的完全误解,并且是导致我做更多研究的原因.
对象属性名称可以是任何有效的标识符、数字文字或字符串文字(包括空字符串)。
\n\n话虽如此,关于 JavaScript 属性名称,需要记住一些可能令人困惑的复杂问题,如下所述。
\n\n除非您使用有效(非负整数)数组索引,否则最好将所有数字属性名称显式分配为字符串。
\n\n看起来像负数的实际上是表达式 \xe2\x80\x94 ,属性名称不支持该表达式。
\n\n// SyntaxError\nconst obj = { -12: \'nope\' };\nRun Code Online (Sandbox Code Playgroud)\n\n幸运的是,括号符号可以为我们处理表达式。
\n\n// Successful property assignment.\nconst obj = {};\nobj[-12] = \'yup\';\nRun Code Online (Sandbox Code Playgroud)\n\n所有属性名称在存储之前都会被类型转换为字符串。
\n\nconst obj = {\n 12: \'12\'\n};\n\nconsole.log(typeof Object.keys(obj)[0]); // -> string\nRun Code Online (Sandbox Code Playgroud)\n\n但即使在类型转换发生之前,键也会根据所使用的语法进行解析,并转换为十进制文字。
\n\nconst 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |