web前端小白面试题
web面试题集锦
1.输出下面程序的计算结果:
- var person =[“admin”,”21”,”shandong”];
for(var i in person){
console.log(i); } /// 0 1 2 in 遍历的是数组的索引 它遍历的是对象的属性名称
for(var i of person){
console.log(i); } ///admin 21 shandong for-of循环语句通 过方法调用来遍历各种集合
**
2.从用户输入浏览器输入url到页面最后呈现 有哪些过程?
1.用户输入URL地址
2.浏览器解析URL解析出主机名
3.浏览器将主机名转换成服务器ip地址(浏览器先查找本地DNS缓存列表 没有的话 再向浏览器默认的DNS服务器发送查询请求 同时缓存)
4.浏览器将端口号从URL中解析出来
5.浏览器建立一条与目标Web服务器的TCP连接(三次握手)
6.浏览器向服务器发送一条HTTP请求报文
7.服务器向浏览器返回一条HTTP响应报文
8.关闭连接 浏览器解析文档
9.如果文档中有资源 重复6 7 8 动作 直至资源全部加载完毕
3.
var func= function(){
console.log('1');
setTimeout(function(){
console.log('2');
},0);
console.log('3');
};
func(); // 1 3 2
4.面向对象三大基本特性:五大基本原则
三大特性:封装、继承、多态
封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承:是指可以让某个类型的对象获得另一个类型的对象的属性和方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
多态:就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
五大基本原则
1.单一职责原则SPR((Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
2.开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
3.替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
4.依赖原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类:而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
5.接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
其核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口。
具体而言,接口隔离原则体现在:接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。
接口有效地将细节和抽象隔离,体现了对抽象编程的一切好处,接口隔离强调接口的单一性。而胖接口存在明显的弊端,会导致实现的类型必须完全实现接口的所有方法、属性等;而某些时候,实现类型并非需要所有的接口定义,在设计上这是“浪费”,而且在实施上这会带来潜在的问题,对胖接口的修改将导致一连串的客户端程序需要修改,有时候这是一种灾难。在这种情况下,将胖接口分解为多个特点的定制化方法,使得客户端仅仅依赖于它们的实际调用的方法,从而解除了客户端不会依赖于它们不用的方法。
分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好。
5.js的基本数据类型
number,string,boolean,null,undefined,object
6.js的内置对象
Array对象:提供一个数组的模型、存储大量的有序数据
string对象:处理所有的字符串操作
Math对象:处理所有的数学运算
Date对象:处理日期和事件的存储、表达和转化
Event对象:提供JavaScript事件的各种处理信息
7.null和undefined的区别
null表示”没有对象”,即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
- 或者简洁点
- Undefined 类型只有一个值,即 undefined。当声明的变量还未被初始化时,
变量的默认值为 undefined。
Null 类型也只有一个值,即 null。null 用来表示尚未存在的对象,常用来表示函数
企图返回一个不存在的对象。
8.把数组倒序输出(不能使用内置方法)
arr = [‘name’,’first’,5,7,4,2,8]
var arr=['name','first',5,7,4,2,8];
for(var i =arr.length-1;i>=0;i--){
document.write(arr[i]+' ');
}
9.什么是单线程?什么是单线程异步?
js的异步主要有三部分:定时器setTimeout/setInterval;HTTP请求;事件响应。
js引擎解释是一个单线程的过程,浏览器无论在是任何时候有且只有一个线程在运行Js程序。
只有一个线程执行时,比如若一个进程运行等待响应需
要一段时间,这段等待的时间就让下一个进程开始执行,可大大提升运行效率。
10.代码的输出结果:
(()=>{for(var i=0;i<10;i++)
{
setInterval(()=>{
var data = {a:10,b:20};
console.log('第'+i+'条数据:'+data);
},1000)
}
})(); //第10条数据:[object object]
定时器会在js代码全都执行完毕后才执行,先把for循环执行完,然后10定时器开启。对象输出的结果为[object Object]
有些内容为转载,若回答有问题,还望指教!