蓝桥杯Web组备赛笔记4

目录

一、es6新增特性

1、定义常量及其简单的使用

2、set()函数

3、构造器

4、构造函数

二、高阶函数

1、filter():过滤器

2、find()

三、13届蓝桥真题 (9)

1、解题思路

2、拓展find()原理

四、数据劫持

1、第一种:ES6前,vue2数据响应式的原理

2、第二种Proxy


学习es6前,小编有本ES6入门教程推荐给小伙伴们学习🧐

ES6 入门教程https://es6.ruanyifeng.com/


一、es6新增特性

1、定义常量及其简单的使用

<script>
    const a = new Set()
    a.add(1)//添加1
    a.add(2)
    console.log(a);
    console.log(a.has(1));//判断a中是否有1
</script>

 2、set()函数

(1)数组内容不能重复,其成员的值都是唯一

(2)根据这个特性,可以很好的用于去重

<script>
    const a = new Set()
    const arr = [2, 3, 5, 4, 5, 2, 2]    //实际定义const arr = new Array([1,2,3,6,3,2,6])
    arr.forEach(function(e){    //forEach相当于一个迭代器
        a.add(e)
    })
    console.log(a);
</script>

3、构造器

<script>
    class Person{//通过class定义了一个Person
        constructor(name,sex,age){
            this.name = name
            this.sex = sex
            this.age = age
        }
        run(){
            console.log('个人信息:'+this.name);
        }
    }
    const people = new Person('申小兮','男',18)
    people.run()
</script>

<script>
    class Person{//通过class定义了一个Person
        constructor(name,sex,age){
            this.name = name
            this.sex = sex
            this.age = age
        }
        run(){
            console.log('个人信息:'+this.name);
        }
    }
    
    Person.prototype.run = function(){
        console.log('被我改掉了吧');
    }

    const people = new Person('申小兮','男',18)
    people.run()
</script>

 4、构造函数

<script>
    function Text(text){
        this.text = text
        this.log = function(){
            console.log('这是打印内容:'+this.text);
        }
        function run(){
            console.log(this.text);
        }
    }

    Text.prototype.add = function(){
        console.log("Text的add方法");
    }

    Text.prototype.run = function(){
        console.log('又被改掉了吧');
    }

    const text = new Text('申小兮')
    text.log()
    text.add()
    text.run()

</script>


二、高阶函数

1、filter():过滤器

(1)会返回一个新数组

(2)相当于迭代器,自身会进行一次循环

(3)return后是真 / 假值

<script>
    const arr = [1,2,3,4,5,6,7]
    const newArr = arr.filter((e)=>{
        return e<5
    })
    console.log(newArr);
</script>

 2、find()

(1)返回值是一个对象

(2)当找到对应值时,返回第一个满足的,找不到对应值时,返回undefined

<script>
    const arr = [
        {
            "name": "申小兮",
            "age": 18
        },
        {
            "name": "张三",
            "age": 14
        },
        {
            "name": "李四",
            "age": 69
        },
        {
            "name": "王五",
            "age": 38
        }
    ]
    // arr.find(e=>{
    //     return e.name === "申小兮"
    // })
    const obj = arr.find(e => e.name === "申小兮")
    console.log(obj);
</script>

三、13届蓝桥真题 (9)

1、解题思路

(1)由上面构造函数的学习,我们知道myarray.js中是自定义了一个myarray函数,并且有一个返回值cb相对于filter的返回参数

// 返回条件为真的新数组
Array.prototype.myarray = function (cb) {
  // TODO:待补充代码
};

(2)我们知道filter执行后会返回一个新数组,那么在这个自定义函数中,我们也应该定义一个新数组newArr,然后返回这个新数组newArr

// 返回条件为真的新数组
Array.prototype.myarray = function (cb) {
  // TODO:待补充代码
  const newArr = []

  return newArr
};

(3)这时候我们知道filter相对于迭代器,会有自身的循环,那么我们也可以在函数中对该对象的数据进行循环

// 返回条件为真的新数组
Array.prototype.myarray = function (cb) {
  // TODO:待补充代码
  const newArr = []
  this.forEach(e=>{
    if(cb(e)){
      newArr.push(e)
    }
  })

  return newArr
};

2、拓展find()原理

(1)按照上题的思路,会有以下情况

<script>
    const arr = [
        {
            "name": "申小兮",
            "age": 18
        },
        {
            "name": "张三",
            "age": 14
        },
        {
            "name": "李四",
            "age": 69
        },
        {
            "name": "王五",
            "age": 38
        }
    ]
    Array.prototype.myFind = function(cb){
        this.forEach(e=>{
            if(cb(e)){
                return e
            }
        })
        return undefined
    }
    console.log(arr.myFind(e => e.name === "申小兮"));
</script>

出现这个问题是因为forEach是个迭代器,不允许return来跳出该循环,所以这时候就用普通的for循环

<script>
    const arr = [
        {
            "name": "申小兮",
            "age": 18
        },
        {
            "name": "张三",
            "age": 14
        },
        {
            "name": "李四",
            "age": 69
        },
        {
            "name": "王五",
            "age": 38
        }
    ]
    Array.prototype.myFind = function(cb){
        for(let i = 0;i<this.length;i++){
            if(cb(this[i])){
                return this[i]
            }
        }
        return undefined
    }
    console.log(arr.myFind(e => e.name === "申小兮"));
</script>


四、数据劫持

1、第一种:ES6前,vue2数据响应式的原理

直接处理原数据

<script>
    let obj = {
        name:'申小兮',
        age:18,
    }
    //defineProperty数据拦截
    Object.defineProperty(obj,'age',{
        get(){
            return '我不告诉你年龄'
        },
        set(newval){
            return newval
        }
    })
    console.log(obj.name);
    console.log(obj.age);
</script>

 2、第二种Proxy

通过new一个Proxy实例对象,让它代理去拦截原数据的某元素

(1)于第一种不同的是,这里的get(),set()都有三个参数

<script>
    let obj2 = {
        name:'张三',
        age:48,
    }
    
    let objProxy = new Proxy(obj2,{
        get(target,prokey,self){
            console.log(target);
            console.log(prokey);
            console.log(self);
        },
        set(target,prokey,self){
        }
    })
    console.log(objProxy.name);
</script>

 (2)通过控制get()的return值,编写给用户看到的内容

<script>
    let obj2 = {
        name:'张三',
        age:48,
    }
    
    let objProxy = new Proxy(obj2,{
        get(target,prokey,self){
            console.log(target);
            console.log(prokey);
            console.log(self);
            return target[prokey]
        },
        set(target,prokey,self){
        }
    })
    console.log(objProxy.name);
</script>

 (3)set()可以实现是否允许用户改值

<script>
    let obj2 = {
        name:'张三',
        age:48,
    }
    
    let objProxy = new Proxy(obj2,{
        get(target,prokey,self){
            console.log('get',target);
            console.log('get',prokey);
            console.log('get',self);
            return target[prokey]
        },
        set(target,prokey,self){
            console.log('set',target);
            console.log('set',prokey);
            console.log('set',self);
            if(prokey === 'age'){//不让改age值
                throw "你都这么老了,改不动了,不让改了"    //当检测到用户改age值时,抛出异常
            }else{
                target[prokey] = self
            }
        }
    })
    objProxy.name = '李四'
    objProxy.age = '3'
    console.log(objProxy.name);
    console.log(objProxy.age);
</script>

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五秒法则

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值