首页 > 这道JS题想考察什么?该怎样解?

这道JS题想考察什么?该怎样解?

题目:
表达式 []+(-~{}-~{}-~{}-~{})+(-~{}-~{}) 的运算结果是?

自己测试出来的结果为: "42"。
但是解题过程没思路,考的是JS的正则吗? 求解。


jother编码之谜


又先占一坑,让我娓娓道来...

[]+(-~{}-~{}-~{}-~{})+(-~{}-~{})

推理过程:

因为:

[].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({}))


'' + (1 + 1 + 1 + 1) + (1 + 1)


这种题目就是在瞎比折腾。利用js的隐式类型转换作文章。然而实际使用中并不会写这种代码(不然你的code reviewer打不死你)。

这让我想起了,以前会考在C语言中连续书写各种运算符,让人脑跟机器去比较对运算符优先级和结合性的解析能力。我干嘛不加上括号呢?

【热门文章】
【热门文章】