5

我在看谈JSON劫持不到2分钟,我已经不熟悉JavaScript了。

let:let{let:[x=1]}=[警报(1)]

它似乎在Edge上起作用,只是发出警报1,但我从未遇到过let:let语法。我很好奇,我该怎么读这个?

5
  • 1
    在真正的浏览器中,您可以这样做let:{let{let:[x=1]}=[警报(1)]}如果有帮助,首先是标签,第二个是实际的和第三个是一个属性名(有点像)-嗯,实际上可能不是那么简单-不过,edge的控制台中有错误 评论 2018年4月2日1:51
  • @JaromandaX哦,是的,在代码执行时出现错误之前,我关闭了窗口,但只有在关闭警告对话框时才会出现错误。
    – Ced公司
    评论 2018年4月2日1:58
  • Edge似乎允许为单个语句添加标签,而真正的浏览器却不允许,事实上,这也不是。。。真 的。。。奇怪的东西 评论 2018年4月2日1:59
  • 这在严格模式下不起作用,因为您不能使用作为标签。 评论 2018年4月2日1:59
  • 简短回答标题,在某些浏览器中会发出警报1 评论 2018年4月2日3:18

1答案1

重置为默认值
6

视频实际上说它使用破坏性赋值标签.

此代码在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(根据右侧定义)

两者都不会抛出错误,第一个分配1x个,因为右侧数组中的第一个元素是未定义.


部分混淆可能源于嵌套的析构化,如以下两个片段:

设{a:{b:{c}}={a:}b:{c:3}}
设{a:{b:{c=1}}={a:}b:{c:3}}

这里没有变量b仅创建了c(c),它是标识符然后是:在左侧。后跟:基本上指示任务“在右侧值中查找此属性”.

  • 该死的,我离得很近。该部分:现在,这试图获取[undefined]的let属性从我头顶飞过。虽然我学到了一些东西,但不确定它是否有用,但我想总比什么都没有好
    – Ced公司
    评论 2018年4月2日2:53
  • 这句话特别令人困惑,因为它实际上是无效的
    – Ced公司
    评论 2018年4月2日2:54
  • 1
    @Ced很高兴我的回答有帮助。嵌套破坏有时会让人困惑,但有时它确实很有用,也很有表现力。确保看到我的最新编辑-我修复了一些混淆的术语并澄清了一些事情。 评论 2018年4月2日3:07

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.