gpt4 book ai didi

javascript - `let:let{let:[x=1]}=[alert(1)]` 发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:40:53 26 4
gpt4 key购买 nike

我在看a talk on JSON hijacking不到 2 分钟,已经有我不熟悉的 JavaScript。

let:let{let:[x=1]}=[alert(1)]

它似乎在 Edge 上工作并且只提醒 1,但我从来没有遇到过 let:let 语法。我很好奇,我应该如何阅读这篇文章?

最佳答案

视频实际上说它使用 destructuring assignmentlabels .

此代码在 Edge 以外的浏览器中似乎不起作用;所以为了让它在其他浏览器中工作,它需要看起来像这样:

let:{let{let:[x=1]}=[alert(1)]}

为什么?让我们看看 Firefox 的控制台:

SyntaxError: lexical declarations can't appear in single-statement context

错误所指的“单语句上下文”,是let:开头的部分 — let{let:[x=1]}=[alert( 1)]。在这种情况下,let 是一个 label。没有其他关键字似乎可以用作标签:

var: while(false); // => SyntaxError: missing variable name
for: while(false); // => SyntaxError: missing ( after for

但是,其中一些有效:

yield: while(false);
async: while(false);
await: while(false);

strict mode然而,letyield 也会失败,并出现 SyntaxError: [keyword] is a reserved identifier

现在,代码的剩余部分使用解构:

let {
let: [x = 1]
} = [
alert(1)
];

{ } 中的 let 只是表示一个对象属性,这完全没问题。以下是有效的 JS:

let object = {
let: 2,
var: 1,
const: "hello",
while: true,
throw: Error
};

alert(1) 被执行,因此您会看到警报。它的计算结果为 undefined,因此您有:

let {let: [x = 1]} = [undefined];

现在,它试图获取 [undefined]let 属性,它本身是 undefined。此外,这一行试图获取该属性的值,并将其进一步解构为一个数组(因此该值必须是一个可迭代对象),其第一个元素的变量名称为 x ,其中默认值 1。由于[undefined].letundefined,不能解构,所以代码抛出错误:

TypeError: [...].let is undefined


工作 解构可能看起来像这些行之一:

let {let: [x = 1]} = {let: [alert(1)]}; // x is now 1 (default value, since first element in right-hand side is undefined)
let {let: [x = 1]} = {let: [2]}; // x is now 2 (defined due to right-hand side)

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


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

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

这里,没有创建变量ab,只有c,也就是后面没有的标识符通过左侧的 :。后跟 : 的属性名称基本上指示赋值给“在右侧值中找到此属性”

关于javascript - `let:let{let:[x=1]}=[alert(1)]` 发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49604335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com