美文网首页
Javascript 面试经典 (二)

Javascript 面试经典 (二)

作者: 清酒08 | 来源:发表于2022-05-15 22:06 被阅读0次

    Promise消除回调地狱

    方法一:

    /*需要借助Promise来消除回调嵌套       链式调用*/
    let promiseAjax = function(json) {
        return new Promise((resolve, reject) => {
            $.ajax({
                url: json.url,
                dataType: json.dataType,
                type: 'json',
                success(data) {
                    resolve(data);
                },
                error(err) {
                    reject(err);
                }
            })
        })
    }
    promiseAjax({
        url: '1.json',
        type: 'get',
        dataType: 'json',
    }).then(data => {
        console.log(data);
    }).catch(erro => {
    
    })
    
    

    方法二:

    /* 当所有的异步全部成功之后才会执行then,只要有一个异步执行失败,就会执行catch    all([promise,....]).then(allData = >{}).catch(err =>{})  */
    let promiseAjax = url => {
        return new Promise((resolve, reject) => {
            $.ajax({
                url,
                dataType: 'json',
                success(data) {
                    resolve(data)
                },
                error(err) {
                    reject(err)
                }
            })
        })
    }
    let p1 = promiseAjax('1.json');
    let p2 = promiseAjax('2.json');
    Promise.all([p1, p2]).then(resolve => {
        console.log(resolve)
    })
    
    //jQuery3.X版本之后ajax方法中会自动返回一个Promise对象
    

    Export 和 export default的区别

    1. export与export default均可用于导出常量、函数、文件、模块等
    2. 在一个文件或模块中,export、import可以有多个,export default仅有一个
    3. 通过export方式导出,在导入时要加{ },export default则不需要
      1. 输出单个值,使用export default
      2. 输出多个值,使用export
      3. export default与普通的export不要同时使用

    Export 和 module.export的区别

    通常exports方式使用方法是:

    exports.[function name] = [function name]
    

    moudle.exports方式使用方法是:

    moudle.exports= [function name]
    

    这样使用两者根本区别是

    exports 返回的是模块函数

    module.exports 返回的是模块对象本身,返回的是一个类

    使用上的区别是

    exports的方法可以直接调用

    module.exports需要new对象之后才可以调用

    面向对象的继承

    ES6继承

    Class A extends B{
        Constructor(){
            Super();
        }
        方法名(){
            Super.方法名();
        }
    }
    

    ES5继承

    // 原型链式继承
    function SuperType() {
    
        this.property = true;
        
    }
    
    SuperType.prototype.getSuperValue = function () {
    
        return this.property;
        
    }
    function SubType() {
    
        this.subpropertype = false;
        
    }
    
    SubType.prototype = new SuperType();
    
    SubType.prototype.getSubValue = function () {
    
        return this.subpropertype;
        
    }
    
    var ins = new SubType();
    
    console.log(ins.subpropertype);//false
    
    console.log(ins.getSuperValue());//true
    
    
    
    //构造函数式继承
    
    function SuperType(){
    
        this.color=['1','2','3','4'];
        
    }
    function SubType(){
    
        SuperType.call(this);
        
    }
    
    var ins1=new SubType();
    
    ins1.color.pop()
    
    console.log(ins1.color);//[1,2,3]
    
    var ins2=new SubType()
    
    ins2.color.push('5');
    
    console.log(ins2.color);//[1,2,3,4,5]
    

    优点:可以在子类型构造函数中向超类型构造函数传递参数

    缺点:在超类型的原型中定义的方法,对子类型而言也是不可见的,结果所有类型都只能ES6的新特性

    Function Parent (){
    }
    
    Parent.prototype=function fn(){
    
    }
    
    Function Child(){
            Parent.apply(this,arguments)
    }
    

    New关键字的作用

    // 因为JS中,对象都是new 对应的函数()创建出来的,

    // new 关键字对函数的影响(new关键字到底做了什么):

    // 1.在该函数内部创建一个对象

    // 2.函数内部的this指向创建出来的的这个对象

    // 3.对象的proto指向函数的prototype

    // 4. 函数默认返回该对象

    作用域链和原型链

    作用域链

    当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain,不简称sc)来保证对执行环境有权访问的变量和函数的有序访问。

    简单来说外面的不能访问作用域里定义的变量,作用域里定义的变量可以访问上级作用域的变量。

    原型链

    当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。原型链的末尾就是Object对象。

    相关文章

      网友评论

          本文标题:Javascript 面试经典 (二)

          本文链接:https://www.haomeiwen.com/subject/tooburtx.html