var PgrtiJr = {
"TWfbR": +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![]))
};
PgrtiJr.TWfbR -= +((+!![] + []) + (+!![]));
console.log(parseInt(PgrtiJr.TWfbR, 10));
我有上面提到的js代码。我在http://math.chapman.edu/~jipsen/js/上执行了此代码。任何人都能解释一下它是如何等于32
的吗?
你能推荐任何可以在python
中评估这个表达式的python库吗?尝试了execjs但没有运气
答案 0 :(得分:1)
你需要了解一些关于JavaScript松散输入的重要事项。让我们从简单的事情开始,特别针对你的问题。
空数组文字被认为是真实的,但是当你应用一元+运算符时,数组将被转换为一个字符串,然后将其转换为数字。因此,内部+[]
的计算结果为0。
console.log(+[]);
// 0
由于[]
是真实的,因此使用逻辑非运算符对其进行双重否定会给出true
,当在算术表达式中使用时,它会计算为1,因为1松散地等于{ {1}}。
true
除了所有这些,当我们使用带有console.log(!![], 3 + !![]);
// true 4
运算符的数组文字时,数组将被转换为字符串,因为表达式的一部分是字符串,表达式的另一部分将也可以转换为字符串并进行字符串连接。因此,生成的对象将是string类型。
+
通过这种基本的理解,让我们分析第一个表达式。
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