理解js代码表达式

时间:2014-09-06 07:27:47

标签: javascript python node.js

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

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

你能推荐任何可以在python

中评估这个表达式的python库吗?

尝试了execjs但没有运气

2 个答案:

答案 0 :(得分:1)

你需要了解一些关于JavaScript松散输入的重要事项。让我们从简单的事情开始,特别针对你的问题。

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

    console.log(+[]);
    // 0
    
  2. 由于[]是真实的,因此使用逻辑非运算符对其进行双重否定会给出true,当在算术表达式中使用时,它会计算为1,因为1松散地等于{ {1}}。

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

    +
  4. 通过这种基本的理解,让我们分析第一个表达式。

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

    让我们先来看看,

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

    此处,(!+[]+!![]+!![]+!![]+[]) 评估为+[],逻辑不评为0。由于我们在带有数字操作数的表达式中使用它,true被视为1.根据上面的第2点,true的计算结果为1.因此,表达式变为!![] ,实际上是1 + 1 + 1 + 1 + []。根据第3点,数字4将成为字符串4。

    同样地,表达式的其他部分4 + []变为,(!+[]+!![]+!![]),实际上是3.所以当你1 + 1 + 1时,你会得到'4' + 3,这是一个字符串。现在,我们有一个一元+运算符,它将此字符串转换为数字。因此,该表达式的评估结果变为43,这是一个数字。

    表达式的另一部分,

    '43'

    将像这样进行评估

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

    然后

    +((1 + []) + 1)
    

    然后

    +('1' + 1)
    

    然后评估为11.由于+'11' 实际上是43,因此43 - 11变为32.这就是为什么你得到32作为答案。

答案 1 :(得分:0)

[] 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