对于在线挑战,我已经对此模糊化了一些代码:
A = (0)['constructor']['constructor']
根据我的尝试,此函数将一些代码作为参数,并将其放入异步函数的主体中并返回它。
A = (0)['constructor']['constructor']
console.log(A)
console.log(A('return 9'))
console.log(A('return 9')())
但是,我不了解此语法以及该函数的创建方式。幕后发生了什么?
这里发生了令人惊讶的数量,因此我将尝试将其分解为多个步骤。
0
是原始数字。基元没有属性,并且任何检索属性的尝试(例如(0).constructor
)都将导致Javascript自动将其转换为Object表示形式。例如。 (0)
变为Number(0)
。(0)
仍然是基元,只是增加了分组运算符()
。这样做是因为没有括号,.
中的0.
被解释为小数点而不是属性访问器。您可以使用0..constructor
或其他多种方法来实现同一目的。prototype
。您可以使用对象的__proto__
属性来查看其原型,例如(0).__proto__
。 prototype
很有趣,因为当您尝试访问对象的属性时,Javascript还将检查__proto__
对象以查看该属性是否存在。 (这主要用于继承)。__proto__
上的属性之一是constructor
。 constructor
是在首次创建对象时调用的函数。constructor
的类型为Function
,它本身是具有自己的constructor
属性的对象。因此,(0).constructor.constructor
是Number(0).__proto__.constructor.__proto__.constructor
的简写。
您返回9
的匿名函数会执行其操作,因为Function
的构造函数接受某些Javascript代码的字符串表示形式作为参数。等效于执行此操作:
Function('return 9')()
;
编辑:更正了有关自动装箱和(0)
的错误