var PgrtiJr = {
"TWfbR": +((!+[] + !![] + !![] + !![] + []) + (!+[] + !![] + !![]))
};
PgrtiJr.TWfbR -= +((+!![] + []) + (+!![]));
console.log(parseInt(PgrtiJr.TWfbR, 10));
我有上面提到的js代码。我在http://math.chapman.edu/~jipsen/js/上执行了这段代码。有人能解释一下它是怎么等于32
的吗
你能推荐任何可以用python计算这个表达式的python库吗
我试过了,但运气不好
您需要了解一些有关JavaScript松散类型的重要内容。让我们从简单的事情开始,具体到你的问题
空数组文字被认为是真实的,但当应用一元+运算符时,数组将被转换为字符串,然后再转换为数字。因此,内部
+[]
的计算结果为0因为
[]
是真的,所以用逻辑not运算符对它进行双重求反将得到true
,当在算术表达式中使用时,它的值为1,因为1大致等于true
除此之外,当我们使用带有
+
运算符的数组文字时,数组将被转换为字符串,由于表达式的一部分是字符串,表达式的另一部分也将被转换为字符串,并发生字符串串联。因此生成的对象将是string类型有了这个基本的理解,我们来分析第一个表达式
我们先来看看
这里,
+[]
求值为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
实际上是43,所以43-11变成32,这就是为什么你得到32作为答案如果我们在这个表达式后面添加一个[],它们将被转换成字符串
所以呢
(!+[]+!![]+!![]+!![]+[])
将是一个等于4的字符串(!+[]+!![]+!![])
将是一个等于3的字符串因此
(!+[]+!![]+!![]+!![]+[]) + (!+[]+!![]+!![])
将是一个等于43的字符串而
+(!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])
将是一个同样等于43的数字以同样的方式
+((+!![]+[])+(+!![]))
将等于11所以表达式的总和等于43-11=32
相关问题 更多 >
编程相关推荐