编程语言
首页 > 编程语言> > javascript – `let:let {let:[x = 1]} = [alert(1)]`会发生什么?

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

作者:互联网

我正在观看a talk on JSON hijacking而不是2分钟,已经有我不熟悉的JavaScript了.

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

它似乎适用于Edge而只是警报1,但我从来没有遇到过:让语法.我很好奇,我怎么读这个?

解决方法:

视频实际上说它使用了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)].在这种情况下,它之前是一个标签.没有其他关键字可用作标签:

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中,let和yield也会因SyntaxError而失败:[keyword]是一个保留标识符.

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

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

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

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

警报(1)被执行,因此您可以看到警报.它评估为undefined,所以你有:

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

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

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}}}

这里,没有创建变量a或b,只有c,它是左侧标识符后面没有的标识符.后跟a的属性名称:基本上指示赋值“在右侧值中查找此属性”.

标签:javascript,microsoft-edge,destructuring,labeled-statements
来源: https://codeday.me/bug/20190622/1262708.html