Administrator
发布于 2021-01-28 / 5463 阅读 / 0 评论 / 0 点赞

ES6练习题二

ES6练习题(二)

  • 出题人:杨标
  • 时间:2021年1月26日
  • 适用班级:H2003
  • 主要内容:ECMAScript6

  1. 说出至少5个ES6的新特性,并简述它们的作用。(简答题)

    这个题目多半会在面试的时候问

    • letconst变量与常量的定义
    • 解构
    • 展开运算符,for...of,迭代器,生成器
    • Symbol数据类型
    • 数组的扩展find/findIndex,Array.of,Array.from(),Array.prototype.fill()
    • 模块字符串
    • 函数的扩展,箭头函数,无构造函数的函数,函数默认值,rest参数
    • Proxy代理与Reflect反射
    • SetMap这是ES6新出的数据结构
    • class关键字与extends继续,static静态,get/set访问器属性
    • Promise异步的处理方式
    • 模块化
  2. 使用解构赋值,实现两个变量的值的交换(编程题)。

    let [a,b] = [1,2];
    [b,a]=[a,b];		//这样就实现了值的交换
    
  3. 解释一下什么是暂时性死区?(简答题)

    它是在使用let/const在定义变量的时候一种特殊的情交

    let a = "hello";
    function abc(){
        console.log(a);		//这里就是暂时性的列区
        let a = 123;
    }
    
  4. 利用数组推导,计算出数组 [1,2,3,4] 每一个元素的平方并组成新的数组

    let arr = [1,2,3,4].map(item=>item**2);
    
  5. 用箭头函数的形式改写下面的代码。(ES5 to ES6改写题)

    arr.forEach(function(v,i) {
        console.log(i);
        console.log(v);
    });
    
    arr.forEach((v,i)=>{
        console.log(i);
        console.log(v);
    })
    

    上面的题目无非就是让我们把普通函数改写成箭头函数

  6. 设计一个对象**,键名的类型至少包含一个symbol类型,**并且实现遍历所有key。(编程题)

    let stu = {
        userName: "邓娜",
        sex: "女",
        age: 18,
        [Symbol("第一个")]: "hello",
        [Symbol("第二个")]: "world"
    }
    Reflect.ownKeys(stu).forEach(item=>{
        console.log(item);
    })
    

    这个地方的重点就在在于Reflect.ownKeys()这个方法可以获取普通的属性,数字的属性(索引),还可以获取Symbol的属性,这个方法就相当于我们之前所学习的Object.keys()以及Object.getOwnerPropertySymbols()两个方法的结合

    扩展Reflect.ownKeys()能不能够找到enumerable:false的属性?????

  7. 有一本书的属性为:{“name”:“《ES6基础系列》”, ”price”:56 };要求使用Proxy对象对其进行拦截处理,name属性对外为“《ES6入门到懵逼》”,price属性为只读。(练习题)

    let _book = {
        name: "《ES6基础系统》",
        price: 56
    }
    //要实现拦截 代理 ,
    
    let book = new Proxy(_book, {
        get(target, property, receiver) {
            if (property == "name") {
                return "《ES6入门到懵逼》";
            }
            else {
                return target[property];
            }
        },
        set(target, property, value, receiver) {
            if (property == "price") {
                return;
            }
            else {
                target[property] = value;
            }
        },
        deleteProperty(target, property, receiver) {
            if (property == "price") {
                return;
            }
            delete target[property];
        }
    })
    
    console.log(book.name);
    book.price = 0;
    console.log(book.price);
    
  8. 关于Set结构,阅读下面的代码,回答问题**。(代码阅读题)。**

    let s =new Set();
    s.add([1]);
    s.add([1]);
    console.log(s.size);		//2
    

    问:打印出来的size的值是多少?

    分析:这个题目的本质其实就是让同学们去判断一下[1]==[1]两个对象在判断相等的时候是根据它的内存地址来判断的

  9. 关于Map结构,阅读下面的代码,回答问题。(代码阅读题)

    let map = new Map();
    map.set([1], "ES6系列");        //这里的[1]是一个对象       [1]相当于是new Array.of(1);
    let con = map.get([1]);         //这里的[1]又是一个对象     new Array.of(1);
    //我们每次new的都是一个新的对象,每个对象地址是不一样的啊,所以这个地方取不到
    console.log(con);           //undefined
    
  10. 定义一个类Animal,通过传参初始化它的类型,如:“猫科类”。它有一个实例方法:run,run函数体内容可自行定义。

    class Animal {
        constructor(type) {
            this.type = type;
        }
        run() {
            console.log(`我是${this.type}动物,我在跑`);
        }
    }
    let a = new Animal("猫科类");
    a.run();
    
  11. 基于上一题的Animal类,定义一个子类Cat并继承Animal类。初始化Cat类的昵称name和年龄age。并拥有实例方法eat,eat函数体内容可自行定义

    class Cat extends Animal {
        constructor(type, name, age) {
            super(type);
            this.name = name;
            this.age = age;
        }
        eat() {
            console.log(`我的名子叫${this.name},我的年龄是${this.age},我属于${this.type}动物,我在吃东西`);
        }
    }
    let c = new Cat("猫科类", "小花", 5);
    c.eat();
    

评论