这是"destructuring assignment"的一个方面还是别的什么?



由于可能不相关的原因,我在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的第一个字符(。一些简短的实验表明,bibble993的值似乎完全是任意的(甚至可以省略:{}[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;

  1. 块的开始
  2. 标签";气泡
  3. 编号993
  4. 块的末尾
  5. 重组";阵列";propertyValue,因此分配了propertyValue[0](即字符串中的第一个字符(

最新更新