JS进阶(部分)

  • 作用域(scope)
    • 局部作用域(local)
      • 函数作用域:只能在函数内部使用
      • 块作用域:{}比如for循环里定义的;let和const会产生块作用域、var不会
    • 全局作用域(global):script标签和js文件里声明的变量
    • 作用域链:变量查找机制(就近原则)
    • JS垃圾回收机制(GC)
      • JS中内存的分配与回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收
      • 全局变量不会回收(关闭页面会被回收),局部变量自动回收
      • 内存泄漏:分配的内存无法回收
      • 算法:栈(基本数据类型)和堆(复杂数据类型)
        • 引用计数法
          • 本质:看一个对象是否有指向它的引用
          • 如果两个对象互相引用(循环引用)会导致内存泄露
        • 标记清除法
          • 从根部(JS全局对象)出发定时扫描内存中的对象,能够到达的都是还需要使用的
    • 闭包(closure)
      • 内层函数+外层函数的变量

      • 外部可以访问函数内部的变量(内层函数使用了外层的变量,外层返回这个内层函数,调用外层函数他的返回值实则就是内层函数)

      • 典型应用:统计函数调用次数
      • 作用:封闭数据,实现数据私有,外部也可以访问函数内部的变量,允许将函数与其所操作的某些数据关联起来,但是会引起内存泄漏
    • 变量提升:把所有var声明的变量提升到当前作用域的最前面,只提升声明不提升赋值(没有声明就使用变量会报语法错误,但是如果后面用var声明了,会成uundefined)只有var有
  • 函数进阶
    • 函数提升:类似变量提升,函数表达式(匿名函数赋值)不存在提升
    • 函数参数(不知道会传几个参数)
      • 动态参数:arguments伪数组接过来,只存在于函数当中
      • 剩余参数:(...随意数组名)

        • 展开运算符:展开一个数组 比如log(...arr),不会修改原数组;比如Math.max(...arr)求数组最大值、合并数组【...arr1,...arr2】
      • 区别:剩余参数(a,b,...arr)获取的是多余的参数,是个真数组,arguments是个伪数组
    • 箭头函数(适用于原本使用匿名函数的地方)()=》{ } 参数=》代码
      • 语法

      • 参数:只有剩余参数...
      • 箭头函数this
        • 不会创建自己的this,只会从作用域的上一层沿用
        • 对象方法箭头函数的this,谁调用的obj/对象的方法
  • 解构赋值
    • 数组解构
      • 将数组的单元值批量赋值给一系列变量

      • ;【b,a】=【a,b】
      • 必须加分号两种情况:立即执行函数后和上面使用数组前
      • 三种情况:1、防止变量多成undefined一般设置默认值【a=1】,2、变量少可以用剩余参数解决【a,b,...c】3、按需导入赋值,直接逗号隔开留空 ;3、多维数组结构

    • 对象解构
      • 等价于const uname = obj.uname 属性名和变量名必须一致

      • 解构更改变量名uname:改成什么名
      • 很多个属性,前面只需要写一个变量名就能选出来
      • 数组对象解构:以及多级对象解构

  • 构造函数
    • 深入对象
      • 创建对象三种方式
        • 利用对象字面量创建对象(直接定义)
        • 用Object创建对象
        • 构造函数(创建对象)函数名首字母要大写
          • 语法

          • 使用new关键词调用函数都被称为实例化
          • 没有参数可以省略()
          • new Date() 也是实例化构造函数
      • 实例化执行过程
        • 创建新对象
        • 构造函数this指向新对象
        • 执行函数代码,修改this,添加新的属性
        • 返回新对象
      • 实例成员和静态成员
        • 构造函数创建的对象叫做实例对象,它里面的属性和方法是实例成员
        • 构造函数的属性和方法称为静态成员,只能构造函数来调用比如Math.PI
    • 内置构造函数
      • 比如str,js底层函数已经构造好了是对象,所以可以使用str.length
      • Object 内置构造函数,用于创建普通对象,但是推荐使用字面量创建对象,以下三个常用静态方法,只有Object能用
        • .keys(对象的变量名)获得属性名和
        • .value(对象变量名)获得属性值
        • .assign(a,b)对象拷贝函数 把b拷贝给a 比如给对象添加新的属性
      • Array 用于创建数组,数组也建议用字面量创建
        • foreach()和map()遍历数组和迭代数组
        • filter(function(){return})返回筛选满足数组条件的数组
        • reduce(回调函数(上一次的值,当前值),【起始值】)累计器,经常用于求和
        • join()拼接字符串+find()查找元素并返回第一个 + every()每一个都要满足条件返回true
        • 伪数组转换成真数组Array.from(数组)
      • String
        • length、split(拆分)、substring(索引号,)截取字符传、startsWith(检测是否以某字符开头)
      • Number
  • 深入面向对象
    • 编程思想
      • 面向过程:分析出问题所需要的步骤,然后函数把这些步骤一步步实现、使用时再一个一个依次调用
      • 面向对象(oop):把事务分解成一个个对象,然后由对象之间分工合作(以对象功能划分)特性:封装继承多态
    • 构造函数(同样的结构不同的对象):体现了封装性
    • 原型
      • 利用原型对象实现方法或属性的共享,,this指向实例化的对象每一个构造函数都有一个prototype,属性写到构造函数里面
      • 每个prototype和_proto_里都有一个constructor属性,指向构造函数
      • 对象原型(_proto_只读指向原型对象(prototype)的属性和方法)实例对象的对象原型===构造函数的原型对象

      • 原型继承:使用构造函数(抽取相同的属性和方法)和原型对象=new 父类来继承以及constructor指回自己的构造函数

      • 原型链:基于原型对象的继承,使不同构造函数的原型对象关联在一起

      • 原型链是一种查找规则,为了对象成员查找机制提供了一条线路,想要使用一个对象的属性和方法,如果当前对象没有,就会查找它的原型,如果依旧没有,就查找原型对象的原型,一直到object的原型对象(null)。
      • instanceof:检测构造函数的prototype属性是否出现在某个实例对象的原型链上
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值