【前端面试笔记】01网易游戏题目+回答

来自牛客和其他地方大家的面经,为了自己能够好好总结,转载需要经本人同意,谢谢!

网易游戏面试:

1,介绍

2,介绍项目

3,JS数组的API(Application Programming Interface)

回答参考自:http://louiszhai.github.io/2017/04/28/array/

截止ES7规范,数组共包含33个标准的API方法和1个非标准的API方法,js中所有的数组方法均来自于Array.prototype。

方法:数组原型提供的方法非常之多,主要分为三种,一种是会改变自身值的,一种是不会改变自身值的,另外一种是遍历方法。基于ES6,改变自身值的方法一共有9个,分别为pop、push、reverse、shift、sort、splice、unshift,以及两个ES6新增的方法copyWithin 和 fill。不会改变自身的方法(9个),基于ES7,不会改变自身的方法一共有9个,分别为concat、join、slice、toString、toLocateString、indexOf、lastIndexOf、未标准的toSource以及ES7新增的方法includes。

基于ES6,不会改变自身的遍历方法一共有12个,分别为forEach、every、some、filter、map、reduce、reduceRight 以及ES6新增的方法entries、find、findIndex、keys、values。

Array.prototype 的各方法基本介绍完毕,这些方法之间存在很多共性。比如:

  • 所有插入元素的方法, 比如 push、unshift,一律返回数组新的长度;
  • 所有删除元素的方法,比如 pop、shift、splice 一律返回删除的元素,或者返回删除的多个元素组成的数组;
  • 部分遍历方法,比如 forEach、every、some、filter、map、find、findIndex,它们都包含function(value,index,array){} 和 thisArg 这样两个形参。

Array.prototype 的所有方法均具有鸭式辨型这种神奇的特性。它们不止可以用来处理数组对象,还可以处理类数组对象。

例如 javascript 中一个纯天然的类数组对象字符串(String),像join方法(不改变当前对象自身)就完全适用,可惜的是 Array.prototype 中很多方法均会去试图修改当前对象的 length 属性,比如说 pop、push、shift, unshift 方法,操作 String 对象时,由于String对象的长度本身不可更改,这将导致抛出TypeError错误。

Array.prototype本身就是一个数组,并且它的长度为0。

以下来自:https://www.jianshu.com/p/8c3b4dc408a5

首先,分清一下Array对象上的静态方法和实例方法,静态方法就是只存在于Array对象上的方法,比如用Array.xxx()调用,而实例方法是写在原型链上的,各种数组和Array共享,可以直接调用比如[].xxx()

小工具

Array.length:除了直接拿来用,还可以判断数组是否为空,也可以直接截短数组(不常用)

Array.isArray:判断数组类型,不用typeof和instanceof

Array.from:类数组转数组,像DOM的一些集合,arguments,还有Set/Map/String等数据结构都可以转

  • 在某些情况不能直接引用原数组的可以直接使用此方法拷贝

Array.of:多参数转数组,和new Array不一样

fill:可以填充元素,常常和new Array()一起用

toString/toLocalString:重写了Object的相关方法,返回经join连接的字符串

增删改查

pop/push/shift/unshift:模拟栈和队列常用,要注意出队是shift

find/findIndex/includes/indexOf/lastIndexOf:查值查索引(传回调),模糊查找,顺着查倒着查索引

join:数组转字符串,和字符串的split方法互相照应

slice/concat/splice::拆和合,还有一个增删改都能干的splice
concat还可以将非数组值合并到数组里

copyWithin::浅复制,目前还没用到过

迭代相关

keys/enenties/values:都是返回一个迭代器对象,可以配合of或者in循环获取内容

函数式编程工具函数

every/some:逻辑里面的所有和存在

sort/reverse:排序和反转,算法题经常用

forEach/map/filter:遍历/映射/过滤,根据特定场景选择使用

reduce/reduceRight:累加/反向累加,设定初始值可以做一些很酷的事情

4,怎么连接两个数组

答案参考自:https://blog.csdn.net/renfufei/article/details/39376311

要根据数组的大小,还有实际的要求来选择方法。

一般是用concat(..)方法将两个数组拼接在一起成为一个数组,数组长度变为原数组的长度之和,这个方法对于大型数组,或需要多次重复处理时, 原数组的内存没有被及时回收,会导致内存被限制。

或者用Array#push()方法,将一个数组通过for循环拼接到另一个数组后面。(unshift可以拼接到另一个数组的前面)

还可以用Array#reduce,或Array#reduceRight

// `b` onto `q`:
q = b.reduce( function(coll,item){
    coll.push( item );
    return coll;
}, q );
 
q; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]
 
// or `q` into `b`:
b = q.reduceRight( function(coll,item){
    coll.unshift( item );
    return coll;
}, b );
 
b; // [5,5,1,9,9,6,4,5,8,"tie","mao","csdn","ren","fu","fei"]

 但是对每个数组元素都进行了函数调用,也很累赘。

5,css定位

答案参考自:https://juejin.im/post/5a1bb35ff265da43231ab164

文档流=元素按照其在 HTML 中的位置顺序决定排布的过程

HTML的布局机制就是用文档流模型的,即块元素(block)独占一行,内联元素(inline),不独占一行。

一般使用margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“距离”。

只要不是float和绝对定位方式布局的,都在文档流里面。

position属性介绍

  • static,默认值。位置设置为static的元素,它始终会处于文档流给予的位置。

  • inherit,规定应该从父元素继承 position 属性的值。但是任何的版本的 Internet Explorer (包括 IE8)都不支持属性值 “inherit”。

  • fixed,生成绝对定位的元素。默认情况下,可定位于相对于浏览器窗口的指定坐标。元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。不论窗口滚动与否,元素都会留在那个位置。但当祖先元素具有transform属性且不为none时,就会相对于祖先元素指定坐标,而不是浏览器窗口。绝对定位脱离文档流。

  • absolute,生成绝对定位的元素,相对于距该元素最近的已定位的祖先元素进行定位。此元素的位置可通过 “left”、”top”、”right” 以及 “bottom” 属性来规定。

  • relative,生成相对定位的元素,相对于该元素在文档中的初始位置进行定位。通过 “left”、”top”、”right” 以及 “bottom” 属性来设置此元素相对于自身位置的偏移。相对定位的参照物是它本身(默认static时的位置)。

不管是哪种定位,都必须有一个参照物。找对了参照物,就成功了一半。

6,关于mysql和innodb

MySQL是一种数据库软件,属于关系型数据库,DBMS分为两类:1,基于共享文件系统的DBMS,2,基于客户机-服务器的DBMS。

服务器软件为MySQL DBMS,客户机可以是MySQL提供的工具。
SQL,结构化查询语言,专门与数据库通讯。

以下参考自:https://draveness.me/mysql-innodb

MySQL的架构:

Logical-View-of-MySQL-Architecture

分为三层,最上层用于连接、线程处理的部分;第二层中包含了大多数 MySQL 的核心服务,包括了对 SQL 的解析、分析、优化和缓存等功能,存储过程、触发器和视图都是在这里实现的;而第三层就是 MySQL 中真正负责数据的存储和提取的存储引擎,例如:InnoDBMyISAM 等,文中对存储引擎的介绍都是对 InnoDB 实现的分析。

绝大多数存储引擎都以二进制的形式存储数据;

在 InnoDB 存储引擎中,所有的数据都被逻辑地存放在表空间中,表空间(tablespace)是存储引擎中最高的存储逻辑单位,在表空间的下面又包括段(segment)、区(extent)、页(page):

Tablespace-segment-extent-page-row

同一个数据库实例的所有表空间都有相同的页大小;默认情况下,表空间中的页大小都为 16KB,当然也可以通过改变 innodb_page_size 选项对默认大小进行修改,需要注意的是不同的页大小最终也会导致区大小的不同:

Relation Between Page Size - Extent Size

从图中可以看出,在 InnoDB 存储引擎中,一个区的大小最小为 1MB,页的数量最少为 64 个。

猜你喜欢

转载自blog.csdn.net/weixin_41835977/article/details/88392388