项目工程化中的–save-dev 和 –save 的区别
安装模块和插件时,都写入package.json文件:
-
–save-dev : 写入devDependencies 对象,用于开发环境
-
-save : 写入dependencies 对象,用于生产环境
document.forms返回HTMLCollection对象,是所有form元素的集合
var collection = document.forms;
document.forms['myForm'].submit();
Number()转换为数字类型
Number(undefined) === NaN
Number(null) === 0
Number(object) === NaN
面向对象的JavaScript
JavaScript是基于原型的面向对象语言,所有的对象都有一个原型来继承其方法和属性,并且通过原型链来继承
通过构造函数实例化对象,每个构造函数,就包含了一个原型对象
在构造函数中,可以使用this访问正在创建的对象,this保存指向该新对象的引用
其特点是:抽象,封装,继承,多态
常见的设计模式
1.单例模式
核心结构中只包含一个被称为单例类的特殊类
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源
应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案
2.工厂模式
工厂模式主要是为创建对象提供了接口
应用场景:
-
在编码时不能预见需要创建哪种类的实例
-
系统不应依赖于产品类实例如何被创建、组合和表达的细节
3.策略模式
定义了算法族,分别封装起来,让它们之间可以互相替换;此模式让算法的变化独立于使用算法的客户。
应用场景:
-
一件事情,有很多方案可以实现
-
可以在任何时候,决定采用哪一种实现
-
未来可能增加更多的方案
-
策略模式让方案的变化不会影响到使用方案的客户
实例场景:
- 系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。
4.观察者模式( 发布/订阅模式 )
定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
应用场景:
-
对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变
-
对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节
5.迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示
应用场景:
- 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子
6.模板方法模式
定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
应用场景:
- 对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的
7.装饰器模式
允许向一个现有的对象添加新的功能,同时又不改变其结构。
这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
应用场景:
- 扩展一个类的功能
- 动态增加功能,动态撤销
8.外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
应用场景:
- 为复杂的模块或子系统提供外界访问的模块
- 子系统相对独立
- 预防低水平人员带来的风险
9.代理模式
一个类代表另一个类的功能。
这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
10.抽象工厂模式
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
11.建造者模式
使用多个简单的对象一步一步构建成一个复杂的对象。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
应用场景:
- 需要生成的对象具有复杂的内部结构
- 需要生成的对象内部属性本身相互依赖。
12.组合模式(部分整体模式)
用于把一组相似的对象当作一个单一的对象
组合模式依据树形结构来组合对象,用来表示部分以及整体层次
这种类型的设计模式属于结构型模式,它创建了对象组的树形结构
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式
13.MVC 模式(代表 Model-View-Controller(模型-视图-控制器)模式)
这种模式用于应用程序的分层开发
- Model(模型)- 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器
- View(视图)- 视图代表模型包含的数据的可视化
- Controller(控制器)- 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图它使视图与模型分离开
14.适配器模式
作为两个不兼容的接口之间的桥梁
这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
数据库事务的四个特性及含义 ACID
原子性(Atomicity)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Correspondence)
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性(Isolation)
并发的事务是相互隔离
即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到
假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况
持久性(Durability)
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
数据库应用系统中三种不同的数据模型
1.概念模型(E-R模型)
为了实现用户的需求定义的模型,主要是初步表达用户需求
2.逻辑模型
按照用户观点对数据进行建模,主要用于数据库设计
3.物理模型
表示数据在系统内部的表示方法和存取方法,实现数据的物理存储。包括数据的存储位置,索引存放位置,存储文件位置和存储策略等存储细节问题
逻辑模型具体包括: 层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化模型等
半结构化模型:
数据有些是完全无结构的数据,比如声音文件、图像文件等;
有些则具有严谨的结构,比如关系型数据库中的数据;
还有一类是结构状态介于以上两种数据之间的数据,这种数据具有一定的结构,但结构不规则、不完整,或者结构是隐含的, 比如HTML文档,我们把这类数据称为半结构化数据。 有关半结构化数据还没有一个统一的定义。
半结构化模型分为基于树的模型、基于图的模型、基于逻辑的模型、基于关系的模型、基于对象的模型;
进程控制
是计算机中的程序关于某数据集合上的一次运行活动;
是系统进行资源分配和调度的基本单位;
是操作系统结构的基础
进程(又称为进程实体)由三部分组成:PCB(进程控制块)、程序段和相关数据段
PCB中主要包含以下四方面的信息:
1)进程标识符
2)处理机状态(又称处理机上下文)
3)进程调度信息:存储当前进程的进程状态、进程优先级、进程调度所需的其他信息(与调度算法有关的信息如进程等待CPU的时间、已执行的时间等)和事件(从执行状态到阻塞状态的原因)
4)进程控制信息:用于进程控制的信息,包括:程序和数据的地址、进程同步和通信机制、资源清单和链接指针(该进程所在队列中的下一个PCB的首地址)
进程的阻塞(block)和唤醒(wakeup)
引起进程阻塞和唤醒的事件 :
- 向系统请求共享资源失败
- 等待某种操作的完成
- 新数据尚未到达
- 等待新任务的到达
进程的挂起(suspend)与激活(active)
1)进程的挂起
- 检查被挂起的进程的状态
- 若是活动就绪状态,便将其改成静止就绪;若是活动阻塞状态,便将其改成静止阻塞
- 为方便用户或父进程考察该进程的运行情况,而把该进程的PCB复制到某指定的内存区域
- 若被挂起的进程正在执行,则转向调度程序重新调度
2)进程的激活
- 将进程从外存调入内存,检查该进程的现行状态
- 若是静止就绪,便将其改为活动就绪;若是静止阻塞,便将其改为静止就绪
- 假如采用的是抢占调度策略,则每当有静止就绪进程被激活而加入就绪队列时,便检查是否需要重新调度,即由调度程序将被激活的进程和当前进程两者优先级进行比较
- 若被激活进程优先级低,则不必重新调度;若当前进程优先级低,则把处理机分配给被激活的进程
进程三态模型
三种基本状态:
1)就绪(Ready)状态
2)执行(Running)状态
3)阻塞(Block)状态
进程五态模型
通常在引入两种状态:创建状态和终止状态
寄存器主要包括:
通用寄存器:用于暂存信息(大多数处理机有8~32个)
指令计数器:存放将要访问的下一条指令的地址
程序状态字PSW:是运算器的一部分,分两类:一种是体现当前指令结果如是否有进位、是否为零,另一种是存放控制信息如允许中断、跟踪标志等
用户栈指针:每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址,栈指针则是指向该栈的栈顶
参考:https://blog.youkuaiyun.com/sdr_zd/article/details/78748497
软件生命周期
-
问题定义
-
可行性研究
-
需求分析
-
开发阶段
开发阶段由四个阶段组成:概要设计 – 详细设计 – 实现 – 测试
- 维护
维护包括四个方面:改正性维护、适应性维护、完善性维护、预防性维护
js中遍历数组的方法:
-
for循环
-
forEach() :没有返回值,不改变原数组
-
map() :可以return返回值,不改变原数组
-
for…of
-
filter() :不改变原数组,返回新数组
-
every() :都返回true,则为true
-
some() :有一个为true,则为true
-
reduce() :接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值
函数有四个参数,分别是:上一次的值,当前值,当前值的索引,数组
reduce
还有第二个参数,我们可以把这个参数作为第一次调用callback
时的第一个参数,上面这个例子因为没有第二个参数,所以直接从数组的第二项开始[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){ return previousValue + currentValue; },5); //最终结果为15(5+0+1+2+3+4)
-
reduceRight():
reduceRight()
方法的功能和reduce()
功能是一样的,不同的是reduceRight()
从数组的末尾向前将数组中的数组项做累加 -
find() :返回数组中符合测试函数条件的第一个元素。否则返回undefined
-
findIndex() : 对于数组中的每个元素,findIndex 方法都会调用一次回调函数(采用升序索引顺序),直到有元素返回 true。只要有一个元素返回 true,findIndex 立即返回该返回 true 的元素的索引值。如果数组中没有任何元素返回 true,则 findIndex 返回 -1
-
keys() 、values()、entries()
ES6 提供三个新的方法 —— entries(),keys()和values() —— 用于遍历数组
它们都返回一个遍历器对象,可以用for…of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
参考:https://www.cnblogs.com/woshidouzia/p/9304603.html
加密算法
可逆算法:AES、DES
不可逆算法:RSA、MD5
对称:DES 、 AES
不对称:SHS RSA