您的位置:首页 > 职场人生

解析js面试题(上)

2016-05-05 14:06 501 查看
注:本篇博客的题目出自于博主,小平果118博客,题目地址:/article/2242847.html,由于该博客并没有抛出来来答案和解析,我在这里以自己的理解来做一下这些题目。欢迎大家与我交流!下面进入正题,来看题目:

1,以下表达式的运行结果是:

["1","2","3"].map(parseInt)

A.["1","2","3"]

B.[1,2,3]

C.[0,1,2]

D.其他


这道题考的非常细致,答案应该是DD,输出的为
[1, NaN, NaN]


解析:这道题我们需要注意的
parseInt
函数的参数,这个函数的参数有两个,一个是必须参数,也就是需要被解析的字符串;另一个是数字基数,是一个可选参数,如果我们传入的是0或者不传入的话,默认以十进制来解析,如果该参数小于 22 或者大于 3636,则
parseInt()
将返回
NaN


下面来看我们的题目,首先会是
parseInt("1", 0)
,正如我们以上所说以十进制来进行解析,所以就得到
1
,然后是
parseInt("2", 1)
,由于基数小于22,返回的就是
NaN
,最后是
parseInt("3", 2)
,由于二进制的每位最大值只能够为11,所以已二进制的形式来解析,显然也是错误的。

我们现在对题主给的这个函数做一下改变
["1","2","3"].map(parseFloat)
的话,我们会得到的是
[1, 2, 3]
,这是因为我们的
parseFloat
的参数只有一个,那就是被解析的字符串


我们从这题可以看出
parseFloat
parseInt
的区别:

1. 前者返回一个浮点数;后者返回一个整数

2. 前者只能在十进制下解析,只有一个参数;后者可以在二进制到三十六进制下进行解析,有两个参数。

2,以下表达式的运行结果是:

[typeof null, null instanceof Object]

A.["object",false]

B.[null,false]

C.["object",true]

D.其他


这题主要考的是
null
,答案为BB

解析:
null
只是一个空指针引用,个人的认知是
typeof
返回的只是基础数据类型
,也就是
Number,Null,Undefined,Boolean,String,Symbol,Object
,在
js
中属于
typeof null
返回
object
可以说是一个历史错误,没有什么为什么,它就是这样。

然而
instanceof
却是十分有意思,其目的是检测一个对象是不是为另一个对象的实例,由于
null
只是一个空指针引用,所以
null
肯定不是有
new Object()
得到的,所以返回的
false


3,以下表达式的运行结果是:

[[3,2,1].reduce(Math.pow),[].reduce(Math.pow)]

A.报错

B.[9,0]

C.[9,NaN]

D.[9,undefined]


这题,答案为AA

解析:因为调用空数组不带默认参数地调用
reduce()
方法会报错,当只有一个元素的时候(数组只有一个元素,且没有初始参数;数组为空,但是含有初始参数),
reduce()
方法只会简单的返回这个数值,而不会调用化简操作
,但是我仍然需要知道一下前面的那个值为什么为99,我们第一次调用函数时,第一个参数为初始值,假若没有初始值的话,则将数组的第一个元素作为初始值,我们第一次传入的参数就为3,23,2,计算323^2得出99,第二次传入的为第一次化简函数返回的值和数组下一个位置的值,也就是9,19,1,所以最终输出99。

4,以下表达式的运行结果是:

var val = 'value';
console.info('Value id '+(val === 'value')?'Something':'Nothing');

A.Something

B.Nothing

C.NaN

D.其他


这题答案是AA,没有什么好解释的只有空字符串转化为
Boolean
类型时为
false


5,以下表达式的运行结果是:

var name = 'World';
(function(){
if(typeof name === 'undefined'){
var name = "Jack";
console.info('Goodbye '+ name);
}else{
console.info('Hello ' + name);
}
})();

A.Goodbye Jack

B.Hello Jack

C.Goodbye undefined

D.Hello undefined


这题答案为AA,主要为变量提前声明,在es2015中的
let,const
并不会发生这种现象。

6,以下表达式的运行结果是:

var END = Math.pow(2,53);
var START = END - 100;
var count = 0;

for(var i = START ; i <= END ;i++){
count ++;
}
console.log(count);

A.0

B.100

C.101

D.其他


答案是DD,因为在js中可以允许的最大数值为2532^{53},大于2532^{53}的整数计算不能确保正确,但不一定总不正确,$,如:
Math.pow(2, 53) + 1 === Math.pow(2, 53)
返回值为true,所以我们写的那个就是一个死循环。

7,以下表达式的运行结果是:

var arr = [0,1,2];
arr[10] = 10;
arr.filter(function(x){return x === undefined});

A.[undefined x 7]

B.[0,1,2,10]

C.[]

D.[undefined]


这题答案为CC,因为
fliter()
方法会跳过稀疏数组中缺少的元素,所以中间的那些未定义就直接被跳过了,这也是数组某位置值为
undefined
与未定义的一个区别。

8,以下表达式的运行结果是:

var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6;
[two -one == one,eight- six == two];

A.[true,true]

B.[false,false]

C.[true,false]

D.其他


这题答案为CC,计算机在计算浮点数时有一个小bug,具体的详情可以参考我之前的博客:/article/9772887.html

9,以下表达式的运行结果是:

function showCase(value) {
switch(value) {
case 'A':
console.log('Case A');
break;
case 'B':
console.log('Case B');
break;
case undefined:
console.log('undefined');
break;
default:
console.log('Do not know!');
}
}
showCase(new String('A'));
A.Case A

B.Case B

C.Do not know

D.undefined


答案为:CC,因为
case
的条件分支视为判断
===
,引用类型的
String
与基本类型的
String
由于类型不同,所以走的是
default
分支

10,以下表达式的运行结果是:

function showCase(value){

switch(value){
case 'A':
console.info('Case A');
break;
case 'B':
console.info('Case B');
break;
case undefined :
console.info('undefined');
break;
default:
console.info('Do not know!');
}
}
showCase(String('A'));

A.Case A

B.Case B

C.Do not know

D.undefined


答案为AA,将字符串强制类型转换为字符串,所以满足
===
,值等类型等。

11,以下表达式的运行结果是:

function isOdd(num){
return num % 2 == 1;
}
function isEven(num){
return num % 2 == 0;
}
function isSane(num){
return isEven(num)||isOdd(num);
}
var values = [7,4,'13',-9,Infinity];
values.map(isSane);

A.[true, true, true, true, true]

B.[true, true, true, true, false]

C.[true, true, true, false, false]

D.[true, true, false, false, false]


答案为CC,
-9 % 2
余下的为
-1
Infinity % 2
得到的是
NaN


12,以下表达式的运行结果是:

[parseInt(3,8),parseInt(3,2),parseInt(3,0)]

A.[3,3,3]

B.[3,3,NaN]

C.[3,NaN,NaN]

D.其他


答案为DD,我们得到的输出结果为
[3, NaN, 3]
,关于
parseInt
请参见第一题的解析。

13,以下表达式的运行结果是:

Array.isArray(Array.prototype)

A.true

B.false

C.报错

D.其他


答案为AA,因为我们的
Array.prototype
就是一个
[]


14,以下表达式的运行结果是:

var a = [0];
if([0]){
console.info(a == true);
}else{
console.info("else");
}


A.true

B.false

C.”else”

D.其他

答案为BB,我们需要清楚的是在
if
条件判断中会调用我们的强制类型转换,将其转换为
boolean
类型值,也就是说
if
条件判断中相当于对于条件进行
Boolean(条件内容)
,但是对于
==
来说,只是来进行值类型的比较,我们的
[0]
拿到的是其值,也就是
0
,这样显然不等于
true


15,以下表达式的运行结果是:

[]==[]

A.true

B.false

C.报错

D.其他


答案为BB,在js中两个对象是永远不可能相等的,因为对象是引用类型,其意义等同于指针,正如题目中的两个空数组那样,虽然都是空数组,但是它们在内存中的地址并不同,所以值,也就是指针肯定不同。

16,以下表达式的运行结果是:

[('5'+3),('5'-3)]

A.["53",2]

B.[8,2]

C.报错

D.其他


答案为AA,老生常谈的问题,字符串与数值进行++操作时,会将
number
类型转换为
string
类型,进行−-操作时,会将
string
类型转换为
number
类型。

17,以下表达式的运行结果是:

1+-+++-+1

A.true

B.false

C.报错

D.其他


如果题目是长成这个样的话,那么会报错,答案也就是DD,但是假如题目是:

1 + - + + + - + 1


那么输出结果为22,为什么会为22呢?这表达式运算符之间存在空格,也就是说上面的表达式相当于
1 + "" - "" + "" + "" + "" - "" + 1
,在结合我在十六题时所说,很容易就能算出。

18,以下表达式的运行结果是:

var arr = Array(3);
arr[0] = 2
arr.map(function(elem){return '1';});

A.[2,1,1]

B.["1","1","1"]

C.[2,"1","1"]

D.其他


答案为DD,输出的应该为
["1", ,]
map
方法与我们之前所看到的
filter
方法一样,会跳过缺失的元素,所以稀疏数组经过
map
处理后仍然为稀疏数组。

19,以下表达式的运行结果是:

function sidEffecting(arr){
arr[0] = arr[2];
}
function bar(a,b,c){
c = 10;
sidEffecting(arguments);
return a+b+c;
}
bar(1,1,1);

A.3

B.12

C.报错

D.其他


答案为DD,其结果为2121。

20,以下表达式的运行结果是:

var a = 111111111111111110000;
b = 1111;
console.info(a+b);

A.111111111111111111111

B.111111111111111110000

C.NaN

D.Infinity


答案为BB,像我们之前第六题那样,变量
a
的值已经超过了
Math.pow(2, 53)
,所以容易产生精度丢失问题。

21,以下表达式的运行结果是:

ar x = [].reverse;
x();

A.[]

B.undefined

C.报错

D.window


答案为DD,首先我们知道用数组的
reverse
方法操作数组,数组将会被改变,可以出名
reverse
是操作
this
,并且返回
this
,如:

[].reverse.call(new Boolean(true)); bool对象
[].reverse.call(new Number(23));  number对象


所以我们可以确认的是,我们的
reverse
,将
[].reverse
赋值给一个全部变量
x
,所以调用我们的
x
时相当于
window.x
,所以
this
也就指向
window
了。

22,以下表达式的运行结果是:

Number.MIN_VALUE>0

A.true

B.false

C.报错

D.其他


答案为AA,
Number.MIN_VALUE
表示的一个无限接近于0的数字,值约为5∗10−3245*10^{-324}。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: