Rumah > Soal Jawab > teks badan
题目:
表达式 []+(-~{}-~{}-~{}-~{})+(-~{}-~{}) 的运算结果是?
自己测试出来的结果为: "42"。
但是解题过程没思路,考的是JS的正则吗? 求解。
黄舟2017-04-10 15:23:49
又先占一坑,让我娓娓道来...
[]+(-~{}-~{}-~{}-~{})+(-~{}-~{})
推理过程:
因为:
[].toString() => ''
-~{} => -(~parseInt({})) => -(~NaN) => -(-1) => 1
所以:
[]+(-~{}-~{}-~{}-~{})+(-~{}-~{})
= '' + (-(-1)-(-1)-(-1)-(-1)) + (-(-1)-(-1))
= '' + 4 + 2
= '4' + 2
= '42'
以上,完毕!
=========分隔线==========
有同僚提出
1. -~{} => -(~parseInt({}))
这一步是怎么推出来的?
2. ~NaN => -1
这值是如何计算出的?
第二个问题,多谢 @Foolyou 提示,再仔细查找资料得:根据ES5规范对于NaN
,-0
,+0
,+∞
,-∞
这些值在转换为Number类型时,将返回+0
第一问题,~
这是按位取反运算符,它右边的运算对象应该是数值,当不是数值时,javascript会尝试类型转换,所以~{}
就等同于~(parseInt({}))
迷茫2017-04-10 15:23:49
这种题目就是在瞎比折腾。利用js的隐式类型转换作文章。然而实际使用中并不会写这种代码(不然你的code reviewer打不死你)。
这让我想起了,以前会考在C语言中连续书写各种运算符,让人脑跟机器去比较对运算符优先级和结合性的解析能力。我干嘛不加上括号呢?