计算机基础知识:css
1.简单举例介绍下列表(list),队列(queue),集合(set),字典(map),树(tree),图(graph)的差异。html
2.内存溢出和内存泄露前端
内存溢出是指已有的数据超过了其得到到的内存所能存储的范围,好比用一个字节存放1000这个数字就属于内存溢出;
es6
内存泄露是指程序因为错误或漏洞形成的内存占用过多,或占用内存后没法释放(不少状况是申请了内存,但程序结束后没有释放)。redis
3.数据库中索引,主键,惟一索引,联合索引的区别,对数据库性能有什么影响算法
索引是一种特殊文件,它包含对数据表里全部记录的引用指针mongodb
普通索引的惟一做用是加快访问速度数据库
普通索引,被索引的数据中能够包含重复的数据,惟一索引就是规定了索引到的值各不相同json
主键是一种特殊的惟一索引,一个表中只能容许有一个主键,用来惟一标识一条记录
数组
联动索引就是索引能够覆盖多个数据列
索引加快了查询的速度,可是减慢了添加删除更新的速度,由于在执行这些操做以前须要先索引
4.数据库中内联接和外联接区别
内联接:指链接结果仅包含符合链接条件的行,参与链接的两个表都应该符合链接条件。
外联接:链接结果不只包含符合链接条件的行同时也包含自身不符合条件的行。包括左外链接,右外链接和全外链接。
内联接只能查询两个表中关系匹配的记录;外联接不只能查询两个表中关系匹配的记录,并且能够查询不匹配的记录。
5.线程和进程,多线程中死锁怎么处理
联系:
一个线程只属于一个进程,一个进程能够拥有多个线程,但至少有一个线程,称为主线程
资源统一分配给进程,同一进程中的线程共享该进程的全部资源
线程在执行过程当中,须要协做同步,不一样进程之间线程须要经过消息通讯来达到同步。
区别:
线程做为调度和分配的基本单位,进程做为分配资源的基本单位
并发性:不只进程之间能够并发执行,同一进程中的不一样线程之间也能进行并发执行
拥有资源:进程是拥有资源的独立单位,线程不用有资源,但能够访问隶属于进程的全部资源。
何时用多线程:
耗时或大量占用处理器阻塞用户界面操做
各个任务必须等待外部资源时
避免多线程中死锁:
加锁顺序(线程按照必定的顺序加锁)
加锁时限(线程尝试获取锁的时候加上必定的时限,超过期限则放弃对该锁的请求,并释放本身占有的锁)
死锁检测
6.缓存的应用场景
缓存,就是数据暂存的地方,能够理解为从磁盘里取出来数据,暂时存放在内存,以待后面处理来读取。而能存放在缓存的数据,一般是频繁访问的,不会常常修改的数据。知道了什么是缓存,什么数据能够放缓存,就能够寻找合适的缓存(这里说的缓存,就是对象或者容器了)。
目前,缓存的操做主要是两种方式,一种是使用程序自带的map对象(像jdk的hashmap),一种是缓存软件,第一种不细说,你们能够看看hashmap的实现和应用,这里主要说缓存软件。如今流行的缓存软件是memcached,redis,mongodb。我的认为,由于要兼顾DB的某些特性,因此作不到其余两个缓存的为了实现极高的吞吐量而采用的epoll 或 libevent事件驱动的方案,因此这里排除。下面所说的缓存,就指的是第二种。
7.怎么快速对链表排序。
8.经常使用的磁盘调度算法有哪些,请举例说明下
9. TCP 协议和 UDP 协议的区别是什么。
10.介绍下观察者模式。
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。好比,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属性行为型模式。
前端题:
全部未说明的情形都可以假设,但要把这个假设说出来;有些问题答案不惟一,请将你知道的答案都写出来。
1.css有哪些选择器,如何区分优先级,下面代码是什么效果
除了前3中基本选择器,还有一些扩展选择器,包括
css选择器的优先级的定义
基本原则:通常而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。
复杂的计算方法:
用1表示派生选择器的优先级
用10表示类选择器的优先级
用100表示ID选择器的优先级
div.test1 .span var 优先级 1+10+10+1
span#xxx .songs li 优先级1+100+10+1
#xxx li 优先级 100+1
<style> #id{color:green;} .class-a{ color:blue; } #my-id.class-b{color:yellow;} p.class-a.class-b{ color:red; } </style> <body> <p class="class-b class-a" id="my-id">123</p> </body>
颜色是yellow
2.如何用css 让一个元素不可见
opacity:0;隐藏对应的元素而且挤占该元素原来的空间。
display:none;隐藏对应的元素但不挤占该元素原来的空间。
visibility:hidden;隐藏对应的元素而且挤占该元素原来的空间。
便是,使用css display:none属性后,html元素(对象)的宽度,高度等各类属性值都将“丢失”;而使用visibility:hidden属性后,html元素(对象)仅仅是在视觉上看不见(彻底透明),而它所占据的空间位置仍然存在。
3.补充一下 .b的代码,使得<div class="b"></div>在页面水平居中,列出你能想到的全部方法
.b{
width:200px;
height:100px;
background:#ccc;
//继续补充代码
}
传统的居中方式:添加代码margin:0 auto;便可。
绝对定位方式(必须已知子元素宽高,而且父元素须要relative定位),添加代码:
position: absolute;
left: 50%;
margin-left: -100px;
绝对定位方式(不用知道子元素宽高,但父元素须要relative定位)
position: absolute;
left: 0;
right: 0;
margin: 0 auto;
flex布局,给父元素添加代码: display: flex; justify-content: center;
4.若是一个页面由于图片大且多加载慢,应该如何去优化?
图片懒加载,在页面上的未可视区域能够添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,如何前者小于后者,优先加载。
若是为幻灯片,相册等,可使用图片预加载技术,将当前展现图片的前一张和后一张优先下载。
若是图片为css图片,可使用CSSsprite,SVGsprite,Iconfont,Base64等技术。
若是图片过大,可使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提升用户体验。
若是图片展现区域小于图片的真实大小,则应在服务器端根据业务须要先行进行图片压缩,图片压缩后大小与展现一致。
5.如何消除一个数组里面重复的元素?(请用代码实现,元素多是数组,字符串等,不考虑function)
首先介绍一种 es6的解决方法,es6里新添加了两个很好用的东西,set和Array.from。set是一种新的数据结构,它能够接收一个数组或者是类数组对象,自动去重其中的重复项目。
var arr = [1,1,'1','1',null,null,undefined,undefined,NaN,NaN];
console.log(new Set(arr));
在这里咱们能够看见,重复的项目已经被去掉了,包括NaN。正常状况下,NaN === NaN返回的是false,可是在set里,同样可以帮你去重。
可是这里你们能够看到,set返回的是一个对象,可是咱们想要的是数组啊。这时,就该轮到Array.from出场了,它的做用,就是能够把类数组对象,可迭代对象转化为数组。
var arr = [1,1,'1','1',null,null,undefined,undefined,NaN,NaN];
var newArr = Array.from(new Set(arr));
console.log(newArr);
再介绍一种利用indexOf方法的去重,indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。
var arr = [1,1,2,3,4,2,6,4,5,7]; var nArr = []; function removeItem(arr) { for(var i=0;i<arr.length;i++){ if(nArr.indexOf(arr[i])==-1){ nArr.push(arr[i]); } } return nArr; } console.log(removeItem(arr));
6.请简述var let const的区别
var定义的变量能够修改,若是不初始化会输出undefined,而且有时候会泄露到全局,形成一些影响
为了解决这个泄露的bug,有了es6的let,let至关于给行数定义了一个块级域,函数内部使用let定义的变量只能在函数内部起做用
const是用来定义一个不变的量,不能修改的量,必须赋初值。
7.如何深拷贝对象,JSON.stringfiy须要注意什么
讲讲浅拷贝和深拷贝的概念,js中的浅拷贝和深拷贝,知识针对复杂数据类型(Object,Array)的复制问题。
浅拷贝:是拷贝引用,拷贝后的引用都是指向同一个对象的实例,彼此之间的操做会互相影响
var a = {c:1}; var b = a; console.log(a === b); // 输出true。 a.c = 2; console.log(b.c); // 输出 2
深拷贝:在堆中从新分配内存,而且把资源对象全部属性都进行新建拷贝,拷贝后的对象与原来的对象是彻底隔离,互不影响
常见方法有JSON.parse(),JSON.stringify(),jQury的$.extend(true,{},obj)
var a = {c: {d: 1}}; var b = $.extend(true, {}, a); console.log(a === b); // 输出false a.c.d = 3; console.log(b.c.d); // 输出 1,没有改变。
JSON.stringfiy须要注意什么
首先讲一下JSON.parse()和JSON.stringfiy的概念
JSON.parse()是将字符串转化成json对象
var str = '{"name":"zp","age":"22"}' 结果: JSON.parse(str) Object age: "22" name: "zp" __proto__: Object
JSON.stringfiy则相反,是将json对象转换成字符串
vara = {a:1,b:2}
结果:
JSON.stringify(a)
"{"a":1,"b":2}"
JSON.stringfiy须要注意的地方
JSON.stringfiy将不会转换不具备json表示形式的值
数字(整数或浮点数) 字符串(在双引号中) 逻辑值(true 或 false) 数组(在方括号中) 对象(在花括号中) null
undefined不在其中。
8.<a onclick="a.click">和<a onclick="a.click()">二者的写法有差异吗,若是有,差异是什么
前者调用的是一个函数,当点击的时候能够执行函数;然后者只是将函数运行后的值赋值给了a,因此当点击的时候并不会执行函数。
9.按时间顺序排序的日志信息,如何快速找到指定时间的日志。时间复杂度是多少
是数据结构中的日志信息
10.写一个fiter函数执行器,第一个参数为filter函数,剩余的参数传入filter执行,并返回结果,exefilter()
首先看看js filter()的用法,array.filter(function(currentValue,index,arr),thisValue)
参数描述:
function(currentValue,index,arr)
currentValue 必须。当前元素的值
index可选。当前选择的索引值
array可选。当前元素属于的数组对象
thisValue可选。对象做为该执行回调时使用,传递给函数,用做”this“的值。若是省略了 thisValue,”this“的值为”undefined“
var ages = [32, 33, 16, 40]; function exeFilter(age) { return age >= 18; } function myFunction() { document.getElementById("demo").innerHTML = ages.filter(exeFilter); }