JS学习日记 Day 6

学习视频是Link老师的教程:黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程_哔哩哔哩_bilibili


一、进阶——内存

0、存储机制
    //简单数据类型存储于栈中,复杂数据类型存储于堆中
1、垃圾回收机制
    1.1、引用计数法
        //观察对象是否有指向他的引用,没有了就回收(不再使用的对象)
        //手动释放:数组/对象 = null
        //问题:循环引用会导致无法回收,以至于内存泄漏
        //现代浏览器已不再使用引用计数法
    1.2、标记清除法
        //从根部触发扫描内存中的对象,若找不到则回收(无法达到的对象)
2、闭包
    //指内层函数访问外层函数的变量
    //作用:使外部能访问函数内部的变量
    //使用结构:
    //function outer(){
    //    let a=10;
    //        functioin fn()
    //        {
    //               console.log(a)         
    //        }
    //        return fn                        
    //}
2.1、闭包的应用
    //实现数据的私有:调用一次使数据自增一次
    //function count(){
    //    let i = 0;
    //    function zz(){
    //         i++;
    //       cousole.log(i);
    //    }
    //    return dy;
    //}
    //问题:同样是容易引起内存泄漏

二、进阶——参数

1、用于接收任意长度形参的伪数组
    arguments[]:
    //注:没有数组的pop、push等方法
    //    但是可以用length
    //用于实参数量不确定时
2、剩余参数
    ...name:
    //同样是用于数组长度不确定时
    //是一个真数组
3、展开运算符
    ...name:
    //用在数组前,用于将数组的每一项展开
    //是一个很强大的功能
4、箭头函数
    =>:
    const fun = () =>{console.log(1)}
    const fun = x =>{console.log(x)}
    const fun = (x,y) =>{console.log(x+y)}
    //注:只有一行代码时,大括号可省略
    const fun = (x,y) =>console.log(x+y)
    //注:箭头函数可以直接返回一个对象
    const fun = (uname) =>({name:uname})
    //注:箭头函数中没有arguments,但是有展开
    null
    //注:箭头函数的this并不指向调用它的对象
    //    而是使用上一层作用域的this

三、进阶——解构

1、数组解构
    const arr = [100,60,80];
    const [max,min,avg] = arr;
    //也可使用剩余参数
    const arr = [1,2,3,4,5]
    const [a,b,...c]=arr;
    //c=[3,4,5]
    //也可使用二维数组
    const arr = [1,2[3,4]];
    const [a,b,[c,d]] = arr;
    //也可跳过参数
    const arr = [1,2,3];
    const [a,,c] = arr;
    //a=1,c=3
2、对象解构
    //解构属性和方法
    const{uname,age} = {uname:'pink', age:18}
    //等价于 const uname = obj.uname
    //变量名和属性必须一模一样
    //解构的变量名不能和外面的变量相同
    const{uname:username,age} = {uname:'pink',age:18}
    //可以用:改名

3、数组对象解构
    const person = [
        {
            name:'佩奇';
            family:{
                mother:'dad';
                father:'father'; 
                sister:'qiaozhi';      
            },
            age:6;                    
        }    
    ]
    
    const [{name,family:{mother}}] = person;
四、进阶——对象
1、创建
    1.1、const obj = {name

四、进阶——对象

1、创建
    1.1、const obj = {name:"谷歌"}
    1.2、const obj = new Object()
    1.3、构造函数创建法
         1.3.1、用于快速创建类似的对象
             function Pig(name,age,gender){
                 this.name = name;
                 this.age = age;
                 this.gender = gender;             
             }
             
             const Peppa = new Pig('佩奇',6,女);
             const George = new Pig('jo治',3,男);
             
             //注:只能由new来实例化
             //    开头要用大写字母
2、构造函数
    //没有参数时可以省略()
    //内部无需写return,返回值为新创建的对象
3、new实例化
    //实例化过程:
    //    1、创建空对象
    //    2、构造函数this指向新对象
    //    3、执行构造函数代码
    //    4、返回新对象
4、内置构造函数
    4.1、Object
        4.1.1、Object.keys(对象):获取对象中的所有属性(键)
               返回的是一个数组
        4.1.2、Object.values(对象):获取对象中的所有值()
        4.1.3、Object.assign(新对象,原对象):拷贝()
               //常用于给对象添加属性
               //Object.assign(new,{gender:'女'})
    4.2、Array
        4.2.1、forEach():遍历数组,不返回数组
        4.2.2、filter():过滤数组,返回满足条件的数组元素
        4.2.3、map():迭代数组,返回新数组
        4.2.4、reduce():累计器,返回累计处理的结果
               arr.reduce(function(){},起始值)
               arr.reduce(function(上一次值,当前值){},起始值)
               //若对对象使用,则必须设置初始值
               //如:
               const arr = [{
                   name:'张三',
                   salary:10000               
               },{
                   name:'李四',
                   salary:10000               
               }]
               const total = arr.reduce((prev,current)=>{
                   return prev + current.salary               
               },0)
        4.2.5、方法汇总
                join:将数组元素拼接为字符串*
                find:查找并返回第一个符合条件的元素值,没有则返回underfined*
                every:检测是否所有元素都符合条件,若都符合则true,否则false*
                some:检测是否有元素满足条件,若有则true,否则false*
                sort:排序
                splice:删除或替换原数组单元
                findIndex:查找索引值
        4.2.6、部分方法示例
               1、find
                   arr.find(function(item){
                       return item.name==='华为';             
                   })
                   arr.find(item => item.name === '小米')
                2、every
                    arr.every(function(a,b){
                        return a>b;                    
                    })
                    arr.every((a,b) => a>b)
                3、Array.from()
                    Array.from(伪数组)
                    //将伪数组转换成真数组
    4.3、String
        4.3.1、常见方法
                length:获取长度*
                split('分隔符'):用于将字符串拆成数组*
                substring(开始索引,结束索引):用于字符串截取*
                str.startsWith(要搜索的字符串,str搜索的起始位置)
                str.includes(要搜索的字符串,str搜索的起始位置'):判断数组中是否有指定的值(区分大小写)
                toUpperCase:小写转大写
                toLowerCase:大写转小写
                indexOf:检测是否包含某字符
                replace:用于替换字符串
    4.4、Number
        .toFixed(number):保留几位小数

五、进阶——对象(续)

1、prototype(原型对象)
    //每个构造函数都有一个prototype属性,它指向另一个对象
    //这个对象可以挂载函数,对象实例化不会多次创建原型上函数,节约内存
    //建议将不变的方法定义在prototype上,这样所有对象的实例都可以共享这些方法
    function Star(uname,age){
        this.uname = uname;
        this.age = age;
        //this.sing = function(){
        //    console.log('唱歌')}
        //方法建议不要写在构造函数里                         
    }
    Star.prototype.sing = function(){
        console.log('唱歌')
        //建议将方法以及要共享或不需要修改的属性挂在原型上
    }
2、constructor
    //每一个原型对象都有一个指向它自身的构造函数,即是constructor
    //若直接以
        Star.prototype = {
             sing:function(){
                 console.log('唱歌')             
             },
             dance:function(){
                 console.log('跳舞')             
             },       
        }                    
    //对原型函数赋值的话,会直接覆盖constructor,使其失去
    //所以若要以直接赋值来写原型函数,需要加上constructor: Star
    //即:
         Star.prototype = {
             constructor:Star;
             sing:function(){
                 console.log('唱歌')             
             },
             dance:function(){
                 console.log('跳舞')             
             },       
        }      
        或者
        Star.prototype.constructor = Star
              
3、__proto__
    //对象原型,指向原型对象
    //用来指明当前实例对象指向哪个原型对象prototype
    //__proto__内部也有一个constructor,指向创建该实例的构造函数
    //在浏览器里显示是[[Prototype]]

六、进阶——继承

1、思想:增加封装性,提升代码复用性
     如:
        function Person(){
            this.eyes = 2;
            this.head = 1;  
        }

        function Woman(){
        }

        function Man(){
        }

        Woman.prototype = new Person();
        //将Person的实例挂到Woman上
        Woman.prototype.constructor = Woman;
        //使Woman的原型函数的构造函数重新指回自身
        Man.prototype = new Person();
        Man.prototype.constructor = Man;

        Woman.prototype.baby = function(){
            console.log('baby');
        }

        const red = new Woman();
        console.dir(red);

七、进阶——原型链(说实话这块我做的很烂,建议直接看pink老师的视频……)

 //首先,我们使用
     function Person(){}
     //创建了一个对象
     Person.prototype.sing = function(){
         console.log('baby');     
     }
     //然后,我们使用
     const red = new Person();
     //创建了对象的实例
     
     随后,
     console(red.__proto__)
     //相当于Person.prototype
     //指向原型对象
     console(red.__proto__.constructor)
     //指向Person构造函数本身
     //相当于Person.prototype.constructor
     console(Person.prototype.__proto__)
     //相当于Object.prototype
     //因为__proto__指向创建它的原型对象
     //而Person是自定义的函数,创建它的原型对象便是Object
     console(Object.prototype.__proto__)
     //得到null
     
     red.__proto__ === Person.prototype
     //指向它的原型对象
     Person.prototype.__proto__ === Object.prototype
     //指向原型对象
     Object.prototype.__proto__ === null
     //到头了,所以返回null

2、instanceof:用于检测某个原型函数的prototype属性是否出现在某个实例对象的原型链上
    //如:
    red instanceof Person
    //因为red是Person的实例,在Person的原型链上,所以返回true
    [1,2,3] instanceof Array
    1 instanceof Number
    {a:"a"} instanceof Object
    //都为true
    
    function C(){}            
    const o = new C();
    o instanceof C     //true

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值