视频实际上说它使用破坏性赋值和标签.
此代码在Edge以外的浏览器中似乎不起作用;因此,要在其他浏览器中工作,它需要如下所示:
let:{let{let:[x=1]}=[警报(1)]}
为什么?让我们看看Firefox的控制台:
语法错误:词汇声明不能出现在单语句上下文中
错误所指的“单语句上下文”是后面的部分让:
开始时-让{let:[x=1]}=[警报(1)]
。在这种情况下让
在它成为标签。没有其他关键字可用作标签:
var:while(false);//=>语法错误:缺少变量名for:while(false);//=>语法错误:缺少(的后面
然而,其中一些方法有效:
产量:while(false);异步:while(false);等待:while(false);
在严格模式然而,让
和产量
也会失败语法错误:
[关键词] 是保留的标识符
.
现在,代码的其余部分使用了析构化:
出租{设:[x=1]} = [警报(1)];
这个让
在内部{
}
只是表示一个对象属性,这完全可以。以下是有效的JS:
let对象={让:2,变量:1,警察:“你好”,while:true,throw:错误};
警报(1)
执行,因此您可以看到警报。它的计算结果为未定义
,所以您有:
设{let:[x=1]}=[未定义];
现在,这是为了获得让
的属性[未定义]
,它本身就是未定义
此外,此行试图获取该属性的值,并将其进一步分解为变量名的数组(因此该值必须是可迭代对象)x个
对于其第一个元素,使用默认值1
.自[未定义].let
是未定义
,它不能被破坏,因此代码抛出错误:
TypeError:[…].let未定义
工作破坏可能看起来像这样:
让{let:[x=1]}={let:[警报(1)]};//x现在是1(默认值,因为右侧的第一个元素未定义)
让{let:[x=1]}={let:[2]};//x现在是2(根据右侧定义)
两者都不会抛出错误,第一个分配1
到x个
,因为右侧数组中的第一个元素是未定义
.
部分混淆可能源于嵌套的析构化,如以下两个片段:
设{a:{b:{c}}={a:}b:{c:3}}
设{a:{b:{c=1}}={a:}b:{c:3}}
这里没有变量一
或b
仅创建了c(c)
,它是标识符不然后是:
在左侧。后跟:
基本上指示任务“在右侧值中查找此属性”.