“有意思”的JavaScript的面试题

一道JavaScript面试题揭示了操作符优先级和parseInt的微妙之处。原本预期的结果被字符串拼接的解析规则改变,导致实际输出与直觉不符。通过深入分析,我们了解到JavaScript引擎在解析时的顺序以及parseInt函数处理不同进制数字的规则。理解这些基础知识对于提升编程技能至关重要。
摘要由CSDN通过智能技术生成

今天逛帖子的时候,发现一道面试题,粗看起来感觉挺简单的,其实不然。闲话不多说,且看这道题。

操作符优先级你“真的”懂了么?

	var str = 'msg';
	var showStr = 'value is' + (str === 'msg') ? 'Something' : 'Nothing';
	console.log(showStr);

当时乍一看,这题输入的结果肯定是"Something",洋洋自得中……

当时心里分析过程是这样的:

	1、首先进行 (str === 'msg')的判断,str指向的值肯定是msg,所以返回的是true2、根据三目运算的流程,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上明确说明了:

  1. parseInt(string, radix) 将一个字符串 string 转换为 radix 进制的整数, radix 为介于2-36之间的数。raidx,就是你想要换算成的进制,默认为10
  2. Array.prototype.map(item, index, array),第一个参数是数组的每一项,即当前项,第二个参数是数组的当前项的下标,第三个参数

所以js在解析的时候,它的过程是

  1. parseInt("1", 0); => 1;
  2. parseInt("2", 1); => NaN;
  3. parseInt("3", 2); => NaN;
    上述中的parseInt中的0 1 2分别为当前项的下标,在parseInt2的时候,进制出现了1, 计算机是没有1进制的,所以就出现Nan的情况,同理parseInt3的时候,2进制是不可能出现3的存在,结果返回NaN。

其实技术的突破,个人感觉不是学会了好多种语言,各种新的流行框架运用的炉火纯青,而是在看似很基础的上面能知其然,技术底子扎实牢固。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值