题目:
表达式 []+(-~{}-~{}-~{}-~{})+(-~{}-~{}) 的运算结果是?
自己测试出来的结果为: "42"。
但是解题过程没思路,考的是JS的正则吗? 求解。
题目:
表达式 []+(-~{}-~{}-~{}-~{})+(-~{}-~{}) 的运算结果是?
自己测试出来的结果为: "42"。
但是解题过程没思路,考的是JS的正则吗? 求解。
这种题目就是在瞎比折腾。利用js的隐式类型转换作文章。然而实际使用中并不会写这种代码(不然你的code reviewer打不死你)。
这让我想起了,以前会考在C语言中连续书写各种运算符,让人脑跟机器去比较对运算符优先级和结合性的解析能力。我干嘛不加上括号呢?
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
又先占一坑,让我娓娓道来...
[]+(-~{}-~{}-~{}-~{})+(-~{}-~{})
推理过程:
因为:
[].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({}))