题库
知识点
Cookie、SessionStorage、 LocalStorage都是浏览器的本地存储。
共同点
区别
闭包的作用:延申变量的作用范围
闭包带来的问题:由于垃圾回收器不会将闭包中变量销毁,于是就造成了内存泄露
跨域是指浏览器的同源策略是不允许执行其他网站上的脚本,只要协议,主机地址,端口其中之一不同就算跨域
解决方法
定位方案是控制元素的布局,有三种常见方案:
BFC 即 Block Formatting Contexts (块级格式化上下文),它属于上述定位方案的普通流。
具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。
通俗一点来讲,可以把 BFC 理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部
只要元素满足下面任一条件即可触发 BFC 特性:
body 根元素
浮动元素:float 除 none 以外的值
绝对定位元素:position (absolute、fixed)
display 为 inline-block、table-cells、flex
overflow 除了 visible 以外的值 (hidden、auto、scroll)
说明来源
如果想要避免外边距的重叠,可以将其放在不同的 BFC 容器中。
!important > 内联样式(style) > ID选择器(id) > 类选择器(class) > 标签选择器> 通配符(*)>浏览器默认样式
Generator
函数很麻烦,实现逻辑有点绕 async/awt是基于Promise实现的,async/awt使得异步代码看起来像同步代码,所以优点是,使用方法清晰明了,缺点是awt 将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了 awt 会导致性能上的降低,代码没有依赖性的话,完全可以使用 Promise.all 的方式。//定义主函数,回调函数作为参数
function A(callback) {
callback();
console.log('我是主函数');
}
//定义回调函数
function B(){
setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作
}
//调用主函数,将函数B传进去
A(B);
//输出结果
我是主函数
我是回调函数
1.对象属性,创建一个空的新数组,遍历数组,判断新数组中是否存在,如果不存在就添加到新数组,返回的这个新数组就是去重后的数组。2.indexOf+filter
包括左浮动,右浮动
设置浮动会脱离文档流,可能会造成浮动的塌陷 三行结构不方便进行页面排版 ,当父元素不设高度需要子元素来撑开,而子元素设置浮动就会导致父元素的高度塌陷
解决塌陷: 1.给父元素设置高度 2.给父元素设置overflow:hidden 3.在下方创建一个空白div,添加样式clear:both 4.父级添加after伪类 father::after{ content:‘’; display:table; clear:both }
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
div {
width: 200px;
/* height: 200px; */
background-color: blueviolet;
}
.zi {
width: 100px;
height: 100px;
background-color: aqua;
/* float: left; */
}
style>
head>
<body>
<div>
<div class="zi">div>
<div class="zi">div>
<div class="zi">div>
div>
body>
html>
1.写法简洁
2.无自己的this,继承上一个作用域的this(全局或上一个函数)
3.内部this无法被改变
4.arguments的特殊性(window下保存,this指向上一个函数则arguments表示上一个函数的参数)
5.不能作为构造函数(无自己的this、constructor)
6.无自己的prototype
call 作用
apply作用
语义化的好处: 1. 代码可读高 2. 有利于SEO 3. 利于页面内容结构化 常见的语义化标签:header、footer、aside、main、h1-h6、input、textarea、video、aduio
使用HTML语义化标签的作用: - 易于用户阅读,样式文件未加载时,页面结构清晰。 - 有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重。 - 方便屏幕阅读器解析,如盲人阅读器根据语义渲染网页。 - 有利于开发和维护,代码更具可读性,代码更好维护。
this严格模式下undefined、非严格模式window
普通函数中的this指向函数调用者,箭头函数中的this继承自函数所在执行上下文中的this
display:flex
,设置父级和盒子内部子元素水平垂直都居中justify-content:center; align-items:center
display: grid
,设置父级和盒子内部子元素水平垂直都居中justify-content:center; align-items:center
,这种方式代码简介,但是兼容性ie 10以上支持display: table-cell
,其内部元素水平垂直都居中text-align: center;vertical-align: middle;
,设置子元素为行内块`display: inline-block;变量提升是指JS的变量和函数声明会在代码编译期,提升到代码的最前面。 变量提升成立的前提是使用Var关键字进行声明的变量,并且变量提升的时候只有声明被提升,赋值并不会被提升,同时函数的声明提升会比变量的提升优先。 变量提升的结果,可以在变量初始化之前访问该变量,返回的是undefined。在函数声明前可以调用该函数。 加分回答 使用let和const声明的变量是创建提升,形成暂时性死区,在初始化之前访问let和const创建的变量会报错
框架会将所有的真实节点转换为虚拟dom节点Vnode,节点发生改变后将虚拟dom节点Vnode与原来的OldNode进行对比,以Vnode进行对比,对真实dom节点OldNode进行修改
Diff算法的核心思想是能复用尽量复用,尽可能减少操作DOM的开销。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>浮动实现三栏布局title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.left {
float: left;
width: 300px;
height: 100px;
background: #631D9F;
}
.right {
float: right;
width: 300px;
height: 100px;
background: red;
}
.center {
margin-left: 300px;
margin-right: 300px;
background-color: #4990E2;
}
.main::after {
content: '';
display: block;
clear: both;
}
style>
head>
<body>
<article class="main">
<div class="left">左div>
<div class="right">右div>
<div class="center">中
<h2>浮动布局h2>
div>
article>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>positiontitle>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
.left {
position: absolute;
left: 0;
width: 300px;
background-color: red;
}
.center {
position: absolute;
left: 300px;
right: 300px;
background-color: blue;
}
.right {
position: absolute;
right: 0;
width: 300px;
background-color: #3A2CAC;
}
style>
head>
<body>
<article class="main">
<div class="left">左div>
<div class="center">中
<h2>绝对定位h2>
div>
<div class="right">右div>
article>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>positiontitle>
<style type="text/css">
div {
width: 100%;
display: grid;
grid-template-rows: 100px;
grid-template-columns: 300px auto 300px;
}
style>
head>
<body>
<article class="main">
<div class="left">hhdiv>
article>
body>
html>
1、float布局是现在用的比较多的布局很多门户网站目前使用这个布局方式,使用的时候只需要注意一定要清除浮动。
2、Position布局只是根据定位属性去直接设置元素位置,个人感觉不太适合用做页面布局
3、table布局使用起来方便,兼容性也不存在问题,不利于搜索引擎抓取信息
4、flex布局比较强大,但是还是存在IE上兼容性问题,只能支持到IE9以上
5、grid布局很强大,但是兼容性很差。
一、垃圾回收机制原理
由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分配内存来存储那个实体。只要像这样动态地分配了内存,最终都要释放这些内存以便他们能够被再用,否则,JavaScript的解释器将会消耗完系统中所有可用的内存,造成系统崩溃。
现在各大浏览器通常用采用的垃圾回收有两种方法:标记清除、引用计数
1、标记清除(mark and sweep)
大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量,执行时)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。标记方式不定,可以是某个特殊位的反转或维护一个列表等。
垃圾收集器给内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上的标记的变量即为需要回收的变量,因为环境中的变量已经无法访问到这些变量
2、引用计数
另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。
该方式会引起内存泄漏的原因是它不能解决循环引用的问题
链接
1.概念:跨域请求伪造。2.原理:诱导用户跳转到新的页面,利用 服务器的验证漏洞 和 用户之前的登入状态,来模拟用户进行操作。3.防范:利用cookie的sameSize属性规定其他网站不能使用本网站的cookie。或者使用token验证,再去验证用户身份。
XSS是跨站脚本攻击。攻击者可以通过向Web页面里面插入script代码,当用户浏览这个页面时,就会运行被插入的script代码,达到攻击者的目的。 危害:泄露用户的登录信息cookie;恶意跳转:直接在页面中插入window.location.href进行跳转。
创建空对象、为对象添加属性、把新对象当作this的上下文、箭头函数不能作为构造函数 标准回答 new
关键字会进行如下的操作:
{}
);__proto__
,将该属性链接至构造函数的原型对象 ;this
的上下文 ;this
。 加分回答 new
关键字后面的构造函数不能是箭头函数可以,但最好不要放cookie里,容易产生csrf问题
不能。token本身就是用来鉴权的,防止CSRF攻击。如果将token放在cookie中,则token还是会随cookie自动携带至请求中,防止不了CSRF攻击。token一般存储在sessionStorage/localStorage里面。token的出现就是为了解决用户登录后的鉴权问题,如果采用cookie+session的鉴权方式,则无法有效地防止CSRF攻击,同时,如果服务端采用负载均衡策略进行分布式架构,session也会存在一致性问题,需要额外的开销维护session一致性。所以token是专门为了鉴权而生,常见的token为JWT(JSON Web Token),用户通过账户密码登入系统后,服务端会生成一个jwt。jwt一般包含三个部分header、payload和signature,header包括两个字段说明token的类型和采用的签名算法,payload包含用户的一些身份权限信息但不包含敏感信息,signature是服务端的签名由前两个部分采用base64编码后再经过签名算法加密生成,签名算法的私钥由服务器保管。服务端生成jwt后返回给客户端。客户端下次调用api的请求头中放入token用于鉴权,服务端会通过jwt的前两个部分和私钥经过签名算法生成一个签名,判断与jwt第三部分的签名是否一致,如果一致就认证通过。
JavaScript中存在有一种类数组,或者说伪数组。经常见到的伪数组有函数的arguments对象、dom.querySelectorAll等获取的NodeList类(NodeList本身具有forEach方法)等。
伪数组并不是数组,它没有继承Array.prototype,但是它“看起来像数组”,它本身没有数组的标准方法,但是它可以复用这些标准方法。
作者:forceddd
链接:https://juejin.cn/post/6966525287110541348
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一类是文件加载更快、另一类是文件渲染更快。
常用的性能优化指标
定义:服务器端生成HTML直接返回给浏览器 作用:1.减少网络传输,提高传输效率 2.首屏渲染快 3.有利于SEO,提高搜索效率【SEO: Search Engine Optimization, 搜索引擎优化】
等价于apply的方式、将数组展开为构造函数的参数、数组字符串连接、浅拷贝