Javascript 基础 And 进阶

2019-11-22  本文已影响0人  chang_遇见缘

(一)

知识点:

原型链

面试题(一):

var F = function() {};
Object.prototype.a = function() {
  console.log("aa");
};
Function.prototype.b = function() {
  console.log("bb");
};
var f = new F();
F.a();  //aa
F.b();  //bb
f.a();   //aa 
f.b();   // 抱错,f.b is not a function

面试题(二):

function A() {
    this.name = 'a'
    this.color = ['green', 'yellow']
}
function B() {
}
B.prototype = new A()
var b1 = new B()
var b2 = new B()

b1.name = 'change'
b1.color.push('black')
console.log(b2.name)   // a 
console.log(b2.color)  // green yellow black

this指向(有四种)

第一种:方法调用

var age = 38;
var obj = {
    age: 18,
    getAge: function() {
        console.log(this.age);
    }
};
obj.getAge(); 
--------------------------------------------------
// 变式:
var fn = obj.getAge;
fn();   

第二种:函数调用,里面的this指向的是window

var age = 38;
var obj = {
    age: 18,
    getAge: function() {
        var fn = function() {
            console.log(this.age);
        };
        fn();
    }
};
obj.getAge();

第三种:构造函数调用:this指向调用它的对象

var age = 38;
var obj = {
    age: 18
};

var getAge = function() {
    console.log(this.age);
};
obj.get = getAge;
obj.get(); 

第四种:上下文调用模式,this指向谁?指向的是传入的对象

call 和 apply

作用域和预解析

let var const 函数作用域 {}

new 关键字的作用

1、在函数里面创建一个对象obj

2、将函数里面的this指向创建的那个对象obj

3、返回这个obj对象

综合面试题:

function Foo() {
    getName = function(){ alert(1); };
    return this; 
}

Foo.getName = function() { alert(2); };
Foo.prototype.getName = function(){ alert(3); };
var getName = function() { alert(4); };
function getName(){ alert(5); }

Foo.getName();            
getName();                 
Foo().getName();           
getName();                 
new Foo.getName();         
new Foo().getName();       
new new Foo().getName();   

闭包

闭包的概念:

闭包的使用场景:

闭包的问题:让变量得不到释放,增加内存使用率

var counter = (function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  };   
})();

DOM 事件

给DOM 添加点击事件:

区别:onclick 会覆盖相同的事件,addEventListener会逐一的触发

DOM 事件三要素: 事件源, 事件类型, 事件处理程序

事件流程: 冒泡,捕获

继承

ES5的继承

1、构造函数实现继承

    function Parent(){
             this.name = "parent"
        }
    Parent.prototype.aa=function(){}
    function Child(){
         Parent.call(this)
         this.type ="child"
    }
    console.log(new Child())

2、借助原型是实现继承

    function Parent(){
        this.name = "parent"
        this.arr = [1,2,3]
    }
    function Child(){
        this.type = "child"
    }
    Child.prototype = new Parent()
    var A = new Child()
    var B = new Child()
        
    A.arr.push(4)
    console.log(A,B)

3、组合方式实现继承

function Parent(){
    this.name = "parent"
    this.arr = [1,2,3]
}
function Child(){
    Parent.call(this)
    this.type = "child"
}
Child.prototype = Object.create(Parent.prototype)
Child.prototype.construcotr = Child
var A = new Child()
var B = new Child()

A.arr.push(4)
console.log(A,B)

ES6的继承

class People{
        constructor(name,age){
             this.name = name
             this.age = age
        }
    eat(){
    }
}
class Student extends People{
    constructor(id,name,age){
        super(name,age)
        this.id = id
    }
}

(二、js高级部分)

BOM

浏览器的内核

IE: trident内核

Firefox:gecko内核

Safari:webkit内核

Opera:Blink内核

Chrome:webkit

DOM事件

DOM的事件模型: 捕获----> 冒泡

DOM的事件流(三个阶段):捕获阶段---->目标阶段 -----> 冒泡阶段

DOM事件捕获的具体流程:

window---document---html---body---.... ---目标元素

DOM事件的Event对象的常见应用:

DOM的自定义事件:

var  eve = new Event('eventName')
dom.addEventListener('eventName',function(){
})  //注册事件
dom.dispatchEvent(eve);   // 触发事件,
---------------------------------------------------------
这个事件不能添加参数,想要添加参数,得自定义 CustomEvent事件
// 添加一个适当的事件监听器
obj.addEventListener("cat", function(e) { process(e.detail) })
// 创建并分发事件
var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}})
obj.dispatchEvent(event)

Promise 和async/awiat

  1. Promise的作用,promise如何进行多个数据的请求

  2. Promise.all([p1, p2, p3]).then()

  3. Promise.race([p1, p2, p3]) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝

    var p3 = new Promise(function(resolve, reject) { 
        setTimeout(resolve, 100, "three");
    });
    var p4 = new Promise(function(resolve, reject) { 
        setTimeout(reject, 500, "four"); 
    });
    
    Promise.race([p3, p4]).then(function(value) {
      console.log(value); // "three"
      // p3 更快,所以它完成了              
    }, function(reason) {
      // 未被调用
    });
    

4.async/awiat的错误处理

```js
async function f() {
  //  throw new Error('try again');
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}
async function b() {
    try {
      await f();
    } catch(err) {
     console.log(err);
      b();
    }
}
b();    
```

防抖与节流

防抖(debounce):

​ 就是在一定的时间内事件只发生一次,比如你点击button按钮,1秒内任你单身30年手速点击无数次,他也还是只触发一次。

<body>
 <button id="debounce">防抖</button>
 <script>
 window.onload = function () {
  let obtn = document.getElementById('debounce'); //获取按钮
  obtn.addEventListener('click',debounce,false); //监听绑定事件
 }
 //执行函数
 let timer
 function debounce() {
    clearTimeout(timer); 
    timer = setTimeout(function(){ 
        console.log('防抖,防抖,防抖');
  },300)
 }
 </script>
</body>

使用场景:当你在页面中使用onkeyUp监听用户在input框中的输入,如果用户按住一个6不放,那监听事件岂不是一直被触发,这样就浪费了一部分性能了,那么我们在一定事件内监听,也就是说我过了一秒再来看看你输入了多少个6

节流(throttle):
节流就是在一定时间间隔内触发一次事件

面试题目:

上一篇 下一篇

猜你喜欢

热点阅读