理解js代码表达式

2024-06-11 05:38:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我试过了,但运气不好


Tags: 代码loghttp表达式varjsmathconsole
2条回答

您需要了解一些有关JavaScript松散类型的重要内容。让我们从简单的事情开始,具体到你的问题

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

    console.log(+[]);
    // 0
    
  2. 因为[]是真的,所以用逻辑not运算符对它进行双重求反将得到true,当在算术表达式中使用时,它的值为1,因为1大致等于true

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

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

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

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

我们先来看看

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

这里,+[]求值为0,logical not使其成为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'

因为PgrtiJr.TWfbR实际上是43,所以43-11变成32,这就是为什么你得到32作为答案

[] is an object that is equal to null.

!![] is a "boolean" that equals to true. (twice ! of null ( = false) )

!+[] is a "boolean" that equals to true.

如果我们在这个表达式后面添加一个[],它们将被转换成字符串

所以呢 (!+[]+!![]+!![]+!![]+[])将是一个等于4的字符串

(!+[]+!![]+!![])将是一个等于3的字符串

因此(!+[]+!![]+!![]+!![]+[]) + (!+[]+!![]+!![])将是一个等于43的字符串

+(!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])将是一个同样等于43的数字

以同样的方式+((+!![]+[])+(+!![]))将等于11

所以表达式的总和等于43-11=32

相关问题 更多 >