# web前端javascript综合水平测试

## 填空
1. javascript 由   ECMAscript，DOM   ，BOM   ，三部分组成，简单介绍一下这三部分

   ECMAscript :javascript 的核心，描述了js基本语法和数据类型，是一套 标准

   DOM: 文档对象模型，dom通过节点树来创建文档，使开发者对文档节点控制力提高

   BOM: 对浏览器窗口的访问和操作

2. 检测数据类型的方式有   typeof ，instanceof     ， Object.prototype.toString.call()     ，  三种方式什么区别

   区别：typeof 可以对JS基本数据类型做出准确的判断（除了null），而对于引用类型返回的基本上都是objec

   instanceof判断对象和构造函数在原型链上是否有联系，如果有返回true 没有返回false

   toString是Object原型对象上的一个方法，该方法默认返回其调用者的具体类型，更严格的讲，是 toString运行时this指向的对象类型, 返回的类型

   格式为[object xxx],xxx是具体的数据类型

   

3. 检测NaN的数据类型结果为    number 

4. js中 对象转json的方法为  JSON.stringfy()  ， json格式转对象的方法为  JSON.parse()

5. js 浏览器对象模型包括  window  ，location    ，navigator    ，history   ，screen  ，五部份 分别介绍一下这5部分

   window 全局作用域

   location 对窗口url的信息

   navigator 提供浏览器信息

   history 提供历史访问记录

   screen 用户显示器相关信息

6. var a=1;console.log(a++) 运行的结果为：  1

7. js运算符的优先级  从高到低为： () > .,[]  函数调用()  >  后置递增（a++）后置递减（a--）>逻辑非 !  + -  前置递增(++a) 前置递减(--a)  typeof > * /  % > - +  > 小于 (<)  小于等于(<=)  大于(>)  大于等于(>=)  in  instanceof >等于(==)  非等于(!=)   全等(= = =)   非全等（!= =）>&& ||   >?:  >赋值相关>，

8.    js设置属性和属性值的方法为  setattribute()

9. 五大主流浏览器及内核

   1、IE浏览器内核：Trident内核，也是俗称的IE内核；
    2、Chrome浏览器内核：统称为Chromium内核或Chrome内核，以前是Webkit内核，现在是Blink内核；
    3、Firefox浏览器内核：Gecko内核，俗称Firefox内核；
    4、Safari浏览器内核：Webkit内核；
    5、Opera浏览器内核：最初是自己的Presto内核，后来是Webkit，现在是Blink内核

10. jq ajax基本结构及解释

    $.ajax({

    ​	url:""  请求地址

    ​	type:"" 请求方式

    ​	datatype:"" 后台返回的数据格式

    ​	success 回调函数

    })

11. 本地缓存的增删改查

    localstorage.setitem()

    localstorage.getitem()

    localstorage.clear()

    localstorage.removeitem()

12. jq选择器列举

    ``` 
    $("#id") $(".class")  $("标签")  $([属性]) $(A,B) ...
    ```

    

## 指出下面代码运行结果并分析其执行过程

1 . 
```
 function a(n) {
            if (n <= 1) {
                return 1
            } else {
                return n * a(n - 1)
            }
        }
        console.log(a(5))

        var cheng=a
        a=null
        console.log(cheng(5))

```
报错 cheng is not a function 

a是个递归函数 ，cheng 等于a  执行到内部的时候会调用a(5-1)  但是这时候a 已经被赋值成null了

2 

```
function C1(name) {
        if (name) {
            this.name = name;
        }
    }

function C2(name) {
        this.name = name;
    }

function C3(name) {
        this.name = name || 'join';
    }
C1.prototype.name = 'Tom';
C2.prototype.name = 'Tom';
C3.prototype.name = 'Tom';
alert((new C1().name) + (new C2().name) + (new C3().name));

```

Tomundefinedjoin

new c1 this指向 c1的实例对象，没有传参就不执行 this.name的赋值  所以 取name的时候要从原型中取  即tom

c2 new的时候传得值为空  但是没有判断过直接赋值  所以  c2函数中的 this.name 就直接被赋值成了 undefined

c3函数中赋值的时候 判断了name参数是否为空  如果为空的话就赋成默认值 join



3

```
function fn()  
{  
    this.user = '追梦子'; 
    var obj={user:"momo"}
    return {};  
}
var a = new fn;  
console.log(a.user);

```

undefined

new fn 的时候生成 的实例是fn的返回值 也就是{} 空对象

从空对象中找不到 a.user的值

4

```
 window.color = 'red';
        document.color = 'yellow';

        var s1 = {color: 'blue' };
        function changeColor(){
            console.log(this.color);
        }

        changeColor.call();       
        changeColor.call(window);  
        changeColor.call(document); 
        changeColor.call(this);     
        changeColor.call(s1);      


```

red 

red 

yellow 

red 

blue



call() 不加参数的时候 this指向window，其他的参数是谁就指向谁







## 简答题

1. 说明call,apply,bind 的区别

bind 不会立即调用 而是返回一个新函数  

call/apply 会立即调用  返回的是函数调用后的结果

call 传参数的时候 函数需要的参数可以一个一个传

apply 函数需要的参数只能写成类数组的形式 [a,b,c]




2. js的typeof的返回值有哪些

number, boolean, string, undefined, object, function,symbol.



3. 说出数组相关的几个方法并说明作用

push()  向数组最后面添加一个元素

pop()  删除数组最后面的元素 并返回这个被删除的值

shift()  删除第一个元素

unshift()  向数组开头添加一个元素

...

4. ajax请求时的get、post的区别

AJAX GET和POST的区别

**ajax** 请求的时候**get 和post** 方式的**区别**? **GET**请求会将参数跟在URL后进行传递，而**POST**请求则是作为HTTP消息的实体内容发送给WEB服务器。 **GET**请求有数据长度限制，而**POST**没有。 **GET**方式请求的数据会被浏览器缓存起来，**POST**没有



5. 如何阻止浏览器的默认事件

```
event.preventDefault()
或 return false
```


6. 如何阻止事件冒泡

```
event.preventDefault()
或return false

```



7. == 和===的区别

== 只比较数值大小 不比较数据类型 会发生隐式类型转换

===  不发生类型转换 会比较数据类型


8. 局部变量和全局变量的区别

全局变量是整个程序都可访问的变量，生存期从程序开始到程序结束；局部变量存在于模块中(比如某个函数)，只有在模块中才可以访问，生存期从模块开始到模块结束。
 全局变量分配在全局数据段，在程序开始运行的时候被加载。局部变量则分配在程序的堆栈中。因此，操作系统和编译器可以通过内存分配的位置来知道来区分全局变量和局部变量。



## 通过代码实现下面要求（略）
1. 通过原型链实现对象继承








2. js手动实现 jq的链式操作







3. 做一个网页计算器  实现输入两个数 完成加减乘除四则运算





4. 实现一个打点计时器，要求
    1、从 start 到 end（包含 start 和 end），每隔 100 毫秒 console.log 一个数字，每次数字增幅为 1（start 和end为用户输入）
    2、返回的对象中需要包含一个 cancel 方法，用于停止定时操作






5. 在页面上将下面的json数据，需要放到表格里
json数据为：
[{"title":"史莱姆1号","auth":'咖啡不放糖',"content":"别看我只是一直史莱姆","date":"2020/03/05"},{"title":"史莱姆2号","auth":'咖啡不放糖',"content":"别看我只是一直史莱姆","date":"2020/03/05},{"title":"史莱姆3号","auth":'咖啡不放糖',"content":"别看我只是一直史莱姆","date":"2020/03/05"},{"title":"史莱姆4号","auth":'咖啡不放糖',"content":"别看我只是一直史莱姆","date":"2020/03/05"},{"title":"史莱姆5号","auth":'咖啡不放糖',"content":"别看我只是一直史莱姆","date":"2020/03/05}]

注： title对应文章标题，auth 对应的是作者 ， contnet对应的是简介  date对应的是日期









6. 实现 fizzBuzz 函数，参数 num 与返回值的关系如下：
1、如果 num 能同时被 3 和 5 整除，返回字符串 fizzbuzz
2、如果 num 能被 3 整除，返回字符串 fizz
3、如果 num 能被 5 整除，返回字符串 buzz
4、如果参数为空或者不是 Number 类型，返回 false
5、其余情况，返回参数 num
