js面试知识点汇总

1.什么是闭包?举例说明
从作用域链谈闭包
闭包就是能够读取其他函数内部变量的函数,
闭包实现累加效果

function addcount(){
      var num = 0;
      return function(){
              return num += 1;
        }
}
var add = addcount();
console.log(add());
console.log(add());


3.冒泡机制实现数组排序 从小到大

var arr = [7,4,9,1,6,2];
function sortAt(num){
        for(var i = 0 ;i < arr.length-1; i++ ){
                    for(var j = i+1; j < arr.length;j++){
                                var v = arr[i]; //前一个的值
                                if(v > arr[j]){
                                          var index = arr[j]; //后一个的值
                                            arr[i] = index;
                                            arr[j] = v;
                                }
                      }
        }
        return arr;
}
console.log(sortAt(arr));


6.Js实现继承的方法

第一种方法,借用构造函数实现继承

function Person(){
            this.name = "nana"
}
function Teacher(){
         Person.call(this);
         this.type="teacher";
}

Teacher无法继承Person的原型对象,并没有真正的实现继承(部分继承);

第二种方法,借用原型链实现继承

function Person(){
          this.name = "nana";
          this.play = 123;
}
function Teacher(){
         this.type="teacher";
}
Teacher.prototype = new Person();

7.DOM事件

DOM事件模型是什么:指的是冒泡和捕获;
DOM事件流是什么:捕获阶段 => 目标阶段 => 冒泡阶段
DOM事件捕获的具体流程:window=>document=>html标签=>body=>目标对象

8.事件委托

事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。


           
  • item1

  •        
  • item2

  •        
  • item3

var list = document.getElementById("list");
list.addEventListener('click',function(event){
         event = event || window.event;
         var target = event.target || event.srcElement;
         if(target.nodeName == "LI"){
                   alert(target.innerHTML);
         }
})

9.事件监听

.onclick 常规的事件绑定只执行最后绑定的事件
btn.addEventListenter('click',function(){})  //可绑定多个事件
btn.attachEvent("onclcik",function(){})


10.ajax跨域

ajax出现请求跨域错误问题。主要是因为浏览器的“同源策略”。同源策略指的是协议相同,域名相同,端口相同。
如何解决ajax跨域问题
1.jsonp。客户端网页通过添加了一个script元素,向服务器请求json数据,这种做法不受同源政策;
2.代理请求方式解决接口跨域问题;配置proxy

11.mouseover 和 mouseenter的区别
mouseover,当指针穿过被选元素和子元素时,都会被触发;
mouseenter ,当指针穿过被选元素时会被触发;

12.行内点击事件改变样式

onclick="style.backgroundColor ='red';style.Color='#333';"

13.js中判断JSON数据是否存在某字段的方法

方法一: !('key'  in  obj)
方法二:obj.hasOwnProperty('key') 

15.作用域知识点

window.val = 1;
var json = {
      val:10,
      a:function(){
              this.val *= 2;
              return this.val;
      }
}
console.log(json.a()); 
var a = json.a;   
console.log(a()); 
json.a.call(window); 
console.log(json.a()); 
console.log(window.a()) ;  
//20
//2
//40
//8

16.作用域知识点
a方法里作用域属于window环境,所以此时,val的的值属于window.val  =1 ;

;(function(){
       var val = 1;
       var json = {
              val:10,
              a:function(){
                         val *= 2;
               }
       };
     json.a();  
     console.log(json.val + val)   
}())

//12


18.原型链继承知识点
B继承A.prototype原型链上的方法;但属性不继承;
构造函数如果有属性时,会先找构造函数里的属性值,如果没有,继续找prototype上是否有属性一值;

function A(x){
        this.x = x;
}
A.prototype.x = 1;
function B(x){
        this.x =x;
}
B.prototype = new A();
var a = new A(2);
var b = new B(3);
delete b.x;
console.log(a.x);
console.log(b.x);
// 2
//undefined

22. 下面的代码会输出什么?为啥?

for(var i = 0; i < 5; i++) {
        setTimeout(
             function() { console.log(i);
        }, i * 1000 );
}
输出5个5



25.神马是 NaN,它的类型是神马?怎么测试一个值是否等于 NaN?
NaN   (Not a Number 它不是一个数字) 类型是Number, isNaN()    
isNaN(23)  //false  isNaN('true')   //true

26.值类型和引用类型的区别
值类型 :将变量中的数据完整的拷贝一份,赋值给新的变量
var num = 123; var num1 = num;
console.log(num + num1)   //123,123
num = 1;
console.log(num + num1) //1,123
引用类型:表示变量存储的是数据的地址,复制时只是把地址复制一份,同时指向数据
var o ={n:123}; var o1 = o;
console.log(o.n + o1.n); //123,123
o1.n = 1;
console.log(o.n + o1.n); //1,1

27.深拷贝和先拷贝

浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变。
深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
function deepCopy (data) {   
           return JSON.parse(JSON.stringify(data));
}

28.call和apply方法;
作用:.改变执行上下文 实现继承
第一个参数 指向的是一个对象(调用对象),只是apply的参数只有2个,第2个参数其实是一个伪数组
function superClass () {
            this.a = 1;
            this.print = function () {
                   console.log(this.a);
            }
}
function subClass () {
            superClass.call(this);
            this.print();
}
subClass();

29.cmd和amd 的区别 
cmd和amd都是模块开发的一种规范(模块定义规范),amd加载模块是提前加载模块,cmd是延迟加载,就近加载
define(function(require,exports,module{
         var    a=require('./a')
         a.doSomething()
         var    b=require('./b')
         b.doSomething();
})  //cmd
define(['./a','./b'],function(a,b){
     a.doSomething()
     b.doSomething()
})  //amd

html&&css

1.alt和title的异同

alt是图片加载失败时,显示在网页上替代的字;搜索引擎对图片的判断,主要是靠alt属性。以简要文字说明,同时包含关键字。

title是鼠标放在图片上,显示的文字,是对图片进一步的说明;

2.简述一下src和href的区别;

href用于锚点或者文档之间的链接,用于超链接;

src指向外部资源的位置,指向的内容将会嵌套在文档中当前标签所在位置;例如img,script;

3.html5新元素;

新的表单控件;date、time、email

新的特殊内容标签;footer、header、nav、aside

对本地离线储存有了更好的支持;

用于媒介回放的video和audio;

4.什么是css hack

针对不同的浏览器写不同的css,就是css hark;

ie7 *background:blue; ie5 _background:red;

前缀加_或者*......

5.px和em的区别

px的值是固定的,是绝对单位,指定多少是多少,写出来的大小只能和设计稿上的一样;

em的值是相对于父级,是个相对元素,每次换算可能费点时间,考虑父元素的设置大小;

rem是相对元素,指相对于根元素也就是html;html{font-size:62.5%}  h1{font-size:2.4rem}

6.html5离线储存

localStorage :长期储存数据,浏览器关闭后数据也不会丢失

sessionStorage :数据在浏览器关闭后自动删除;

7.移动端事件延迟300毫秒的问题

为什么会有300毫秒的延迟等待时间;这与双击缩放的方案有关;浏览器捕获第一次单击后。会先等待一段时间,如果这段时间里,用户进行了第二次单击操作,则浏览器会进行双击事件处理;如果没有,则进行单击事件的处理。

解决方案1:meta标签禁止缩放

解决方案2:fastclick.js

8.服务器返回状态了解

301,302 重定向;

304 带缓存刷新;

500 服务器错误;

你可能感兴趣的:(js面试知识点汇总)