如何创建此函数? A =(0)['constructor'] ['constructor']

问题描述 投票:2回答:1

对于在线挑战,我已经对此模糊化了一些代码:

A = (0)['constructor']['constructor']

根据我的尝试,此函数将一些代码作为参数,并将其放入异步函数的主体中并返回它。

A = (0)['constructor']['constructor']

console.log(A)
console.log(A('return 9'))
console.log(A('return 9')())

但是,我不了解此语法以及该函数的创建方式。幕后发生了什么?

javascript syntax
1个回答
2
投票

这里发生了令人惊讶的数量,因此我将尝试将其分解为多个步骤。

  • 0是原始数字。基元没有属性,并且任何检索属性的尝试(例如(0).constructor)都将导致Javascript自动将其转换为Object表示形式。例如。 (0)变为Number(0)
  • (0)仍然是基元,只是增加了分组运算符()。这样做是因为没有括号,.中的0.被解释为小数点而不是属性访问器。您可以使用0..constructor或其他多种方法来实现同一目的。
  • 所有Javascript对象都有一个prototype。您可以使用对象的__proto__属性来查看其原型,例如(0).__proto__prototype很有趣,因为当您尝试访问对象的属性时,Javascript还将检查__proto__对象以查看该属性是否存在。 (这主要用于继承)。
  • __proto__上的属性之一是constructorconstructor是在首次创建对象时调用的函数。
  • [constructor的类型为Function,它本身是具有自己的constructor属性的对象。

因此,(0).constructor.constructorNumber(0).__proto__.constructor.__proto__.constructor的简写。

您返回9的匿名函数会执行其操作,因为Function的构造函数接受某些Javascript代码的字符串表示形式作为参数。等效于执行此操作:

Function('return 9')();

编辑:更正了有关自动装箱和(0)的错误

© www.soinside.com 2019 - 2024. All rights reserved.