Ced*_*Ced 4 javascript destructuring labeled-statements microsoft-edge
我正在看一个关于 JSON 劫持的演讲,而不是 2 分钟,已经有我不熟悉的 JavaScript。
let:let{let:[x=1]}=[alert(1)]
Run Code Online (Sandbox Code Playgroud)
它似乎适用于 Edge 并且只是 alerts 1,但我从未遇到过这种let:let语法。我很好奇,我该怎么读这个?
此代码在 Edge 以外的浏览器中似乎不起作用;所以为了让它在其他浏览器中工作,它需要看起来像这样:
let:{let{let:[x=1]}=[alert(1)]}
Run Code Online (Sandbox Code Playgroud)
为什么?让我们看看 Firefox 的控制台:
SyntaxError: lexical declarations can't appear in single-statement context
错误所指的“单语句上下文”,是let:开头后面的部分吗?—?let{let:[x=1]}=[alert(1)]. 在这种情况下,letbefore 它是一个label。似乎没有其他关键字可用作标签:
var: while(false); // => SyntaxError: missing variable name
for: while(false); // => SyntaxError: missing ( after for
Run Code Online (Sandbox Code Playgroud)
但是,其中一些有效:
yield: while(false);
async: while(false);
await: while(false);
Run Code Online (Sandbox Code Playgroud)
在严格模式然而,let和yield将与失败以及SyntaxError: [关键词] is a reserved identifier。
现在,代码的其余部分使用解构:
let {
let: [x = 1]
} = [
alert(1)
];
Run Code Online (Sandbox Code Playgroud)
在let里面{ }只是意味着一个对象的属性,这完全是罚款。以下是有效的 JS:
let object = {
let: 2,
var: 1,
const: "hello",
while: true,
throw: Error
};
Run Code Online (Sandbox Code Playgroud)
alert(1)被执行,所以你会看到警报。它评估为undefined,所以你有:
let {let: [x = 1]} = [undefined];
Run Code Online (Sandbox Code Playgroud)
现在,这是试图获得 的let属性[undefined],它本身就是undefined。此外,这一行试图获取该属性的值,并将其进一步分解为一个数组(因此该值必须是一个可迭代对象),x其第一个元素的变量名称为默认值1。由于[undefined].letis undefined,它不能被解构,所以代码抛出错误:
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)
Run Code Online (Sandbox Code Playgroud)
let:{let{let:[x=1]}=[alert(1)]}
Run Code Online (Sandbox Code Playgroud)
两者都不会抛出错误,第一个分配1给x,因为右侧数组中的第一个元素是undefined。
部分混淆可能源于嵌套解构,如以下两个片段:
let {a: {b: {c}}} = {a: {b: {c: 3}}}
Run Code Online (Sandbox Code Playgroud)
var: while(false); // => SyntaxError: missing variable name
for: while(false); // => SyntaxError: missing ( after for
Run Code Online (Sandbox Code Playgroud)
在这里,没有变量a或被b创建,只有c,它是左侧没有后跟 a的标识符:。后跟 a 的属性名称:基本上指示赋值“在右侧值中找到此属性”。
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |