gpt4 book ai didi

javascript - 理解js代码表达

转载 作者:行者123 更新时间:2023-11-30 17:18:05 25 4
gpt4 key购买 nike

var PgrtiJr = {
"TWfbR": +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![]))
};
PgrtiJr.TWfbR -= +((+!![] + []) + (+!![]));
console.log(parseInt(PgrtiJr.TWfbR, 10));

我有上面提到的js代码。我在 http://math.chapman.edu/~jipsen/js/ 上执行了这段代码.谁能给我解释一下它是如何等于 32 的?

你能推荐任何可以在 python 中计算这个表达式的 python 库吗

尝试过 execjs 但没有成功

最佳答案

您需要了解有关 JavaScript 松散类型的几件重要事情。让我们从更简单的事情开始,具体到您的问题。

  1. 空数组文字被认为是真实的,但是当您应用一元 + 运算符时,该数组将被转换为一个字符串,然后再被转换为一个数字。因此,内部 +[] 的计算结果为 0。

    console.log(+[]);
    // 0
  2. 因为 [] 是真值,用逻辑非运算符对它进行双重否定将得到 true,当它用于算术表达式时,计算结果为 1,因为 1 大致等于 true

    console.log(!![], 3 + !![]);
    // true 4
  3. 除此之外,当我们使用带有 + 运算符的数组文字时,数组将被转换为字符串,并且由于表达式的一部分是字符串,因此表达式的另一部分表达式也将转换为字符串,并进行字符串连接。因此生成的对象将是字符串类型。

    console.log(typeof 1, typeof [], typeof (1 + []), 1 + []);
    // number object string 1

有了这个基本的理解,让我们来分析第一个表达式。

+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]))

让我们先来,

(!+[]+!![]+!![]+!![]+[])

此处,+[] 的计算结果为 0 并且逻辑非使其为 true。因为我们在带有数字操作数的表达式中使用它,所以 true 被视为 1。根据上面的第 2 点,!![] 的计算结果为 1。所以,表达式变为1 + 1 + 1 + 1 + [],实际上是4 + []。根据第 3 点,数字 4 将变为字符串 4。

同理,表达式的其他部分,(!+[]+!![]+!![])变为,1 + 1 + 1这实际上是 3。所以当您执行 '4' + 3 时,您将得到 '43',这是一个字符串。现在,我们有一个一元 + 运算符,可将此字符串转换为数字。所以,这个表达式的求值结果变成了43,这是一个数字。

表达式的另一部分,

PgrtiJr.TWfbR -= +((+!![]+[])+(+!![]))

会这样评价

+((1 + []) + 1)

然后

+('1' + 1)

然后

+'11'

然后计算为 11。由于 PgrtiJr.TWfbR 实际上是 43,因此 43 - 11 变为 32。这就是为什么您得到 32 作为答案。

关于javascript - 理解js代码表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25697942/

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