- 作用域(scope)
- 局部作用域(local)
- 函数作用域:只能在函数内部使用
- 块作用域:{}比如for循环里定义的;let和const会产生块作用域、var不会
- 全局作用域(global):script标签和js文件里声明的变量
- 作用域链:变量查找机制(就近原则)
- JS垃圾回收机制(GC)
- JS中内存的分配与回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收
- 全局变量不会回收(关闭页面会被回收),局部变量自动回收
- 内存泄漏:分配的内存无法回收
- 算法:栈(基本数据类型)和堆(复杂数据类型)
- 引用计数法
- 本质:看一个对象是否有指向它的引用
- 如果两个对象互相引用(循环引用)会导致内存泄露
- 标记清除法
- 从根部(JS全局对象)出发定时扫描内存中的对象,能够到达的都是还需要使用的
- 引用计数法
- 闭包(closure)
- 内层函数+外层函数的变量
- 外部可以访问函数内部的变量(内层函数使用了外层的变量,外层返回这个内层函数,调用外层函数他的返回值实则就是内层函数)
- 典型应用:统计函数调用次数
- 作用:封闭数据,实现数据私有,外部也可以访问函数内部的变量,允许将函数与其所操作的某些数据关联起来,但是会引起内存泄漏
- 内层函数+外层函数的变量
- 变量提升:把所有var声明的变量提升到当前作用域的最前面,只提升声明不提升赋值(没有声明就使用变量会报语法错误,但是如果后面用var声明了,会成uundefined)只有var有
- 局部作用域(local)
- 函数进阶
- 函数提升:类似变量提升,函数表达式(匿名函数赋值)不存在提升
- 函数参数(不知道会传几个参数)
- 动态参数: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:改成什么名
- 很多个属性,前面只需要写一个变量名就能选出来
- 数组对象解构:以及多级对象解构
- 等价于const uname = obj.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属性是否出现在某个实例对象的原型链上
- 编程思想
JS进阶(部分)
最新推荐文章于 2024-04-22 19:06:30 发布