1.项目介绍,如何实现的,穿插一些通用问题?
2.计算机有哪些数据结构?
数组、栈、队列、链表、树、散列表、堆、图
3.哈希表有什么特点?堆是什么?有什么特点?栈和链表有啥特点?
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
1) 访问速度很快
由于散列表有散列函数,可以将指定的 Key 都映射到一个地址上,所以在访问一个 Key(键)对应的 Value(值)时,根本不需要一个一个地进行查找,可以直接跳到那个地址。所以我们在对散列表进行添加、删除、修改、查找等任何操作时,速度都很快。
2) 需要额外的空间
首先,散列表实际上是存不满的,如果一个散列表刚好能够存满,那么肯定是个巧合。而且当散列表中元素的使用率越来越高时,性能会下降,所以一般会选择扩容来解决这个问题。另外,如果有冲突的话,则也是需要额外的空间去存储的,比如链地址法,不但需要额外的空间,甚至需要使用其他数据结构。
这个特点有个很常用的词可以表达,叫作“空间换时间”,在大多数时候,对于算法的实现,为了能够有更好的性能,往往会考虑牺牲些空间,让算法能够更快些。
3) 无序
散列表还有一个非常明显的特点,那就是无序。为了能够更快地访问元素,散列表是根据散列函数直接找到存储地址的,这样我们的访问速度就能够更快,但是对于有序访问却没有办法应对。
堆是一种特殊的完全二叉树,是树的一种常见的应用,最简单的便是解决将无序的数列从大到小排列或者从小到大排列。性能极佳。
堆分两种,一种是最大堆,即所有的父节点都大于它的两个子节点。另一种是最小堆,即所有的父节点都小于它的两个子节点。
如果一组数列,是无序的,要将它有序的排列,
4.数组和链表插入元素时间复杂度?
5.数组和链表查找一个元素有什么不同?
数组的优点
- 随机访问性强
- 查找速度快
数组的缺点
- 插入和删除效率低
- 可能浪费内存
- 内存空间要求高,必须有足够的连续内存空间。
- 数组大小固定,不能动态拓展
链表的优点
- 插入删除速度快
- 内存利用率高,不会浪费内存
- 大小没有固定,拓展很灵活。
链表的缺点
- 不能随机查找,必须从第一个开始遍历,查找效率低
6.js的基础数据类型和引用类型有哪些?存放的位置在哪里?
ECMAscript标准规定了以下7种数据类型:
1.数值(number)
2.字符串(string)
3.布尔值(boolean)
4.null
5.undefined
6.symbol(es6)
7.bigint(es10)对象(object,也就是一般所说的引用类型)包括:
1.对象(object)
2.数组(array)
3.函数(function)
7.性能优化,除了网上的普遍优化,有没有更加深入一点的优化 ?
121.前端性能优化
122.前端性能优化总结
8.浏览器缓存,为啥有last-modified还要有etag,为啥读取时先读memory cache再读disk cache ?
为啥有last-modified还要有etag?
If-Modified-Since:
作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中.ETag:
是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。
问题是,我们知道last-modified可以用来判断浏览器的本地缓存是否有效,那为什么还要使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。
某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。
某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。
一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。
9.expires时间什么格式?cache-control的max-age格式?单位?
10.为什么会被csrf攻击?如何防范?
11.xss攻击方式?如何防范?怎么转义?转义成什么?
12.实际项目有没有做过安全防护?
13.tcp和udp的区别?