• javascript专业八级测试答案整理


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

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

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

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

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

    1,

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

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

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

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

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

    2

    1. [typeof null, null instanceof Object]
     

     null,array的 typeof 都是object。

    但是instanceof还是很严谨的。

    不过以下需要注意:

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

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

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

    3

    1. [ [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的提前声明。

    代码等同于:

    1. var name = 'World!';
    2. (function () {
    3. var name;
    4. if (typeof name === 'undefined') {
    5. name = 'Jack';
    6. console.log('Goodbye ' + name);
    7. } else {
    8. console.log('Hello ' + name);
    9. }
    10. })();
     

     所以name是undefined;

    6 js最大的数是2^53。

    7 pass

    8

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

    9,10

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

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

    === 是不触发toString的。

    11 pass

    12 同1

    13 pass

    14 

    1. var a = [0];
    2. if ([0]) {
    3. console.log(a == true);
    4. } else {
    5. console.log("wut");
    6. }
     

     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

    1. []==[]
     

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

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

    16

    1. '5' + 3
    2. '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

    1. (function(){
    2. var x = y = 1;
    3. })();
    4. console.log(y);
    5. console.log(x);
     

     y是全局。

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

    1. var a = 10;
    2. function test() {
    3. a = 100;
    4. alert(a);
    5. alert(this.a);
    6. var a;
    7. alert(a);
    8. }
    9. test();
     

     答案是 100 10 100

    因为

    1. var a = 10;
    2. function test() {
    3. var a;
    4. a = 100;
    5. alert(a);
    6. alert(this.a);
    7. //var a; 声明提前
    8. alert(a);
    9. }
    10. test();
     

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

    最后统一说一下吧。

    1. var a = 100;
    2. function test(){
    3. alert(a);
    4. var a = 10;
    5. alert(a);
    6. }
    7. test();
     

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

    1. var a = 100;
    2. function test(){
    3. alert(a);
    4. a = 10; //去掉了var 就变成定义了全局变量了
    5. alert(a);
    6. }
    7. test();
    8. alert(a);
     

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

    26

    记住即可

    27同15

    28,29, pass

    30

    1. function foo() { }
    2. var oldName = foo.name;
    3. foo.name = "bar";
    4. [oldName, foo.name]
     

     function的name问题。

    1. function foo() {}
    2. alert(foo.name)
    3. var foo2 = function (){}
    4. alert(foo2.name)
     

     那这道题呢?

    答案是 foo,undefined。

    因为第二个是吧匿名函数复制给了foo2,所以没有name。

    谢谢周同学为我解惑。

    31 同1

    32 同30

    33 pass

    34

    1. [,,,].join(", ")
     

     arr允许最后一个为逗号。

    还记得那个最简单的验证ie浏览器的代码吗?

    !+[1,]

    就是因为低版本(9以前?忘记了)的bug,[1,]在ie下toString是1,而不是1。

    35

    别用关键字,总不会出问题。

    ok,大概就这些。在说一下这里面很少涉及的this问题。

    构造函数是有作用域的

    所以

    a,b() 这种类型的作用域就是a。

    但是····要记住this只在执行时才会绑定,所以

    当你把a.b 付给了c时候,this有指向了全局了···

    那么如果这样呢?

    里面外面都是一样的,当你执行的是 func() 的时候,都会指向全局。

    好啦,恶心人的东西解决完了,如果有错误或者补充,希望下面留言。

    原文链接:http://www.gbtags.com/gb/share/5839.htm

  • 相关阅读:
    Netty Nio启动全流程
    线性表
    java stream 原理
    SpringBoot 分布式session
    mockito
    RxJava
    HandlerMapping 详解
    SpringMVC 架构
    Spring Cloud 配置服务
    SpringBoot常用配置简介
  • 原文地址:https://www.cnblogs.com/gbtagscom/p/4983232.html
Copyright © 2020-2023  润新知