最近在在看前端面试教程,这篇文章里大部分是看视频的过程中自己遇到的不清楚的知识点,内容很简单,只是起到一个梳理作用。有些地方也根据自己的理解在作者的基础上加了点东西,如有错误,欢迎交流。
1、typeof有几种结果
undefined、、boolean、object、string、number、function、symbol(ES6新增)
2、何时使用 ===,何时使用 ==
if(obj.a == null) {
//相当于obj.a === null || obj.a === undefined
//除了这种情况用 == 之外,全部用 ===
//这是jquery的推荐写法
}
3、js中的内置函数有哪些?
Object()、Array()、Boolean()、Number()、String()、Function()、Date()、RegExp()、Error()
//注意:构造函数的函数名一般都以大写字母开头,自己定义的构造函数也尽量这样写
4、window.onload和DOMContentLoaded的区别
当onload事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了。
当DOMContentLoaded事件触发时,仅当DOM加载完成,不包括样式表,图片,flash。
5、如何理解JSON
JSON首先是一种数据格式,也是js的一种内置对象,它有两个方法:stringify()(序列化)、parse()(反序列化)
5、变量类型和引用类型的区别
js中变量分为两种类型,值类型:boolean、undefined、number、string和引用类型(object)。值类型的变量定义体和具体的值都存在栈内存中,所以var a = 123; var b = a; b = 456; 以后b等于456,a还是等于123;
而引用类型的变量定义体存在栈内存中,而具体的值存在堆内存中,每次复制一个引用类型,相当于只是复制了一份引用。所以复制体改变,被复制体也会跟着同时改变。
6、如何准确判断一个变量是数组类型
两种办法:
1、 a instanceof Array;
2、 Object.prototype.toString.call(a)
//a为要检测的变量,实际上第二种方法可以准确判断js中几乎所有的类型。
//而第一种方法只能判断引用类型,不能判断值类型,因为值类型没有对应的构造函数
7、描述new一个对象的过程
1、生成一个新的空对象;
2、this指向这个新对象;
3、执行构造函数中的代码,即对this赋值;
4、将新对象的__prototype__属性指向构造函数的prototype属性;
5、返回this,即得到新对象。
8、说明this的几种不同的使用场景
1、作为构造函数执行
2、作为对象属性执行
3、作为普通函数执行
4、call bind apply
5、DOM事件中使用
6、js非strict模式下,this默认指向window对象
9、创建10个a标签,点击的时候弹出对应的序号(0-9)
//考察js作用域和闭包的运用
<script>
for(i = 0; i < 10; i++) {
(function(i){
var a = document.createElement("a");
a.innerHTML = i + "<br/>";
a.addEventListener("click", function(){
alert(i);
});
document.body.appendChild(a);
})(i);
}
</script>
10、如何理解作用域
1、自由变量
2、作用域链、即自由变量的查找
3、闭包的两个场景
11、开发实际过程中闭包的应用
封装变量,收敛权限
12、如何理解常说的JS
常说的JS一般来说包含两部分:
1、JS基础知识(ECMA262标准),也就是语法标准,让js拥有基础编程语言的能力。
2、JS-Web-API(W3C标准),让js拥有操作dom和bom的能力。
13、querySelectorAll 方法相比 getElementsBy 系列方法有什么区别
1、querySelectorAll属于W3C的Selector API规范,而getElementsBy属于W3C的DOM规范。
2、方法接受的参数不一样,前者接受的是css选择符,而后者只能是单一的ClassName、Id、或者TagName.
3、querySelectorAll返回的是static node List,而getElementsBy返回的是live node List,获取以后在添加元素,前者数量不变,后者数量会跟着增加。会导致一些死循环,参考:https://www.bbsmax.com/A/GBJr...
http://www.imooc.com/article/...
14、Dom操作常用API
document.getElementsBy系列、docuemnt.querySelectorAll、document.querySelector、
getAttribute(attrName)、setAttribute(attrName,val)、
appendChild(node) - 在最后插入新的子节点(元素)、
insertBefore(node) - 在前面插入新的子结点
removeChild(node) - 删除子节点(元素)、
15、Dom节点的Attribute和property有什么区别
Attribute是HTML标签的属性,property是JS对象的属性
16、常见的BOM操作API
检测客户端
navigator.userAgent
检测屏幕
screen.width、screen.height
url操作
location.href .protocol .pathname .search .hash
17、常见浏览器的内核
Trident内核:主要代表为IE浏览器 // -ms-
Gecko内核:主要代表为Firefox //-moz-
Presto内核:主要代表为Opera //-o-
Webkit内核:产要代表为Chrome和Safari //-webkit-
18、描述浏览器访问一个网站的过程
一、域名到ip地址解析过程
1、查找浏览器缓存
2、查找系统缓存(一般是hosts文件)
3、查找路由器缓存
4、查找ISP DNS 缓存
5、ISP发起一个迭代的DNS请求
(1)本地 DNS服务器即将该请求转发到互联网上的根域(即一个完整域名最后面的那个点,通常省略不写)
(2)根域将所要查询域名中的顶级域(假设要查询ke.qq.com,顶级域就是com)的服务器IP地址返回到本地DNS
(3) 本地DNS根据返回的IP地址,再向顶级域(就是com域)发送请求。
(4) com域服务器再将域名中的二级域(即ke.qq.com中的qq)的IP地址返回给本地DNS
(5) 本地DNS再向二级域发送请求进行查询
(6) 之后不断重复这样的过程,直到本地DNS服务器得到最终的查询结果,并返回到主机。这时候主机才能通过域名访问该网站。
域名解析的过程到此完成,至此浏览器拿到了域名对应的IP地址
二、建立TCP/IP连接,通过TCP协议的三次握手,连接建立以后,浏览器就向服务器发起http请求,一般通过get或者post方法。
三、服务器端接受到这个请求,根据请求参数,通过相关的处理把结果,一个html代码,返回给服务器
四、浏览器拿到html代码,开始解析页面,里面的css、js、图片等静态资源,同样要经过上述步骤才能到达浏览器。
五、浏览器根据拿到的资源对页面进行渲染,最后将渲染完成的页面呈现给用户。
19、http请求常见的状态码有哪些
200 //请求完成,成功返回数据
301 //所请求的页面已经转移至新的url
400 //客户端请求的语法错误,服务器无法解析
401 //请求要求用户的身份认证
403 //服务器理解请求客户端的请求,但是拒绝执行此请求,可能还是没有权限
404 //客户端请求的资源不存在,最常见的一种状态码
500 //服务器错误
503 //由于超载或系统维护,服务器暂时的无法处理客户端的请求
20、简述cookies、 sessionStorage、localStorage的区别
cookies容量大约只有4KB、所有的http请求都带着它,会影响获取资源的效率,API太简单只有documet.cookies,使用的时候一般要通过字符串处理函数经过封装。
sessionStorage和localStorage容量有5M,API简单易用,它们两个唯一区别就是sessionStorage关闭浏览器会自动清除
21、常见的几种性能优化策略
一、加载资源优化:
1、静态资源的合并压缩(利用webpack、gulp等,压缩合并js、css文件)
2、静态资源缓存(同一网站下静态资源的名字不变,浏览器不会重新请求)
3、使用CDN让资源加载更快(大公司都有自己的CDN)
4、使用SSR(server side render)后端渲染,数据直接输出到HTML中,是vue、react中提出的概念,但是其实在早期的php、asp、jsp中都是这种渲染形式。
二、渲染优化
1、CSS放前面,JS放后面
2、懒加载(图片懒加载,下拉加载更多,而不是一次性全部加载)
3、减少DOM查询,对DOM查询做缓存
4、减少DOM操作,多个操作尽量合并在一起执行(利用createDocumentFragment,先将要插入的dom元素按次序放在Fragment中,再一次性将Fragment插入到已有的dom中)
5、事件节流
6、尽早操作,在DOMContentLoaded的时候就进行操作,而不是window.onload以后再进行,zepto和jquery都是用前者
22、常见的web攻击类型
1、XSS(Cross-site Scripting)跨站请求攻击
例如:攻击者在文章里面写入一段<script>获取cookies的一些操作,发送到自己的服务器</script>,别人点开文章,就相当于执行了这个脚本,攻击者就可以获得别人的隐私信息
解决方法:前端替换关键字,例如替换 < 为<, > 为> 。 由于前端性能有限,一般这些工作交给后端处理
2、XSRF(Cross-site request forgery)跨站请求伪造
攻击者伪造成被攻击者向服务器发送请求,造成财产损失
解决方法:增加验证流程,密码,短信验证码。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。