您的位置:首页 > Web前端 > JavaScript

javascript专业八级测试答案整理

2015-07-21 11:52 267 查看




完整内容参见原文链接:http://www.gbtags.com/gb/share/5839.htm

前几天社区的群里森破发了一个这样的链接:

http://ourjs.com/detail/52fb82e13bd19c4814000001

做了一遍后突然对人生感到了迷茫,本着不能只有我一个人伤心的原则,只要是程序员的好友我都发了一遍给他们答。

最近亚马逊书满减,凑单买了本javascript实用代码段的书,结果发现原来那个所谓八级测试的始作俑者就是这本··· 结果竟然没有答案···

遂觉得还是整理一遍的好,加上之前自己的一些笔记,和一些扩展,写个总结发出来记录一下。

1,

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

这东西无非是函数参数问题,记得住就答得出来,真没什么卵用。

主要是parseInt的第二个参数,是解析数字的基数,也就是进制,范围为2~36。

比如这道题的第二个运行结果 就是 parseInt('2',1); 参数不符 故是NAN。

第二个运行结果 parseInt('3',2); 二进制里没有3,所以也是NAN。

2

[typeof null, null instanceof Object]

null,array的 typeof 都是object。

但是instanceof还是很严谨的。

不过以下需要注意:

1. instanceof 是判断前者是否为后者的一个实例,所以





2.判断一个变量的类型上面两种都不好要用这个:

Object.prototype.toString.call(XXX).slice(8,-1);





3

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

这个就是新array api的熟悉啦,

reduce也支持两个参数,arr.reduce(callback[, initialValue]) 第二个参数··· 就叫他迭代开始吧, arr和initialValue两个参数不能同时为空,上一道题就是同时为空了。

链接里给的答案解析是有一些小问题的。

4是操作符优先级问题,就不说了。

5

这道题涉及的东西是作用域和变量声明。

javaScript是没有块级作用域的,只有函数作用域。所以

if(true){var hehe = 'hehe'}这样写是没错误的。

因为作用域是一样的,当然还有最关键的一点,就是js的提前声明。

代码等同于:

var name = 'World!';

(function () {

var name;

if (typeof name === 'undefined') {

name = 'Jack';

console.log('Goodbye ' + name);

} else {

console.log('Hello ' + name);

}

})();

所以name是undefined;

6 js最大的数是2^53。

7 pass

8

js没有精确的数值,是因为十进制在转换为计算机用二进制时候的丢失导致的。该死的js并没有对这个误差进行处理。

9,10

switch 用 === 进行枚举,记住即可。

另外周同学上次在社区 群里提到的:

=== 是不触发toString的。

11 pass

12 同1

13 pass

14

var a = [0];

if ([0]) {

console.log(a == true);

} else {

console.log("wut");

}

if的判断

==和if的判断是不一样的

比如 if(2) 是true,但是 2 == true 是false,因为在==时,是把布尔值转换为数字类型在进行比较,这个时候 true是1,所以在==时,只有1==true是 ture。

同样的在if里,数字类型只有0是false,因为其余的转为布尔类型是,都是true。

引用对象都为true

小tips

1: 条件语句可以用 && 代替 比如 a&& b 就是if(a) && b

2:别的语言喜欢把-1当做false,放在js里,你可以用 if(~flag) 来使-1返回false。

~是按位取反,按照取反再减一来运算,

比如你要判断indexof

那么 if(~xxx.indexof('x') ) 比 if(xxx.indexof('x') > -1) 漂亮的多。

15

[]==[]

无论是== 还是=== 判断的都是索引值。

=赋予的也是对象的索引,所以千万不要 a=b=[] 这样子赋值,会是噩梦的。

16

'5' + 3

'5' - 3

53和2,因为在遇到减号时,会先转换为数值类型。

那么 3 + ‘5’ - 3是多少呢? 是32。

那如果我们要字符串类型转换为数字类型呢?

+str 或者 str*1。

像上面那样 str在中间,就尽量用*1吧 、

17

我不明白,也没找到··· 试了好多组数字,找到了点规律··· 但是依旧不明白为什么···

18 pass

19 arguments,严格模式下就不会被更改了。

相应的,还有一个全局变量undefined,在严格模式下也不会可以被修改。

但是你依旧可以用function undefined来修改。

有的闭包会传一个undefined的参数,就是怕在全局被复写了。

20,21,22,23,

pass

24

2.toString() 报错是因为解析器把'.'解析为了浮点数的'.'。所以如果你要用写符合这种语义的代码就要:





25

(function(){

var x = y = 1;

})();

console.log(y);

console.log(x);

y是全局。

来点复杂的,还记得那三道面试题吗?

var a = 10;

function test() {

a = 100;

alert(a);

alert(this.a);

var a;

alert(a);

}

test();

答案是 100 10 100

因为

var a = 10;

function test() {

var a;

a = 100;

alert(a);

alert(this.a);

//var a; 声明提前

alert(a);

}

test();

这里还涉及到了一个作用域问题。

最后统一说一下吧。

var a = 100;

function test(){

alert(a);

var a = 10;

alert(a);

}

test();

同样是声明提前 所以 第一个alert是undefined。

var a = 100;

function test(){

alert(a);

a = 10; //去掉了var 就变成定义了全局变量了

alert(a);

}

test();

alert(a);

这个最简单其实,别被前两个弄蒙就ok了。

26

记住即可

27同15

28,29, pass

30

function foo() { }

var oldName = foo.name;

foo.name = "bar";

[oldName, foo.name]

function的name问题。

完整内容参见原文链接:http://www.gbtags.com/gb/share/5839.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: