注:花半个月时间,重学基础,学习完、整理完、总结归纳完,痛并快乐着。
(欢迎提出问题
和建议
,采纳后会附上提议者名字链接
)
alt
是 img
的特有属性,是图片内容的等价描述,图片无法正常显示时候的替代文字。title
属性可以用在除了base,basefont,head,html,meta,param,script和title之外的所有标签,是对dom元素的一种类似注释说明,canvas
video 和 audio
元素 localStorage
长期存储数据,浏览器关闭后数据不丢失sessionStorage
的数据在浏览器关闭后自动删除article 、footer、header、nav、section
calendar 、 date 、 time 、 email 、 url 、 search
webworker 、 websocket 、 Geolocation
basefont 、 big 、 center 、 font 、 s 、 strike 、 tt 、 u
frame 、 frameset 、 noframes
IE8/IE7/IE6
支持通过 document.createElement
方法产生的标签HTML5
新标签如何使用:
manifest
的属性;cache.manifest
文件的编写离线存储的资源window.applicationCache
进行需求实现 html
头部有 manifest
属性,它会请求 manifest
文件,如果是第一次访问 app
,那么浏览器就会根据manifest
文件的内容下载相应的资源并且进行离线存储。如果已经访问过 app
并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest
文件与旧的 manifest
文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。iframe
会阻塞主页面的 Onload
事件不利于 SEO
iframe
和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载iframe
之前需要考虑这两个缺点。如果需要使用 iframe
,最好是通过javascript
动态给 iframe
添加 src
属性值,这样可以绕开以上两个问题标签闭合、标签小写、不乱嵌套、使用外链 css 和 js 、结构行为表现的分离
声明位于文档中的最前面,处于 html
标签之前。告知浏览器的解析器, 用什么文档类型、规范来解析这个文档JS
运作模式是 以该浏览器支持的最高标准运行DOCTYPE
不存在或格式不正确会导致文档以混杂模式呈现class
:为元素设置类标识data-*
: 为元素增加自定义属性draggable
: 设置元素是否可拖拽id
: 元素 id ,文档内唯一lang
: 元素内容的的语言style
: 行内 css 样式title
: 元素相关的建议信息<meta name="viewport" content="" />
width viewport的宽度[device-width | pixel_value]width如果直接设置pixel_value数值,大部分的安卓手机不支持,但是ios支持;
height – viewport 的高度 (范围从 223 到 10,000 )
user-scalable [yes | no]是否允许缩放
initial-scale [数值] 初始化比例(范围从 > 0 到 10)
minimum-scale [数值] 允许缩放的最小比例
maximum-scale [数值] 允许缩放的最大比例
target-densitydpi 值有以下(一般推荐设置中等响度密度或者低像素密度,后者设置具体的值dpi_value,另外webkit内核已不准备再支持此属性)
-- dpi_value 一般是70-400//没英寸像素点的个数
-- device-dpi设备默认像素密度
-- high-dpi 高像素密度
-- medium-dpi 中等像素密度
-- low-dpi 低像素密度
附带问题:怎样处理 移动端 1px 被 渲染成 2px 问题?
局部处理:
mate
标签中的 viewport
属性 , initial-scale
设置为 1rem
按照设计稿标准走,外加利用transfrome 的 scale(0.5)
缩小一倍即可;mate
标签中的 viewport
属性 , initial-scale
设置为 0.5rem
按照设计稿标准走即可
<head lang=”en”>
<meta charset=’utf-8′>
<meta name=”description” content=”不超过150个字符”/>
<meta name=”keywords” content=””/>
<meta name=”author” content=”name, [email protected]”/>
<meta name=”robots” content=”index,follow”/>
<meta name=”apple-mobile-web-app-title” content=”标题”>
<meta name=”apple-mobile-web-app-capable” content=”yes”/>
<meta name=”apple-mobile-web-app-status-bar-style” content=”black”/>
<meta name=”renderer” content=”webkit”>
<meta http-equiv=”Cache-Control” content=”no-siteapp” />
<meta name=”HandheldFriendly” content=”true”>
<meta name=”MobileOptimized” content=”320″>
<meta name=”screen-orientation” content=”portrait”>
<meta name=”x5-orientation” content=”portrait”>
<meta name=”full-screen” content=”yes”>
<meta name=”x5-fullscreen” content=”true”>
<meta name=”browsermode” content=”application”>
<meta name=”x5-page-mode” content=”app”>
<meta name=”msapplication-tap-highlight” content=”no”>
<meta http-equiv=”pragma” content=”no-cache”>
<meta http-equiv=”cache-control” content=”no-cache”>
<meta http-equiv=”expires” content=”0″>
了解更多参考:https://blog.csdn.net/kongjiea/article/details/17092413
css
文件。( seo )
搜索引擎更友好,排名更容易靠前。src
用于替换当前元素,href
用于在当前文档和引用资源之间确立联系。src
是 source
的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src
资源时会将其指向的资源下载并应用到文档内,例如 js
脚本,img
图片和 frame
等元素当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部-
href 是 Hypertext Reference
的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,如果我们在文档中添加 -
link href="common.css" rel="stylesheet"
那么浏览器会识别该文档为
css
文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用
link
方式来加载
css
,而不是使用
@import
方式
link
是 HTML
方式, @import
是CSS
方式link
最大限度支持并行下载, @import
过多嵌套导致串行下载,出现 FOUC (文档样式短暂失效)link
可以通过 rel=“alternate stylesheet”
指定候选样式link
支持早于 @import
,可以使用 @import
对老浏览器隐藏样式@import
必须在样式规则之前,可以在css
文件中引用其他文件link
优于 @import
,link
优先级也更高float
不取值为 none
)position
取值为 absolute
或 fixed
)display
取值为 inline-block 、 table-cell 、 table-caption 、 flex 、inline-flex
之一的元素overflow
不取值为 visible
的元素margin
折叠div
定义 height
div
标签 clear:both
div
定义伪类 :after
和 zoom
div
定义 overflow:hidden
div
也浮动,需要定义宽度br
标签 clear:both
p:first-of-type
选择属于其父元素的首个 元素的每个
元素。
p:last-of-type
选择属于其父元素的最后 元素的每个
元素。
p:only-of-type
选择属于其父元素唯一的 元素的每个
元素。
p:only-child
选择属于其父元素的唯一子元素的每个 元素。
p:nth-child(2)
选择属于其父元素的第二个子元素的每个 元素。
:enabled
已启用的表单元素。:disabled
已禁用的表单元素。:checked
单选框或复选框被选中。::before
在元素之前添加内容。::after
在元素之后添加内容,也可以用来做清除浮动。::first-line
添加一行特殊样式到首行。::first-letter
添加一个特殊的样式到文本的首字母。box-sizing: content-box
box-sizing: border-box
margin
负值font-size:0
letter-spacing
word-spacing
行内元素设置成浮动之后变得更加像是 inline-block
(行内块级元素,设置
成这个属性的元素会同时拥有行内和块级的特性,最明显的不同是它的默认宽度不是 100% ),这时候给行内元素设置 padding-top
和 padding-bottom
或者 width 、 height
都是有效果的
多数显示器默认频率是 60Hz ,即 1 秒刷新 60 次,所以理论上最小间隔为
1/60*1000ms = 16.7ms
!important
规则最重要,大于其它规则Sass
和 LESS
语法较为严谨, LESS
要求一定要使用大括号“{}”, Sass
和 Stylus
可以通过缩进表示层次与嵌套关系Sass
无全局变量的概念, LESS
和 Stylus
有类似于其它语言的作用域概念Sass
是基于 Ruby
语言的,而 LESS
和 Stylus
可以基于 NodeJS NPM
下载相应库后进行编译;这也是为什么安装Sass的时候有时候会报错,需要安装python脚本优点:就不用我多说了,谁用谁知道,真香。
rgba()
和 opacity
都能实现透明效果,但最大的不同是 opacity
作用于元素,以及元素内的所有内容的透明度,rgba()
只作用于元素的颜色或其背景色。(设置 rgba 透明的元素的子元素不会继承透明效果!)text-align:center
margin 为 auto
;position 为 relative
,元素设left:0;right:0;margin:auto;
flex-box
布局,指定 justify-content
属性为center
display
设置为 tabel-ceil
display:table-cell
,同时设置 vertial-align:middle
flex
布局,设置为 align-item:center
bottom:0,top:0
,并设置 margin:auto
top:50%,margin-top
值为高度一半的负值line-height
为 height
值渲染引擎
、js引擎
渲染引擎:
负责取得网页的内容(html css img …),以及计算网页的显示方式,然后会输出至显示器或者打印机。浏览器的内核不同对于网页的语法解释也不同,所以渲染的效果也不一样js引擎:
解析和执行javascript 来实现网页的动态效果IE : trident
内核Firefox : gecko
内核Safari : webkit
内核Opera
:以前是 presto
内核, Opera
现已改用Google - Chrome
的 Blink
内核Chrome:Blink
(基于 webkit
,Google与Opera Software
共同开发)感谢:努力才会有进步 的建议
Get
方法:获取数据通常(查看数据)-查看POST
方法:向服务器提交数据通常(创建数据)-createPUT
方法:向服务器提交数据通常(更新数据)-update,与POST
方法很像,也是提交数据,但PUT
制定了资源在服务器上的位置,常用在修改数据HEAD
方法:只请求页面的首部信息DELETE
方法:删除服务器上的资源OPTIONS
方法:用于获取当前URL
支持的请求方式TRACE
方法:用于激活一个远程的应用层请求消息回路CONNECT
方法:把请求链接转换到透明的TCP/IP
的通道1XX
:信息状态码
100 continue
继续,一般在发送 post 请求时,已发送了 http header 之后服务端将返回此信息,表示确认,之后发送具体参数信息2XX
:成功状态码
200 ok
正常返回信息201 created
请求成功并且服务器创建了新资源202 accepted
服务器已经接收请求,但尚未处理3XX
:重定向
301 move per
请求的网页已经永久重定向302 found
临时重定向303 see other
临时冲重定向,且总是使用get请求新的url304 not modified
自从上次请求后,请求的网页未修改过4XX
:客户端错误
400 bad request
服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求401 unauthorized
请求未授权403 forbidden
禁止访问404 not found
找不到如何与url匹配的资源5XX
:服务器错误
500 internal server error
最常见的服务器端的错误503 service unacailable
服务器端暂时无法处理请求(可能是过载活维护) URL
交给 DNS
域名解析,找到真实 IP
,向服务器发起请求;( HTML、JS、CSS 、图象等)
;( HTML、JS、CSS 等)
进行语法解析,建立相应的内部数据结构(如 HTML 的 DOM )
;url
到开启网络请求线程(这一部分可以展开浏览器的机制以及进程与线程之间的关系)HTTP
请求(这一部分涉及到dns查询, TCP/IP
请求,五层因特网协议栈等知识)HTTP
交互(这一部分包括 HTTP
头部、响应码、报文结构、 cookie
等知识,可以提下静态资源的 cookie
优化,以及编码解码,如 gzip
压缩等)HTTP
的缓存(这部分包括http缓存头部
, ETag , catchcontrol
等) HTTP
数据包后的解析流程(解析 html
-词法分析然后解析成 dom
树、解析 css
生成 css
规则树、合并成 render
树,然后 layout 、 painting
渲染、复合图层的合成、 GPU
绘制、外链资源的处理、 loaded 和 DOMContentLoaded
等)CSS
的可视化格式模型(元素的渲染规则,如包含块,控制框, BFC
, IFC 等概念)JS
引擎解析过程( JS
的解释阶段,预处理阶段,执行阶段生成执行上下文, VO
,作用域链、回收机制等等)web
安全, hybrid
模式等等内容)URL
HTTP
头进行控制 Expires
和 Cache-Control
:
HTTP1.0
提供Expires
,值为一个绝对时间表示缓存新鲜日期HTTP1.1
增加了Cache-Control: max-age=
,值为以秒为单位的最大新鲜时间URL
获取协议,主机,端口,path
HTTP(GET)
请求报文ip地址
,过程如下:
socket
与目标IP地址
,端口建立TCP链接,三次握手
如下:
TCP的SYN=1,Seq=X
的包到服务器端口SYN=1,ACK=x+1,Seq=Y
的相应包ACK=Y+1,Seq=z
TCP
链接建立后发送HTTP
请求HTTP Host
头部判断请求的服务程序HTTP
请求头是否包含缓存验证信息,如果验证缓存新鲜,返回304等对应状态HTTP
相应,可能需要查询数据库等操作TCP
链接发送回浏览器HTTP
相应,然后根据情况选择关闭TCP
链接或者保留重用,关闭TCP链接的四次握手如下:
Fin=1,ACK=z,Seq=x
报文ACK=X+1,Seq=Y
报文Fin=1,ACK=X,Seq=Y
报文ACK=Y,Seq=x
报文HTML
文档,构建DOM
树,下载资源,构建CSSOM
树,执行js脚本,这些操作每月严格的先后顺序CSSOM
树:
Tokenizing
:字符流转换为标记流Node
:根据标记创建节点CSSOM
:节点创建CSSOM树DOM树和CSSOM树
构建渲染树DOM树
的根节点遍历所有可见节点,不可见节点包括:1) script , meta
这样本身不可见的标签。2)被css隐藏的节点,如 display: noneCSSOM
规则并应用Document对象
并解析HTML
,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading
async和defer的script时
,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执行时解析器会暂停。这样就可以用document.write()
把文本插入到输入流中。同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script和他们之前的文档内容async属性的script
时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行,但是解析器不会停下来等它下载。异步脚本禁止使用document.write()
,它们可以访问自己script和之前的文档元素document.readState变成interactive
defer脚本
会按照在文档出现的顺序执行,延迟脚本能访问完整文档树,禁止使用document.write()
Document
对象上触发DOMContentLoaded事件
document.readState变为complete,window触发load事件
cookie
是网站为了标示用户身份而储存在用户本地终端上的数据(通常经过加密)cookie
数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递(优化点)sessionStorage
和 localStorage
不会自动把数据发给服务器,仅在本地保存cookie
数据大小不能超过4ksessionStorage 和 localStorage
虽然也有存储大小的限制,但比 cookie 大得多,可以达到5M或更大localStorage
存储持久数据,浏览器关闭后数据不丢失除非主动删除数据sessionStorage
数据在当前浏览器窗口关闭后自动删除
cookie 设置的 cookie
过期时间之前一直有效,即使窗口或浏览器关闭
浏览器缓存分为强缓存和协商缓存。当客户端请求某个资源时,获取缓存的流程如下
http header
判断它是否命中强缓存,如果命中,则直接从本地获取缓存资源,不会发请求到服务器;request header
验证这个资源是否命中协商缓存,称为 http
再验证,如果命中,服务器将请求返回,但不返回资源,而是告诉客户端直接从缓存中获取,客户端收到返回后就会从缓存中获取资源;ctrl+f5
强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;f5
刷新网页时,跳过强缓存,但是会检查协商缓存;true/false
或者数值 new Array
这种形式Switch
语句必须带有 default
分支If
语句必须使用大括号for-in
循环中的变量 应该使用 let
关键字明确限定作用域,从而避免作用域污染window
对象即被终止,作用域链向下访问变量是不被允许的。prototype
(原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去 prototype
里找这个属性,这个prototype
又会有自己的 prototype
,于是就这样一直找下去,也就是我们平时所说的原型链的概念instance.constructor.prototype = instance._proto_
JavaScript
对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变当我们需要一个属性的时, Javascript
引擎会先看当前对象中是否有这个属性, 如果没有的,就会查找他的 Prototype
对象是否有这个属性,如此递推下去,一直检索到 Object
内建对象( Event Delegation )
,又称之为事件委托。是 JavaScript
中常用的绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM
元素的事件冒泡。使用事件代理的好处是可以提高性能table
上代理所有 td 的 click
事件就非常棒prototype
机制或 apply 和 call
方法去实现较简单,建议使用构造函数与原型混合方式function Parent(){
this.name = 'wang';
}
function Child(){
this.age = 28;
}
Child.prototype = new Parent();//继承了Parent,通过原型
var demo = new Child();
alert(demo.age);
alert(demo.name);//得到被继承的属性
this
总是指向函数的直接调用者(而非间接调用者)new
关键字, this
指向 new
出来的那个对象 this
指向触发这个事件的对象,特殊的是, IE
中的 attachEvent 中的this
总是指向全局对象 Window
W3C
中定义事件的发生经历三个阶段:捕获阶段(capturing
)、目标阶段 (targetin
)、冒泡阶段(bubbling
)
DOM
事件流:同时支持两种事件模型:捕获型事件和冒泡型事件W3c
中,使用 stopPropagation()
方法;在IE下设置 cancelBubble =true
click - a
后的跳转。在 W3c
中,使用preventDefault()
方法,在 IE 下设置 window.event.returnValue = false
this
变量引用该对象,同时还继承了该函数的原型this
引用的对象中this
所引用,并且最后隐式的返回 this
Ajax
的原理简单来说是在用户和服务器之间加了—个中间层( AJAX 引擎),通过XmlHttpRequest
对象来向服务器发异步请求,从服务器获得数据,然后用 javascript
来操作 DOM
而更新页面。使用户操作与服务器响应异步化。这其中最关键的一步就是从服务器获得请求数据Ajax
的过程只涉及 JavaScript 、 XMLHttpRequest 和 DOM 。 XMLHttpRequest
是ajax
的核心机制首先了解下浏览器的同源策略 同源策略/SOP(Same origin policy)
是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS 、 CSFR
等攻击。所谓同源是指"协议+域名+端口"
三者相同,即便两个不同的域名指向同一个ip地址,也非同源
jsonp
跨域var script = document.createElement('script');
script.type = 'text/javascript';
// 传参并指定回调执行函数为onBack
script.src = 'http://www.....:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);
// 回调执行函数
function onBack(res) {
alert(JSON.stringify(res));
}
document.domain + iframe
跨域//父窗口:(http://www.domain.com/a.html)
<iframe id="iframe" src="http://child.domain.com/b.html"></iframe>
<script>
document.domain = 'domain.com';
var user = 'admin';
</script>
//子窗口:(http://child.domain.com/b.html)
document.domain = 'domain.com';
// 获取父窗口中变量
alert('get js data from parent ---> ' + window.parent.user);
nginx
代理跨域nodejs
中间件代理跨域CommonJS
是服务器端模块的规范, Node.js
采用了这个规范。 CommonJS
规范加载模 AMD
规范则是非同步加载AMD
推荐的风格通过返回一个对象做为模块对象, CommonJS
的风格通过对module.exports 或 exports
的属性赋值来达到暴露模块对象的目的Undefined 、 Null 、Boolean 、Number 、String 、Bigint 、Symbol
感谢:字符搬运工 同学纠正
Object
是 JavaScript
中所有对象的父对象Object 、 Array 、 Boolean 、 Number 和 String
Function 、 Arguments 、 Math 、 Date 、 RegExp 、 Error
var obj = {}
;var obj = new Object()
;var obj = Object.create(Object.prototype);
jquery
源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入 window
对象参数,可以使 window
对象作为局部变量使用,好处是当 jquery
中访问 window
对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window
对象。同样,传入 undefined
参数,可以缩短查找 undefined
时的作用域链jquery
将一些原型属性和方法封装在了 jquery.prototype
中,为了缩短名称,又赋值给了 jquery.fn
,这是很形象的写法jQuery
将其保存为局部变量以提高访问速度jquery
实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率undefined
表示不存在这个值。undefined
:是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。尝试读取时会返回 undefined
undefined
null
表示一个对象被定义了,值为“空值”null
: 是一个对象(空对象, 没有任何属性和方法)null
时,一定要使用 === ,因为 == 无法分别 null 和 undefined
JavaScript
提供了简单的字符串插值功能)for-of
(用来遍历数据—例如数组中的值。)arguments
对象可被不定参数和默认参数完美代替。ES6
将promise
对象纳入规范,提供了原生的 Promise
对象。let 和 const
命令,用来声明变量。module
模块的概念instanceof
运算符是用来测试一个对象是否在其原型链原型构造函数的属性var arr = [];
arr instanceof Array; // true
isArray
Array.isArray([]) //true
Array.isArray(1) //false
constructor
属性返回对创建此对象的数组函数的引用,就是返回对象相对应的构造函数var arr = [];
arr.constructor == Array; //true
Object.prototype
Object.prototype.toString.call([]) == '[object Array]'
// 写个方法
var isType = function (obj) {
return Object.prototype.toString.call(obj).slice(8,-1);
//return Object.prototype.toString.apply([obj]).slice(8,-1);
}
isType([]) //Array
Promise
对象
then
方法,进行链式写法;可以书写错误时的回调函数;Generator
函数
async
函数
Promise
、结构清晰。数据类型、运算、对象、Function
、继承、闭包、作用域、原型链、事件、 RegExp
、JSON
、 Ajax
、 DOM
、 BOM
、内存泄漏、跨域、异步装载、模板引擎、前端MVC
、路由、模块化、 Canvas
、 ECMAScript
var arr = [1,2,3,4,5,6,7,8,9,10];
arr.sort(()=> Math.random() - 0.5)
//利用sort return 大于等于0不交换位置,小于0交换位置
// [5, 8, 4, 3, 2, 9, 10, 6, 1, 7]
ES6 Set
for
循环 indexOf
for
循环 includes
sort
mousedown , mousemove , mouseup
事件mousedown
事件触发后,开始拖拽mousemove
时,需要通过 event.clientX 和 clientY
获取拖拽位置,并实时更新位置mouseup
时,拖拽结束Object.assign
或者 扩展运算符JSON.parse(JSON.stringify(object))
深层递归
详细信息更多:https://juejin.cn/post/6906369563793817607**
input
模糊搜索
当执行
JS
代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境
```js b() // call b console.log(a) // undefined var a = 'Hello world' function b() { console.log('call b') } ```
变量提升 这是因为函数和变量提升的原因。通常提升的解释是说将声明的代码移动到了顶部,这其实没有什么错误,便于大家理解。但是更准确的解释应该是:在生成执行环境时,会有两个阶段。第一个阶段是创建的阶段,JS
解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为undefined
,所以在第二个阶段,也就是代码执行阶段,我们可以直接提前使用
b() // call b second
function b() {
console.log('call b fist')
}
function b() {
console.log('call b second')
}
var b = 'Hello world'
DOM
渲染的冲突
DOM
JS
可以修改 DOM
结构JS
执行的时候,浏览器 DOM
渲染会暂停JS
也不能同时执行(都修改 DOM
就冲突了)webworker
支持多线程,但是不能访问 DOM
首先,js
是单线程的,主要的任务是处理用户的交互,而用户的交互无非就 是响应DOM
的增删改,使用事件队列的形式,一次事件循环只处理一个事件 响应,使得脚本执行相对连续,所以有了事件队列,用来储存待执行的事件, 那么事件队列的事件从哪里被push
进来的呢。那就是另外一个线程叫事件触 发线程做的事情了,他的作用主要是在定时触发器线程、异步HTTP
请求线程 满足特定条件下的回调函数push
到事件队列中,等待js
引擎空闲的时候去 执行,当然js
引擎执行过程中有优先级之分,首先js
引擎在一次事件循环中, 会先执行js线程的主任务,然后会去查找是否有微任务microtask(promise)
,如果有那就优先执行微任务,如果没有,在去查找 宏任务macrotask(setTimeout、setInterval)
进行执行
更详细的介绍前往:https://juejin.cn/post/6844903598573240327
this
,函数执行的上下文,可以通过apply , call , bind
改变this
的指向。对于匿名函数或者直接调用的函数来说,this指向全局上下文(浏览 器为window,NodeJS为 global
),剩下的函数调用,那就是谁调用它,this
就指向谁。当然还有es6
的箭头函数,箭头函数的指向取决于该箭头函 数声明的位置,在哪里声明,this
就指向哪里
ajax:
MVC
的编程,不符合现在前端 MVVM
的浪潮XHR
开发, XHR
本身的架构不清晰,已经有了 fetch
的替代方案JQuery
整个项目太大,单纯使用 ajax
却要引入整个 JQuery
非常的不合理(采取个性化打包的方案又不能享受CDN
服务)axios:
XMLHttpRequest
node.js
发出 http
请求 Promise API
JSON
数据CSRF/XSRF
fetch:
只对网络请求报错,对 400 , 500 都当做成功的请求,需要封装去处理
这里对于 cookie
的处理比较特殊,不同浏览器对credentials
的默认值不一样,也就使得默认情况下cookie
变的不可控。详细前往MDN
本身无自带 abort
,无法超时控制,可以使用AbortController
解决取消请求问题。
感谢:九旬 同学纠错
感谢:sun麋鹿先生 同学纠错
没有办法原生监测请求的进度,而XHR
可以
更多fetch知识前往:阮一峰 fetch
title 、 description 、 keywords
:搜索对着三项的权重逐个减小, title
值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面 title
要有所不同; description
把页面内容高度概括,长度合适,不可过分堆砌关键词,不同页面description
有所不同; keywords
列举出重要关键词即可 HTML
代码,符合W3C规范:语义化代码让搜索引擎容易理解网页 HTML
代码放在最前:搜索引擎抓取 HTML
顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容一定会被抓取js
输出:爬虫不会执行js获取内容iframe
:搜索引擎不会抓取 iframe
中的内容 alt
HTTP
请求,合并文件、雪碧图DNS
查询,使用缓存Dom
元素的数量CDN
ETag
,http缓存的手段Gzip
压缩cookie
的大小less scss
表达式link
不适用@import
引入样式css
gif
图片实现 loading
效果(降低 CPU 消耗,提升渲染性能)CSS3
代码代替 JS
动画(尽可能避免重绘重排以及回流)base64
位编码,以减少网络请求。