最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • ES6基础面试之四大问

    正文概述 掘金(Hecate)   2021-03-11   410

    ES6基础面试整理

    • 开发环境已经普及使用
    • 浏览器环境却支持不好(需要开发环境编译)
    • 重点了解常用语法
    • 关注:开发环境的使用+重点语法的掌握

    问题1 ES6模块化如何使用,开发环境如何打包?

    模块化的使用和编译环境

    模块化-export语法

    //utils1.js
    export default{
        a:100
    }
    
    //utils2.js
    export function fn1(){
        alert('fn1')
    }
    
    export function fn2(){
        alert('fn2');
    }
    
    // index.js
    import utils1 from './utils1.js'
    import {fn1,fn2} from  './utils2/js'
    
    console.log(utils1);
    fn1();
    fn2();
    

    模块化-开发环境- babel

    • 电脑要有node环境,运行npm init

    • npm install --save-dev babel-core babel-preset-es2015 babel-preset-latest

    • 创建 .babelrc文件

    • npm install --global babel-cli

    • babel --version

    • 创建 ./src/index.js

    模块化-开发环境- webpack

    • npm install webpack babel-loader --save-dev
    • 配置 webpack.config.js
    • 配置package.json中的script
    • 运行 npm start

    模块化-开发环境 -rollup

    官网: rollupjs.org/guide/en/

    中文官网:www.rollupjs.com/guide/intro…

    • npm init

    • npm i --save-dev rollup-plugin-node-resolve rollup-plugin-babel babel-plugin-external-helpers babel-preset-latest babel-core

    • 配置 .babelrc

    • 配置 rollup.config.js

    • rollup功能单一,webpack功能强大。

    • 参考设计原则和《Linux/Unix设计思想》

    • 工具要尽量功能单一,可集成,可扩展

    关于JS众多模块化标准

    • 没有模块化
    • AMD成为标准, require.js(也有CMD(国内的标准))
    • 前端打包工具,是nodejs模块化可以被使用(CommentJS标准)
    • ES6出现, 想统一现在所有模块化标准
    • nodejs积极支持,浏览器尚未统一
    • 你可以自造lib,但是不要自造标准。

    问题解答:

    • 语法: import export(注意有无default)
    • 环境: babel编译ES6语法,模块化可用webpack和rollup
    • 扩展:说一下自己对模块化标准统一的期待

    问题2 Class何普通构造函数有何区别?

    • class怎么用,语法是什么?
    • class和构造函数的对比?有何优缺点。

    JS构造函数回顾

    例子:react例子

    // Ad 继承了 React.Component
    class Ad extends React.Component{
        //构造函数
        constructor(props){
            super(props);
            this.state = {
                data:[]
            }
        }
        render(){
            return {
                <div>hello imooc</div>
            }
        }
        componentDidMount(){
            
        }
    }
    

    JS构造函数:

    //构造函数
    function MathHandle(x,y){
        this.x = x;
        this.y = y;
    }
    // 原型的扩展
    MathHandle.prototype.add = function(){
        return this.x + this.y;
    };
    
    // 创建一个构造函数的实例
    var m = new MathHandle(1,2)
    console.log(m.add()) //所有的构造函数的实例都会有其原型扩展的方法
    

    Class基本语法

    /**
     * class形式
     */
    class MathHandle{
        constructor(x,y){
            this.x = x;
            this.y = y;
        }
    
        add(){
            return this.x + this.y;
        }
    }
    
    const m = new MathHandle(1,2);
    console.log(m.add());
    

    语法糖

    
    class MathHandle{
        // ...
    }
    
    typeof MathHandle //“function”
    MathHandle === MathHandle.prototype.constructor; //true
    // 这种语法糖形式,看起来和实际原理不一样的东西。(个人不太赞同)(原本class的含义)
    // 形式上强行模仿 java C#,却失去了它的本性和个性。
    
    

    语法糖,两者本质是一样的,然后用一种更简洁的方式去实现相同的功能。

    // 构造函数的显式原型的constructor属性等于构造函数本身
    MathHandle.prototype.constructor === MathHandle // true
    // 构造函数new出来的实例有一个隐式的原型, 等于构造函数的原型
    m.__proto__ === MathHandle.prototype; // true
    

    ES6基础面试之四大问

    继承

    从抽象到聚象的关系,从高级到低级的关系

    //普通JS版本继承
    // 动物
    function Animal(){
        this.eat = function(){
            console.log('animal eat');
        }
    }
    
    // 狗
    function Dog(){
        this.bark = function(){
            console.log('dog bark');
        }
    }
    
    Dog.prototype = new Animal();
    
    //哈士奇
    var hashiqi = new Dog();
    hashiqi.bark();
    hashiqi.eat();
    

    用class实现继承

    class Animal{
        constructor(name){
            this.name = name;
        }
    
        eat(){
            console.log(`${this.name} eat`)
        }
    }
    
    class Dog extends Animal{
        constructor(name){
            super(name);
            this.name = name;
        }
        say(){
            console.log(`${this.name} say`);
        }
    }
    const dog = new Dog('哈士奇')
    dog.say()
    dog.eat()
    

    总结

    • class在语法上更加贴合面向对象的写法
    • class 实现继承更加易读、易理解
    • 更易于写java等后端语言的使用
    • 本质还是语法糖,使用prototype

    Promise的基本使用和原理。

    • Callback Hell(回调地狱)
    • Promise的语法

    Callback Hell

    function loadingImg(src, callback, fail){
        var img = document.createElement('img');
        img.onload = function(){
            callback(img);
        }
        img.onerror = function(){
            fail();
        }
        img.src = src;
    }
    var src = "https://profile.csdnimg.cn/9/F/8/3_april_4";
    loadingImg(src,function(img){
        console.log(img.width);
    },function(){
        console.error('failed');
    })
    
    

    Promise语法改造

    使用promise改造后的方法:

    function loadingImg(src){
        const promise = new Promise(function(resolve,reject) {
            var img = document.createElement('img')
            img.onload = function(){
                resolve(img);
            }
            img.onerror = function(){
                reject();
            }
            img.src = src;
        })
        return promise;
    }
    
    var src = "https://profile.csdnimg.cn/9/F/8/3_april_4";
    var result = loadingImg(src);
    result.then(function(img){
        console.log(img.width);
    },function(){
        console.log('failed');
    });
    result.then(function(img){
        console.log(img.height);
    });
    
    • promise的基本使用是什么?

    promise问题总结

    • new Promise 实例,而且要return
    • new Promise 时要传入函数,函数要有resolve reject两个参数
    • 成功时执行resolve(),失败时执行reject()
    • then监听结果

    总结一下ES6的其他常用功能

    (3~5)

    • let/const (变量/常量)
    • 多行字符串/模版变量
    • 解构赋值
    • 块级作用域
    • 函数默认参数
    • 箭头函数

    let/const

    //js
    var i = 10;
    i = 100;
    
    var j = 20;
    j = 200;
    
    //ES6
    let i = 10; // 变量
    i = 100;
    
    const j = 20; // 常量
    j = 200;
    
    

    解构赋值

    //js
    var obj = {a:100,b:200}
    var a = obj.a;
    var b = obj.b;
    
    var arr = ['xxx','yyy','zzz'];
    var x1 = arr[0];
    
    
    // ES6
    
    const obj1 = {a:10,b:20,c:30};
    const {a1,c1} = obj1;
    
    console.log(a1);
    console.log(c1);
    
    const arr1 = ['xxx','yyy','zzz'];
    const [x,y,z] = arr1;
    
    console.log(x);
    console.log(y);
    console.log(z);
    

    块级作用域

    //js
    var obj = {a:100,b:200}
    for(var item in obj){
        console.log(item) //a,b
    }
    console.log(item); //b
    
    // ES6
    const obj1 = {a:100,b:200}
    for(let item1 in obj1){
        console.log(item1); // a,b
    }
    console.log(item1) //报错,item1 is not defined;
    

    函数默认参数

    //js
    function something(a,b){
        if(b==null){
            b = 0;
        }
    }
    
    //ES6
    function something2(a,b=0){
        
    }
    

    箭头函数

    //js
    var arr = [1,2,3];
    arr.map(function(item){
        return item +1;
    })
    
    //ES6
    const arr1 = [1,2,3];
    arr1.map( item => item+1);
    
    arr1.map((item,index) => {
        console.log(index);
        return item +1;
    })
    

    起源地下载网 » ES6基础面试之四大问

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元