某中型公司面试原题
本文适合最近在考虑新机会的的小伙伴阅读
欢迎关注前端早茶,与广东靓仔携手共同进阶~
作者:广东靓仔
一、前言
这套题目是某位群友亲身经历过的,感谢小伙伴share~
二、原题
讲讲事件循环
所谓单线程,无非就是同步队列和异步队列,js代码是自上向下执行的,在主线程中立即执行的就是同步任务,比如简单的逻辑操作及函数,而异步任务不会立马立马执行,会挪步放到到异步队列中,比如ajax、promise、事件、计时器等等。
也就是先执行同步,主线程结束后再按照异步的顺序再次执行。
事件循环意思就是:等待主线程中任务全部完成后,再回来把异步队列中任务放到主程序中运行,这样反复的循环
在事件循环中,每进行一次循环操作称为tick,tick 的任务处理模型是比较复杂的,里边有两个词:分别是 Macro Task (宏任务)和 Micro Task(微任务)。
事件委托
sass和less的区别
sass和less都是css的预编译处理语言,他们引入了mixins,参数,嵌套规则,运算,颜色,名字空间,作用域,JavaScript赋值等 加快了css开发效率,
sass的安装需要Ruby环境的,是在服务端上处理的,而Less是需要引入less.js来处理Less代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件,直接放到项目中。
Less是@,而Scss是$
Sass提供4中输出选项:nested, compact, compressed 和 expanded.
scss引用的外部文件命名必须以开头, 文件名如果以下划线开头的话,Sass会认为该文件是一个引用文件,不会将其编译为css文件.
Sass有工具库Compass
Less有UI组件库Bootstrap
http的状态码、http缓存
状态码分为5类:
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
301:
302:
304:
305:被请求的资源必须通过指定的代理才能被访问。
400:
403:服务器已经理解请求,但是拒绝执行它。
404:请求失败,请求所希望得到的资源未被在服务器上发现。
500:
服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
http缓存请求相应头:
http缓存方案
不推荐缓存html文件,这样每次html加载渲染都可以感知文件变化,反正文件没变还是使用本地缓存,文件名都变了说明修改过,重新请求缓存就好了。
了解了上面不同浏览器行为对http缓存的不同影响,理解强缓存与协商性缓存就很容易了。
不发起http请求,直接使用本地缓存,比如浏览器地址栏回车,使用浏览器的刷新按钮,在Expires或max-age生效的情况下,触发的都是强缓存。
在使用本地缓存前,先与服务器协商,核对缓存文件是否为最新。比如设置了cache-control=no-cache,不管你做任何操作,都会发起请求,这一类就是协商性缓存了。
css盒模型
标准模型和IE模型
/* 标准模型 */
box-sizing:content-box;
/*IE模型*/
box-sizing:border-box;
BFC(block formatting context)块级格式化上下文
(1). 内部的box会在垂直方向上,一个接一个地放
(2). 每个元素的margin box的左边,与包含块border box的左边相接触(对于从做往右的格式化,否则相反)
(3). box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的margin会发生重叠
(4). bfc的区域不会与浮动区域的box重叠
(5). bfc是一个页面上的独立的容器,外面的元素不会影响bfc里的元素,反过来,里面的也不会影响外面的
(6). 计算bfc高度的时候,浮动元素也会参与计算
1. 脱离文档流(float不为none时)
2.position为absolute或fixed
3. display 为inline-block、table-cell、table-caption、flex、inline-flex。
4. overflow不为visible
5. 根元素。
1. 自适应两栏布局
2. 清除内部浮动
3. 防止垂直margin重叠
小程序分包机制
微信小程序采用的是类似离线包加载方案,用户第一次打开时会先下载好所有代码,然后再加载页面;当用户再次进入时,会直接使用已下载的代码,省去了代码下载的过程,打开速度更快。
第一次打开小程序时白屏时间很长,因为要先下载好所有的代码,代码越多,白屏时间越长
离线包和M页的一种结合机制,即把代码划分成主包+N个分包
目录
├── app.js
├── app.json
├── app.wxss
├── packageA
│ └── pages
│ ├── cat
│ └── dog
├── packageB
│ └── pages
│ ├── apple
│ └── banana
├── pages
│ ├── index
│ └── logs
└── utils
app.json
subpackages 字段声明项目分包结构:
{
"pages":[
"pages/index",
"pages/logs"
],
"subpackages": [
{
"root": "packageA",
"pages": [
"pages/cat",
"pages/dog"
]
}, {
"root": "packageB",
"name": "pack2",
"pages": [
"pages/apple",
"pages/banana"
]
}
]
}
subpackages 中,每个分包的配置有以下几项:
字段类型说明rootString分包根目录nameString分包别名,分包预下载时可以使用pagesStringArray分包页面路径,相对与分包根目录independentBoolean分包是否是独立分包
打包原则
app(主包)也可以有自己的 pages(即最外层的 pages 字段)
subpackage 的根目录不能是另外一个 subpackage 内的子目录
tabBar 页面必须在 app(主包)内
引用原则
packageA 无法 import packageB 的 template,但可以 require app、自己 package 内的 template
packageA 无法使用 packageB 的资源,但可以使用 app、自己 package 内的资源
js的基本数据类型和引用类型
说说js缓存
缓存的好处:
本地存储
sessionStorage
localStorage
cookie
cookie和storage的区别
jquery的ajax实现原理
1、ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装;