javascript篇
1.数组方法有哪些请简述
push() 从后面添加元素,返回值为添加完后的数组的长度
arr.pop() 从后面删除元素,只能是一个,返回值是删除的元素
arr.shift() 从前面删除元素,只能删除一个 返回值是删除的元素
arr.unshift() 从前面添加元素, 返回值是添加完后的数组的长度
arr.splice(i,n) 删除从 i(索引值)开始之后的那个元素。返回值是删除的元
素
arr.concat() 连接两个数组 返回值为连接后的新数组
str.split() 将字符串转化为数组
arr.sort() 将数组进行排序,返回值是排好的数组,默认是按照最左边的数
字进行排序,不是按照数字大小排序的
arr.reverse() 将数组反转,返回值是反转后的数组
arr.slice(start,end) 切去索引值 start 到索引值 end 的数组,不包含 end
索引的值,返回值是切出来的数组
arr.forEach(callback) 遍历数组,无 return 即使有 return,也不会返回
任何值,并且会影响原来的数组
arr.map(callback) 映射数组(遍历数组),有 return 返回一个新数组 。
arr.filter(callback) 过滤数组,返回一个满足要求的数组
2.什么是面向对象请简述
面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功
能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细
节;这种思想是将数据作为第一位,这是对数据一种优化,操作起来更
加的方便,简化了过程。
Js本身是没有class类型的,但是每个函数都有一个prototype属性,prototype指向一个对象,当函数作为构造函数时,prototype就起到类似于class的作用
面向对象有三个特点:封装(隐藏对象的属性和实现细节,对外提供公
共访问方式),继承(提高代码复用性,继承是多态的前提),多态(是父类或接口定义
的引用变量可以指向子类或具体实现类的实例对象)
3.普通函数和构造函数的区别
构造函数也是一个普通函数,创建方式和普通函数一样,但是构造函数
习惯上首字母大写调用方式不一样,普通函数直接调用,构造函数要用关键字new来调
用调用时,构造函数内部会创建一个新对象,就是实例,普通函数不会创
建新对象构造函数内部的this指向实例,普通函数内部的this指向调用函数的
对象(如果没有对象调用,默认为window)
构造函数默认的返回值是创建的对象(也就是实例),普通函数的返回值由return语句决定构造函数的函数名与类名相同
4.请简述原型/原型链/(原型)继承
什么是原型:
任何对象实例都有一个原型,也叫原型对象,这个原型对象由对象的
内置属性_proto_指向它的构造函数的prototype指向的对象,即任何对
象都是由一个构造函数创建的,但是不是每一个对象都有prototype,
只有方法才有prototype。
什么是原型链?
原型链基本思想是利用原型让一个引用类型继承另一个引用类型的属性
和方法。我们知道,每个构造函数都有一个原型对象,每个原型对象都
有一个指向构造函数的指针,而实例又包涵一个指向原型对象的内部指
针。
原型链的核心就是依赖对象的_proto_的指向,当自身不存在的属性
时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有
_proto_指向了。
因为_proto_实质找的是prototype,所以我们只要找这个链条上的构造
函数的prototype。其中Object.prototype是没有_proto_属性的,它
==null。
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的
指针,而实例都包含指向原型对象内部的指针。我们让原型对象(1)等于另一个原型对象的实例(2),此时原型对象2)将包含一个指向原型对象(1)的指针,(再让原型对象(2)的实例等于原型对象(3),如此层层递进就构成了实例和原型的链条,这就是原型链的概念
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数想指针(constructor),而实例对象都包含一个指向原型对象的内部指针(__proto__)。如果让原型对象等于另一个原型对象的实例,此时的原型对象将包含一个指向另一个原型的指针(__proto__),另一个原型也包含着一个指向另一个构造函数的指针(constructor)。假如另一个原型又是
另一个类型的实例……这就构成了实例与原型的链条。也叫原型链原型继承是js的一种继承方式,原型链作为实现继承的主要方法,其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法,原型继承:利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的方式,就叫做原型继承.
5.Promise的理解
一、什么是Promise?
我们都知道,Promise是承诺的意思,承诺它过一段时间会给你一个结
果。
Promise是一种解决异步编程的方案,相比回调函数和事件更合理和更
强大。
从语法上讲,promise是一个对象,从它可以获取异步操作的消息;
二、promise有三种状态:pending初始状态也叫等待状态,fulfiled成功状态,rejected失败状态;状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
三、Promise的两个特点
1、Promise对象的状态不受外界影响
2、Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,
四、Promise的三个缺点
1)无法取消Promise,一旦新建它就会立即执行,无法中途取消
2)如果不设置回调函数,Promise内部抛出的错误,不会反映到外部
3)当处于pending(等待)状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成
6.我们用Promise来解决什么问题?
promise是用来解决两个问题的:
1.回调地狱,代码难以维护,常常第一个的函数的输出是第二个函数的输入这种现象
2.promise可以支持多并发的请求,获取并发请求中的数据这个promise可以解决异步的问题,本身不能说promise是异步的
7.请简述async的用法
Async就是generation和promise的语法糖,async就是将generator的*换成async,将yiled换成await函数前必须加一个async,异步操作方法前加一个await关键字,意思就是等一下,执行完了再继续走,注意:await只能在async函数中运行,否则会报错Promise如果返回的是一个错误的结果,如果没有做异常处理,就会报错,所以用try..catch捕获一下异常就可以了
8.一个页面从输入URL到页面加载显示完成,这个过程中都发生了什么?
分为4个步骤:
1.当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
2.浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,然后服务器响应并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
3.一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的GET请求。远程服务器找到资源并使用HTTP响应返回该资源
4.此时,Web服务器提供资源服务,客户端开始下载资源。
9.get请求传参长度的误区
误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。实际上HTTP协议从未规定GET/POST的请求长度限制是多少。对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度。为了明确这个概念,我们必须再次强调下面几点:
HTTP协议未规定GET和POST的长度限制
GET的最大长度显示是因为浏览器和web服务器限制了URI的长度不同的浏览器和WEB服务器,限制的最大长度不一样要支持IE,则最大长度为2083byte,若只支持Chrome,则最大长度
8182byte
10.补充get和post请求在缓存方面的区别
post/get的请求区别,具体不再赘述。
补充补充一个get和post在缓存方面的区别:get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。
post不同,post做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。因此get请求适合于请求缓存