由于可能不相关的原因,我在Node v10.16.0中试用了一些JavaScript,发现了一个我无法解释的奇怪效果。测试代码:
let propertyName='Property';
let propertyValue='Value';
console.log('Before');
console.dir(propertyName);
console.dir(propertyValue);
{bibble:993}[propertyName]=propertyValue;
console.log('After');
console.dir(propertyName);
console.dir(propertyValue);
产生以下输出:
Before
'Property'
'Value'
After
'V'
'Value'
如您所见,行{bibble:993}[propertyName]=propertyValue;
将propertyName
的值从Property
更改为V
(或propertyValue
的第一个字符(。一些简短的实验表明,bibble
和993
的值似乎完全是任意的(甚至可以省略:{}[propertyName]=propertyValue
也产生相同的效果(。
如果这是一个";真实的";或";官方的";我不知道它的名字,这使得搜索变得困难。它可能与销毁赋值有关,特别是没有声明的赋值,尽管我看到的行为似乎与那里描述的不匹配。有趣的是,该部分写道:
注意:当使用不带声明的对象文本析构函数赋值时,赋值语句周围的括号
( ... )
是必需的。
{a, b} = {a: 1, b: 2}
不是有效的独立语法,因为左侧的{a, b}
被视为块而不是对象文字。但是,
({a, b} = {a: 1, b: 2})
是有效的,const {a, b} = {a: 1, b: 2}
也是有效的
( ... )
表达式前面需要加一个分号,或者它可以用于执行前一行的函数。
并且,果不其然,如果我将";"冒犯";带有const声明的行:
const x = {bibble:993}[propertyName]=propertyValue;
或者如引用部分所示,将该行括在括号中:
({bibble:993}[propertyName]=propertyValue);
";腐败;不会发生:
...
After
'Property'
'Value'
(但是用const {bibble:993}=...
而不是const x = ...
替换它会产生错误:
[stdin]:6
const {bibble:993}[propertyName]=propertyValue;
^^^
SyntaxError: Unexpected number
at new Script (vm.js:83:7)
at createScript (vm.js:277:10)
at Object.runInThisContext (vm.js:329:10)
at Object.<anonymous> ([stdin]-wrapper:6:22)
at Module._compile (internal/modules/cjs/loader.js:776:30)
at evalScript (internal/bootstrap/node.js:589:27)
at ReadStream.<anonymous> (internal/bootstrap/node.js:323:15)
at ReadStream.emit (events.js:203:15)
at endReadableNT (_stream_readable.js:1129:12)
at process._tickCallback (internal/process/next_tick.js:63:19)
这似乎是有道理的,因为去结构赋值语法只包括属性名,而不包括它们的值(。
这真的只是为了满足我的好奇心,但有人能解释为什么第一种形式会改变propertyName
的值吗
{bibble:993}[propertyName]=propertyValue;
等价于:
{
bubble:
993
}
[propertyName]=propertyValue;
即
- 块的开始
- 标签";气泡
- 编号993
- 块的末尾
- 重组";阵列";
propertyValue
,因此分配了propertyValue[0]
(即字符串中的第一个字符(