函数式编程
1. 什么是函数式编程
简单来说,函数式编程是一种编程范式,也就是如何编写程序的方法论。它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。
2. 特点
①只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
②没有“副作用”(“副作用”指的是函数内部与外部互动【最典型的就是修改全局变量的值】,产生运算以外的其它结果。),函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
③不修改状态
④引用透明性,如果提供同样的输入,那么函数总是返回同样的结果。这有助于验证正确性、简化算法,甚至有助于找出优化它的方法。
⑤副作用,是修改系统状态的语言结构。
3. 优点
①代码简洁,开发快速。函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
②接近自然语言,易于理解。
③更方便的代码管理。函数式编程不依赖、也不会改变外界的状态只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
④易于“并发编程”
⑤代码的热升级。只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。
js垃圾回收机制
1. 什么是垃圾回收机制
它主要是由一个叫垃圾收集器(garbage collector,简称GC)的后台进程负责监控、清理对象,并及时回收空闲内存。
2. 原理
垃圾收集器会找出那些不再继续使用的变量,然后释放其内存,为此,垃圾收集器会按照固定的时间间隔(或者代码中预定的手机时间),周期性的执行这一操作。
一个页面从输入URL到加载显示完成,这个过程发生了什么?
①浏览器根据请求的URL交给DNS域名解析,找到真实的IP,向服务器发起请求;
②服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、CSS、JavaScript等);
③浏览器对加载到的资源(HTML、CSS、JavaScript等)进行语法解析,构建相应的内部数据结构(DOM树、CSS树、render树等);
④载入解析到的资源文件、渲染页面、完成。
get和post的区别
get产生一个tcp数据包,post产生两个。
get请求时会把headers和data数据一起发送出去;
post请求时,浏览器先发送headers ,服务器100继续,浏览器再发送data。
js有哪些数据类型
基本类型:字符串(string)、数字(number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol
引用数据类型:对象(Object)、数组(Array)、函数(Function)
注:Symbol是ES6引入了一种新的原始数据类型,表示独一无二的值。
js创建对象有几种方式
工厂模式
就是将创建对象的语句放在一个函数里,通过传入参数来创建特定对象,最后返回创建的对象。
工厂模式虽然可以创建多个相似的对象,但却不能解决对象标识的问题,即怎么知道一个对象的类型。
构造函数模式
构造函数模式是Java语言创建对象的通用方式。构造函数的函数名首字母是大写,而普通函数首字母则是大写。
与工厂模式相比,用构造模式创建对象有以下几点不同:
1. 没有显示地创建对象
2. 直接将属性和方法赋给this对象
3. 没有return语句
此外,还要注意到在创建Student的实例时,必须要使用new操作符,创建的实例对象将有一个constructor(构造器)属性,指向Person构造函数。
调用构造函数创建对象经过了以下几个过程:
1.创建一个新对象
2.将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
3.执行构造函数中的代码
4.返回新对象(不需要显式返回)
缺点:每个方法都要在每个实例上创建一遍。
也就是说通过构造函数实例化的多个对象的方法,是多个不同的方法,但它们内部的代码以及实现的功能是相同的,这就造成了一定的资源浪费。
原型模式
js中,每个函数都有一个prototype属性,它是一个指针,指向一个对象,叫做原型对象,原型对象包含了可以由特定类型的所有实例对象共享的属性和方法。此外,这个对象有一个与生自来的属性constructor,指向创建对象的构造方法。
使用原型模式可以让所有的实例共享原型对象中的属性和方法,也就是说,不必再构造函数中定义对象实例的信息。
其它模式
除了以上几种常见的模式外,批量创建对象的方式还有
- 动态原型模式:仅在第一次调用构造函数时,将方法赋给原型对象的相应属性,其他示例的处理方式同构造函数模式
- 寄生构造函数模式:仅仅封装创建对象的代码,然后再返回新创建的对象,仍使用new操作符调用
- 稳妥构造函数模式:没有公共属性,只有私有变量和方法,以及一些get/set方法,用以处理私有变量。