一、变量解构
变量6种声明的方式:var、let、const、import、class、function
- 什么是变量解构?
从数组或者对象中获取值,并将值赋值,则称为变量解构,分为完全结构,不完全结构,结构错误 - 作用:
2.1 能迅速获取数据
2.2 代码清晰
2.3 对函数参数初始化赋值 - let、const和var区别:
var会进行变量提升,即在变量声明前可以赋值;
let变量声明前会形成暂时性死区,从而形成块级作用域,有点类似于闭包
const也会形成暂时性死区,从而形成块级作用域,而且该变量无法修改 - 顶层对象
在浏览器中指:window,浏览器的窗口对象;在系统中指:global;
js最大的败笔就是将全局变量和顶层变量挂钩了,不利于模块化编程。 - Iterator接口
Map、Set、Array、Object是集合,那么遍历集合就是一个基本要求,而Iterator则提供了一种统一的接口机制,任何的数据结构部署Iterator接口机制即可以遍历。
Map、Set、Array默认是带有Iterator接口机制的,Object是没有,原因:Map数组等是线性结构,有一定的顺序,先遍历谁后遍历谁,都是特定的,但是Object没有确切的数据顺序,需要先转换成线性结构才能部署Iterator接口
二、函数扩展
1、函数参数默认值
- 能够迅速看到哪些参数是可以省略,不用查看函数或文档
- 促进后期维护,当不需要传参时,不会引起报错
2、与解构赋值默认值结合使用
3、函数length属性
- 此处的length返回值是函数减去了默认赋值的参数数量
4、作用域
- 因为有参数进行声明初始化,则会形成一个作用域context
5、函数只要使用了默认值、变量解构、或者扩展运算符,那么函数内部就不能显式设定为严格模式。
- 原因:函数内部的严格模式,同时适用于函数体和函数参数。但是,函数执行的时候,先执行函数参数,再执行函数体
6、rest参数
- 形式为…变量名:用于获取函数的多余参数,这样就不需要引入arguments,rest参数是一个数组,将多余的参数放入数组中
三、原型链
1、javascript是一种基于原型的语言——每个对象都拥有一个原型,对象以其原型为模板、从原型继承方法和属性。原型对象中也有可能存在原型,层层剥离,从而形成原型链:这就是为什么一个对象中会拥有定义为其他对象中的属性和方法。
2、constructor属性
- 每个实例对象都从原型中继承了一个constructor属性,该属性指向了用于构造此实例对象的构造函数。
3、对象:唯一有继承
- 每个实例对象都有一个私有属性(称之为__proto__)指向它的原型对象,该原型也有一个自己的原型对象,层层向上直到一个对象为null。而null没有原型,作为原型链中的最后一个环节。
4、介绍下三位大哥
原型中还有原型
- prototype:原型对象,下的constructor指向的是自己
- constructor:构造函数指向的是子类
- proto:原型指向的是子类的原型对象
四、柯里化函数
1、所谓"柯里化",就是把一个多参数的函数,转化为单参数函数
2、不立即计算,延后执行
3、符合计算的条件,将缓存的参数,统一传递给执行方法
4、当一个变量需要转换类型时,会调用自身的valueOf,如果调用失败则会去调用toString()
五、函数式编程
1、开始:数学的范畴论,跟数理逻辑、微积分、行列式是一类东西,都是数学方法,碰巧用来写编程
2、函数式又分为:纯函数(不会引出额外的问题),非纯函数(会:比如改变全局变量,改变参数值,传出参数值)
3、开始数学只是去输入一个值,原始目的就是求值,不做其他事情,否则无法满足函数运算法则,所以函数式编程要求函数必须是纯的。
4、函子是函数式编程里最重要的数据类型,也是基本的运算单位和功能单位。
5、函数的调用,尾调用会形成一个调用栈,尾调用即是函数的最后一步操作。
6、递归是非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生‘栈溢出’错误。
7、递归和尾递归
- 递归:指的是程序调用自身的编程技巧,一般递归是需要有边界条件,满足条件时,为递归前进,不满足则递归返回。
六、工程化
组件化指的是在设计层面上,对ui进行拆分,从而形成若干个组件,页面是最大的组件,而dom是最小的组件;
模块化指的是讲一个大文件拆分成相互依赖的小文件,再进行统一的拼装和加载。
自动化指的是用很多工具来帮我们完成工作。
规范化指的是规范一些方式,减少后期维护工作:
- 目录结构制定
- 编码规范
- 前后端接口规范
- 文档规范
- 代码模块化管理
- ui组件管理
- git分支管理
- commit描述规范
- 定期code review
- 视觉图标icon规范
- 服务部署
- 打包规范
- 框架使用管理