Javascript 这是否“的一个方面?”;“解构赋值”;还是别的什么?
出于可能不相关的原因,我在节点v10.16.0中试用了一些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
让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
propertyValue
以便分配propertyValue[0]
(即字符串中的第一个字符){
bubble:
993
}
[propertyName]=propertyValue;
i、 e
propertyValue
以便分配propertyValue[0]
(即字符串中的第一个字符)当有人指出这一点时,它是如此明显。。。我没有考虑将字符串重新构造为字符。当有人指出它时,这是很明显的。。。我没有考虑将字符串重新构造为字符。