在我正在研究的代码库中,有一行采用以下格式:
const {key1: value1, key2:value2} = name
从左到右的分配是什么? =
不能从右到左工作吗?
答案 0 :(得分:5)
如何重新定义变量
name
?
不是。
从左到右的分配是什么? = =从右到左工作吗?
是的,这就是这里正在发生的事情。那就是destructuring assignment。这一行:
const {key1: value1, key2:value2} = name
等效于此:
const value1 = name.key1;
const value2 = name.key2;
您说的很对,它看起来像是将对象分配给变量,但是相反。那是故意的。当您这样做时:
const x = {a: 1, b: 2};
您正在创建一个对象(将一个结构组合在一起)并将其分配给x
。当您这样做时:
const {a: vara, b: varb} = x;
您正在将右侧的对象解构(拆开结构),将其插入左侧的目标(vara
和varb
)。语法与此相同,相同。两种形式都有速记版本:
const a = 1;
const b = 2;
const x = {a, b};
创建一个具有a
和b
属性的对象(具有a
和b
范围内标识符的值)。这个
const {a, b} = x;
从a
获取b
和x
属性,并使用它来设置常量a
和b
的值。
我应该注意,与解构无关的是let
或const
(或var
)。就像在创建对象时可以使用任何范围内的变量或属性来提供对象属性的值一样,在进行销毁时也可以这样做。由于对象解构始于{
,因此,如果您不在表达式中进行操作,则需要在其前面放置一个(
,这样{
看起来就好像不是{方块:
const x = {a: 1, b: 2};
let a, b;
({a, b} = x);
console.log(a, b); // 1 2
const y = {};
({a: y.ayyy, b: y.beee} = x);
console.log(y); // {ayyy: 1, beee: 2}
标记为***的行引用了什么
name
?最初通过的还是创建的对象?
在该代码中没有创建对象。 (好吧,箭头功能是一个对象,还有一些幕后规范级别的对象,例如词法环境,但是...)
无法说出您标记的行中的name
是什么,因为这是一个语法错误,function
关键字启动了一个从未完成的函数声明。如果用function(name)
来表示someFunction(name)
,那将是传递到箭头函数中的name
。
答案 1 :(得分:1)
如何重新定义变量名? 使用普通的JS语法:let newName = name
从左到右的分配是什么?是不是从右到左工作? 分配从右到左完成。语法是对象分解。 您可以在此处了解有关信息: https://hacks.mozilla.org/2015/05/es6-in-depth-destructuring/
在标记为***的行中引用了什么名称?最初通过的还是创建的对象? 在代码中没有创建新对象。 “名称”是指原始传递的对象。