Javascript 这是否“的一个方面?”;“解构赋值”;还是别的什么?

Javascript 这是否“的一个方面?”;“解构赋值”;还是别的什么?,javascript,node.js,Javascript,Node.js,出于可能不相关的原因,我在节点v10.16.0中试用了一些JavaScript,发现了一个我无法解释的奇怪效果。测试代码: 让propertyName='Property'; 让propertyValue='Value'; console.log('Before'); console.dir(propertyName); console.dir(propertyValue); {bibble:993}[propertyName]=propertyValue; console.log('After

出于可能不相关的原因,我在节点v10.16.0中试用了一些JavaScript,发现了一个我无法解释的奇怪效果。测试代码:

让propertyName='Property';
让propertyValue='Value';
console.log('Before');
console.dir(propertyName);
console.dir(propertyValue);
{bibble:993}[propertyName]=propertyValue;
console.log('After');
console.dir(propertyName);
console.dir(propertyValue);
生成以下输出:

之前
“财产”
“价值”
之后
“V”
“价值”
如您所见,行
{bibble:993}[propertyName]=propertyValue
propertyName
的值从
Property
更改为
V
(或
propertyValue
的第一个字符是什么)。一些简短的实验表明,
bibble
993
的值似乎完全是任意的(甚至可以省略:
{}[propertyName]=propertyValue
也产生同样的效果)

如果这是一个“真实的”或“官方的”效果(与一个意外的怪癖或甚至是节点的bug相反),我不知道它的名字,这使得搜索很困难。虽然我看到的行为似乎与这里描述的不匹配,但它可能与分解任务有关。有趣的是,该部分说:

注意事项:在使用不带声明的对象文字解构赋值时,需要在赋值语句周围加上括号
(…)

{a,b}={a:1,b:2}
不是有效的独立语法,因为左侧的
{a,b}
被视为块而不是对象文字

但是,
({a,b}={a:1,b:2})
是有效的,就像
常量{a,b}={a:1,b:2}

您的
(…)
表达式前面需要加一个分号,否则它可能用于执行前一行的函数

当然,如果我用const声明替换“冒犯”行:

const x={bibble:993}[propertyName]=propertyValue;
或者按照引用部分的建议,将该行用括号括起来:

({bibble:993}[propertyName]=propertyValue);
“腐败”不会发生:

。。。
之后
“财产”
“价值”
(但是用
const{bibble:993}=…
代替
const x=…
会产生错误:

[stdin]:6
const{bibble:993}[propertyName]=propertyValue;
^^^
SyntaxError:意外数字
在新脚本中(vm.js:83:7)
在createScript上(vm.js:277:10)
在Object.runInThisContext(vm.js:329:10)
at对象。([stdin]-包装器:6:22)
at模块编译(内部/modules/cjs/loader.js:776:30)
在evalScript(internal/bootstrap/node.js:589:27)
在ReadStream上。(内部/bootstrap/node.js:323:15)
在ReadStream.emit(events.js:203:15)
在endReadableNT(_stream_readable.js:1129:12)
在进程中。_tick回调(内部/process/next_tick.js:63:19)
这似乎是有道理的,因为Destructuring赋值语法只包括属性名,而不包括它们的值)

这真的只是为了满足我的好奇心,但是有人能解释为什么第一个表单会改变
propertyName
的值吗

相当于:

{
    bubble:
        993
}

[propertyName]=propertyValue;
i、 e

  • 起跑
  • 标签“气泡”
  • 993号
  • 街区尽头
  • 重新构造“数组”
    propertyValue
    以便分配
    propertyValue[0]
    (即字符串中的第一个字符)
  • 相当于:

    {
        bubble:
            993
    }
    
    [propertyName]=propertyValue;
    
    i、 e

  • 起跑
  • 标签“气泡”
  • 993号
  • 街区尽头
  • 重新构造“数组”
    propertyValue
    以便分配
    propertyValue[0]
    (即字符串中的第一个字符)

  • 当有人指出这一点时,它是如此明显。。。我没有考虑将字符串重新构造为字符。当有人指出它时,这是很明显的。。。我没有考虑将字符串重新构造为字符。