前几天社区的群里森破发了一个这样的链接:
http://ourjs.com/detail/52fb82e13bd19c4814000001
做了一遍后突然对人生感到了迷茫,本着不能只有我一个人伤心的原则,只要是程序员的好友我都发了一遍给他们答。
最近亚马逊书满减,凑单买了本Javascript实用代码段的书,结果发现原来那个所谓八级测试的始作俑者就是这本··· 结果竟然没有答案···
遂觉得还是整理一遍的好,加上之前自己的一些笔记,和一些扩展,写个总结发出来记录一下。
1,
这东西无非是函数参数问题,记得住就答得出来,真没什么卵用。
主要是parseInt的第二个参数,是解析数字的基数,也就是进制,范围为2~36。
比如这道题的第二个运行结果 就是 parseInt('2',1); 参数不符 故是NAN。
第二个运行结果 parseInt('3',2); 二进制里没有3,所以也是NAN。
2
null,array的 typeof 都是object。
但是instanceof还是很严谨的。
不过以下需要注意:
1. instanceof 是判断前者是否为后者的一个实例,所以
2.判断一个变量的类型上面两种都不好要用这个:
Object.PRototype.toString.call(XXX).slice(8,-1);
3
这个就是新array api的熟悉啦,
reduce也支持两个参数,arr.reduce(callback[,initialValue]) 第二个参数··· 就叫他迭代开始吧, arr和initialValue两个参数不能同时为空,上一道题就是同时为空了。
链接里给的答案解析是有一些小问题的。
4是操作符优先级问题,就不说了。
5
这道题涉及的东西是作用域和变量声明。
javaScript是没有块级作用域的,只有函数作用域。所以
if(true){var hehe = 'hehe'}这样写是没错误的。
因为作用域是一样的,当然还有最关键的一点,就是js的提前声明。
代码等同于:
所以name是undefined;
6 js最大的数是2^53。
7 pass
8
js没有精确的数值,是因为十进制在转换为计算机用二进制时候的丢失导致的。该死的js并没有对这个误差进行处理。
9,10
switch 用 === 进行枚举,记住即可。
另外周同学上次在社区 群里提到的:
=== 是不触发toString的。
11 pass
12 同1
13 pass
14
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
53和2,因为在遇到减号时,会先转换为数值类型。
那么 3 + ‘5’ - 3是多少呢? 是32。
那如果我们要字符串类型转换为数字类型呢?
+str 或者 str*1。
像上面那样 str在中间,就尽量用*1吧 、
17
我不明白,也没找到··· 试了好多组数字,找到了点规律··· 但是依旧不明白为什么···
18pass
19 arguments,严格模式下就不会被更改了。
相应的,还有一个全局变量undefined,在严格模式下也不会可以被修改。
但是你依旧可以用function undefined来修改。
有的闭包会传一个undefined的参数,就是怕在全局被复写了。
20,21,22,23,
pass
24
2.toString() 报错是因为解析器把'.'解析为了浮点数的'.'。所以如果你要用写符合这种语义的代码就要:
25
y是全局。
来点复杂的,还记得那三道面试题吗?
答案是 100 10 100
因为
这里还涉及到了一个作用域问题。
最后统一说一下吧。
同样是声明提前 所以 第一个alert是undefined。
这个最简单其实,别被前两个弄蒙就ok了。
26
记住即可
27同15
28,29, pass
30
function的name问题。
那这道题呢?
答案是 foo,undefined。
因为第二个是吧匿名函数复制给了foo2,所以没有name。
谢谢周同学为我解惑。
31 同1
32 同30
33 pass
34
arr允许最后一个为逗号。
还记得那个最简单的验证ie浏览器的代码吗?
!+[1,]
就是因为低版本(9以前?忘记了)的bug,[1,]在ie下toString是1,而不是1。
35
别用关键字,总不会出问题。
ok,大概就这些。在说一下这里面很少涉及的this问题。
构造函数是有作用域的
所以
而
a,b() 这种类型的作用域就是a。
但是····要记住this只在执行时才会绑定,所以
当你把a.b 付给了c时候,this有指向了全局了···
那么如果这样呢?
里面外面都是一样的,当你执行的是 func() 的时候,都会指向全局。
好啦,恶心人的东西解决完了,如果有错误或者补充,希望下面留言。
新闻热点
疑难解答