经典面试题:以下代码将输出的结果是什么?

1.请看下面这段很短的代码,运行的结果是什么?

 

 

答案解析:

  typeof主要用于检测基本数据类型,typeof返回的结果有number,string,boolean,function,object,undefined,而null表示空对象指针,返回object主要是个人理解的吧,undefined表示变量被声明了,但没有赋值,要注意的是任何使用new创建的都是对象。

  typeof null结果是object, 这是个历史遗留bug,在ECMA6中, 曾经有提案为历史平反, 将type null的值纠正为null, 但最后提案被拒了. 理由是历史遗留代码太多, 不想得罪人, 不如继续将错就错当和事佬。 而instanceof用于判断一个变量是否某个对象的实例,也就是问我们 null 是不是Object的一个实例。 对于Null类型的值(只有null),规范定义了typeof null返回"object"这个字符串。但是本质上Null和Object不是一个数据类型,null值并不是以Object为原型创建出来的。所以是得到的结果是false。

 

 

2.请看下面这道题,运行的结果是什么?

 

 

答案解析:

这道题的正确是答案是:D [1,NaN,NaN]。

   首先,我们了解了数组中map的作用,map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。也就是map会把数组["1", "2", "3"]遍历一遍,并传入parseInt函数中去进行处理。 那么很多人就觉得,把数组中的"1","2","3"进行parseInt处理之后,不就是得到数字1,2,3了吗? 但我们忽略了,map给处理函数传的参数不是简单地把数组的每个元素传进去,实际上它会传3个参数(value,index,array)。分别是数组的元素,索引和整个数组。如果忽略了这一点,就很容易答错这道题。

  也就是数组都调用了parseInt方法。因为callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。而parseInt方法是可以接收两个参数的,第一个为被转化的值,第二个为被转化值的进制。map自动传入的第二个参数被当做进制了,也就是数组的index被当做进制数了。当进制数为0时,默认为10进制,故结论数组第一个值为1,。当parseInt的进制参数小于2或者大于36,就返回NaN,因此第二个值为NaN。第三个值为NaN的原因是相当于执行了parseInt("3","2"),而2进制下数字3是不存在的,也返回了NaN。

 

posted @ 2018-03-08 15:47  FEDeveloper  阅读(558)  评论(0编辑  收藏  举报