一道“有意思”的JavaScript的面试题
今天逛帖子的时候,发现一道面试题,粗看起来感觉挺简单的,其实不然。闲话不多说,且看这道题。
操作符优先级你“真的”懂了么?
var str = 'msg';
var showStr = 'value is' + (str === 'msg') ? 'Something' : 'Nothing';
console.log(showStr);
当时乍一看,这题输入的结果肯定是"Something",洋洋自得中……
当时心里分析过程是这样的:
1、首先进行 (str === 'msg')的判断,str指向的值肯定是msg,所以返回的是true;
2、根据三目运算的流程,showStr取的值就会是'Something';
3、最终输入的结果是'Something';
分析出来的结果和实际输出结果一致!
然,我总是对于自己的技术永远抱有“怀疑”的态度,如果结果这么简单,那出这道题的人考查的意义仅仅是为了考查三目运算?肯定不会这么简单吧?
所以我就把str换成了msg1,我在想,如果最终的结果是Nothing的话,那我之前的分析是没有错的,但是实际运行起来,结果给我的是Something,这不符合道理啊。
接下来,排除,问题出在哪里。
1、三目运算的流程肯定是不会有错的。a == true ? b : c。a为真,则是b,否则是c;
2、那么问题应该出现这个三目的判断条件上,我把问题拆了下,直接写成
var a = str ==='msg' ? 'Something' : 'Nothing';
console.log(a);
结果果然是Nothing。
3、三目一块,没有问题,那么只能是在多余的还没分析地方出了问题,再次看了一下;
4、‘value is’ + 三目 ?这块有什么问题?字符串拼接?
5、为了验证我的想法,再次改写了一下;
var str = 'msg1';
var showStr = 'value is' + ((str === 'msg') ? 'Something' : 'Nothing');
console.log(showStr);
结果是我想要的Nothing
通过以上的分析不能得出JavaScript引擎在编译执行时解析成了 showStr = ‘value is false’ ? ‘Something’ : ‘Nothing’ 了,所以最张的结果会是Something。
通过这个案例,我们得出的结论是 字符串拼接的优先级高于三目运算符
parseInt你真的“会用”吗?
继续上一道题
var arr = ["1", "2", "3"];
var result = arr.map(parseInt);
相信对于这段代码的目的,稍微用过Javascript ES5的人都知道它是想把数组arr中的每一项的值转成整数。相信有很多人跟我一样,看到这道题会立即给出答案result = [1, 2, 3]
;但是结果真的如我们所料吗?
闲话不多说,直接上答案result = [1, NaN, NaN]
。
我当时的理解过程是这样的
1、result .push(parseInt("1")); => result = [1]
2、result .push(parseInt("2")); => result = [1, 2]
3、result .push(parseInt("3")); => result = [1, 2, 3]
我相信有很多技术不太深的人跟我一样的理解过程,但是实际上是这样的么?
真实的过程是这样的:
1、result .push(parseInt("1", 0)); => result = [1]
;
2、result .push(parseInt("2", 1)); => result = [1, NaN]
;
2、result .push(parseInt("3", 2)); => result = [1, NaN, NaN]
;
为什么会这样,其实这里考查了parseInt的基础用法和map的基础用法
MDN
上明确说明了:
parseInt(string, radix) 将一个字符串 string 转换为 radix 进制的整数, radix 为介于2-36之间的数。raidx,就是你想要换算成的进制,默认为10
Array.prototype.map(item, index, array),第一个参数是数组的每一项,即当前项,第二个参数是数组的当前项的下标,第三个参数
所以js在解析的时候,它的过程是
parseInt("1", 0); => 1
;parseInt("2", 1); => NaN
;parseInt("3", 2); => NaN
;
上述中的parseInt中的0 1 2分别为当前项的下标,在parseInt2的时候,进制出现了1, 计算机是没有1进制的,所以就出现Nan的情况,同理parseInt3的时候,2进制是不可能出现3的存在,结果返回NaN。
其实技术的突破,个人感觉不是学会了好多种语言,各种新的流行框架运用的炉火纯青,而是在看似很基础的上面能知其然,技术底子扎实牢固。