发文前,小编想先对上一篇文章-css篇纠正错误以及针对文章提出的优化的小伙伴表示感谢,大家的每一个建议或意见都很宝贵🌻🌻。javascript
继上两篇文章html篇和CSS篇以后,本篇文章对于常见的有关Javascript
部分的内容进行了大体的整合。文中涉及的知识面仍是蛮广的,小编在整理的时候也顺道温习了一遍。css
文章字数1.5万+
,篇幅比较长,仍是建议收藏吧,慢慢看。所谓温故而知新,本篇文章做为温习知识点仍是挺有用的(尤为是准备跳槽的小伙伴抱佛脚尤其有用哈哈哈哈)🥴。html
PS: 文中,为了方便阅读,小编一如既往作了分割线。java
首先,在js
中,this
是指正在执行的很熟的“全部者”,更确切的说,是指将当前函数做为方法的对象。node
javascript
中的this
有一套彻底不用于其它语言的对this
的处理机制。在如下五种状况下,this
的指向各不相同。linux
当在全局范围内的时候,使用this
将会指向全局对象(this->window)
;程序员
这里的this
是在对象中的.当函数被保存为对象的一个属性时,成该函数为该对象的方法,函数中this
的值为该对象。web
咱们先看个例子:ajax
const object = {
a: 1,
func: function() {
console.log(this.a)
}
}
object.fun() //1 (this->object)
复制代码
function func() {
console.log(this.a)
}
const object = {
a: 1,
b: func
}
object.fun() // 1 (this->object)
复制代码
这里的两个this
指向的是对象object
,此时咱们能够这么理解,函数不管在对象内部或外部定义,实现的效果同样。由于做为对象的属性的函数,对于对象来讲是独立的。算法
可是须要注意有时候,对象中的也会存在this绑定丢失的问题,这也是咱们下面将的使用apply
或call
调用模式。
看下面例子:
function func() {
console.log(this.a)
}
const object = {
a: 1,
b: func
}
const fun = object.b;
fun() // undefined
复制代码
此时fun()
打印出来的值并非对象中的1
,而是undefined
。由此可看出,此时的this
指向的并非object
对象。咱们再给代码添加一个全局的a
看看状况:
function func() {
console.log(this.a)
}
const object = {
a: 1,
b: func
}
const fun = object.b;
var a = 2;
fun() // 2
复制代码
此时的func
打印出来的是全局变量的值--2
,说明此时的this
是指向外部全局变量的。这种状况主要是由由于this的隐式绑定致使的this绑定丢失。
咱们能够理解为: 执行“ fun= object.b”以后fun的调用和object.b调用的结果是不一样的,由于这个函数赋值的过程没法把b所绑定的this也传递过
决绝方式:经过this
的显示绑定解决。
咱们能够经过使用 call
和apply
以及bind
来解决,此时函数内的this
将会被显示设置为函数调用的第一个参数。以下代码:
function func() {
console.log(this.a)
}
const object = {
a: 1,
b: func
}
var a = 2;
const fun = object.b;
fun.call(object) 或者 fun.apply(object) 或者 const funb = fun.bind(object) ; funb() // 1
复制代码
此时this
指向的就是object
内部的a
,这就解决了this
绑定丢失的问题。
🌈🌈注意 :
bind
是提供了一个可执行的函数,可是自己并不会执行,须要咱们手动去执行;call
和apply
它们是提供了一个可当即执行的函数,在绑定this
的同时,也会当即去执行该函数。这也是为何咱们在最后一个bind
方法中再次须要的单独再调用一次funb()
方法的缘由。此时的this
也会指向全局对象。咱们也能够这么理解:当没有明确的调用对象的时候,行数的this仍是在全局范围内的,因此this会绑定到全局的window对象。
先看个例子:
function func() {
this.b = a;
console.log(b)
}
func(20); // 20,此时的b是20
const funb = new func(30)
funb.b; // 30
复制代码
能够看到,当执行new
操做的时候,会建立一个新的对象,而且将构造函数的this
指向所建立的新对象。
有关原型链以及其继承的原理,小编在以前的文章毒鸡汤中,在前面的部分图文结合,已经作了比较详细的介绍,有兴趣的童鞋能够去瞅瞅,小编这里就不过多介绍了(又能够偷懒了)。
有关闭包部分,亦是在毒鸡汤中有所体现。
同步(阻塞模式)指的是:当发送一个请求时,须要等待返回,而后才能发送另外一个请求。其有个等待的过程。此外,同步也能够避免出现死锁,读脏数据的发生。
异步(非阻塞模式)指的是:当发送一个请求时,不须要等待返回,能够随时发送下一个请求。其不须要等待。
区别: 最明显的就是一个须要等待,一个不须要等待。
拓展: 在项目过程当中,能够根据需求,来考虑功能是使用同步仍是异步。通常,有些功能为了缩短用户的等待时间,都会优先采用异步的方式;可是对于数据库保存等操做,通常采用的是同步的方式。
js
引擎中的对象;Object
, Function
, Array
, String
, Boolean
, Number
, Date
, RegExp
, Error
, EvalError
, RangeError
, ReferenceError
, SyntaxError
, Typerror
, URLError
等;Global
(全局对象), Math
;(注意全部的内置对象都是原生对象)window
对象以及其下边的全部子对象(例如dom
等),在node
中是global
以及其子对象,也包含自定义的类对象。function Person(){}
是声明了一个名为Person
的函数;var person = Person()
是直接调用了Person
函数,并将返回值做为值赋值给变量person
;var person = new Person()
建立了一个Person
实例对象;首先咱们先看个例子:
console.log(num); //undefined
var num = 5;
console.log(num) // 5
复制代码
到这里,有基础的小伙伴可能看出来这是为何了。没错,就是变量声明提高!一个变量的生命周期包含3个阶段
var num
;num = 5
;console.log(num)
;上面的例子其实等价于:
var num;
console.log(num); //undefined 由于变量num提高了,可是值并无提高,因此打印出来是undefined
num = 5;
console.log(num) // 5
复制代码
🌈🌈注意: 若是变量是在函数做用域内,那么它的做用域就是函数做用域。不然,它就是全局做用域。
函数声明和函数表达式在语法上是的等价的,可是有一点不一样的是,
js
引擎加载它们的方式不同。简单来讲就是:函数声明会被提高到其做用域顶部,而函数表达式不会。
具体能够看如下两点:
javascript
的一等公民,当一个变量名和函数同名时,函数声明优先变量声明,而且会忽略同名的变量声明。在此长话短说,总的来讲就是let
和const
的声明会造成块级做用域,不存在变量提高且不能重复声明同一变量(或常量)。而var
声明的变量会挂载在window
上,存在变量提高且能够命名重复。
“use strict”
-- 严格模式, ES5
添加的一种运行模式,目的是为了是javascript
在更严格的条件下运行。
js
语法的一些不合理,不严谨之处,减小一些怪异行为;javascript
作好铺垫;🌈🌈注意: 通过测试,目前IE6-9
都不支持严格模式。
如今网站的js
通常都会进行压缩,压缩过程当中,有些文件使用了严格模式,有些却没有。这种状况下原本是严格模式的文件,被merge
后,这个串就到了文件中间,不只没有指示严格模式,在压缩后也会浪费字节。
javascript
是单线程执行的,从上到下一次运行。在js
中分为两个任务,宏任务和微任务。通常状况下,首先执行的是宏任务(就是一般说的第一时间执行全部同步代码),遇到微任务时,先加入队列,宏任务执行完毕再执行微任务。微任务执行完毕以后再往下执行宏任务,执行完后再次执行全部微任务。
简单的理解就是: 宏任务-> 微任务-> 宏任务 ->微任务;
终于详细的执行机制,有兴趣的小伙伴小编建议请移步至毒鸡汤瞅瞅。
类似之处
this
要指向的对象;this
指向的;区别
call
和apply
以后函数可自动执行,可是使用bind
须要手动执行;call
和apply
接收的第一个参数是在其中运行函数的做用域,不一样的是在接收的第二个参数时,apply
接收的是一个数组,而call
接收的是参数列表,须要跟函数保持一一对应。🌈🌈注意: call
和apply
扩充了函数的做用域。
应用场景
apply
;call
;bind
;概念: 事件冒泡是指嵌套最深的元素触发一个事件,而后这个事件顺着嵌套顺序在父元素上触发。而事件委托,是利用事件冒泡原理,让本身所触发的事件,让其父元素代替执行。
冒泡阻止方式:使用event.cancelBubble = true
或者event.stopPropgation()
(低于IE9)。
默认事件阻止方式: e.preventDefault();
或return false;
。
比较简单的方式是能够将其数字对1进行取模,看看是否存在余数。看如下代码:
function isInt(number) {
return number % 1 === 0;
};
console.log(isInt(2.1)); // false
console.log(isInt(2)); // true
复制代码
它是当即调用函数表达式(Immediately-Invoked Function Expression),简称为IIFE
。指的是函数被建立后当即执行。看下面代码:
(function IIFE(){
console.log( "Hello!" );
})();
// "Hello!"
复制代码
这种当即调用函数表达式通常应用于避免污染全局命名空间条件下。由于 IIFE
(与任何其余正常函数同样)内部的全部变量在其做用域以外都是不可见的。
原型模式可用于建立新对象,可是它建立的并非初始化的对象,而是使用原型对象的值进行初始化的对象。原型模式也成为属性模式。
原型模式在初始化业务对象是很是有用,业务对象中的值与数据库的默认值相匹配。原型对象中的默认值被复制到新建立的业务对象中。目前js
在构造新对象及其原型时使用了这个模式。
原型模式包含如下主要角色:
clone()
方法,它是可被复制的对象;clone()
方法来复制新的对象;Jsonp原理: 利用浏览器能够动态的插入一段JS代码并执行;
为何不是真正的AJAX
ajax
和jsonp
在调用方式上虽然长得差很少(目的同样,都是请求一个url
,而后把服务器返回的数据进行处理),可是ajax
和jsonp
本质上是不一样的东西;ajax
的核心是经过XmlHttpRequest
获取非本页内容,而jsonp
的核心则是动态添加<script>
标签来调用服务器提供的js
脚本;ajax
和jsonp
的区别不在因而否跨域。由于ajax
经过服务端代理同样能够实现跨域,jsonp
自己也不排斥同域的数据的获取。还有就是jsonp
是一种方式或者说是非强制协议,如同ajax
同样,它也不必定非要jsonp
格式来传递数据;jsonp
只支持get
请求,ajax
支持get
和post
请求.DOM
根节点。(逐级向上)DOM
根节点开始,依次触发其祖先节点的同类型事件,直到当前节点自身。(逐级向下)dom
同时支持两种事件模型,但捕获性事件先开始,从document
开始也结束于document
,dom
模型的独特之处在于文本也能够触发事件。简单的说分为三个阶段:事件捕捉, 目标阶段, 事件冒泡首先咱们须要明白的是:new
关键字主要的做用仍是在于继承。
对于const a = new Foo();
,new
干的事情。以下代码:
const obj = new Object(); // 声明一个新的空对象obj
obj.__propto__ = Person.prototype; // 让obj的__proto__指向函数原型的prototype
Person.call(obj); // this指向obj对象
person = obj; // 将obj对象赋值给person对象
复制代码
而后咱们来捋一捋,new
一共经历了几个阶段?(4个)
Func
的this
指向obj
,并执行Func
函数体;Func
(构造函数)的返回值类型;defer
属性(页面load
后执行):脚本会被延迟到整个页面都解析完毕以后再执行。如果设置了defer
属性,就等于告诉浏览器当即下载,可是会延迟执行。注意defer
属性只适用于外部脚本文件。async
属性(页面load
前执行):为了避免让页面等待脚本下载和执行,异步加载页面和其余内容。async
一样也只适用于外部文件(不会影响页面加载,可是不能控制加载的顺序)。DOM
方式;jQuery
的getScript()
方法;setTimeout
延迟方法;js
文件最后加载。flash
是个处理多媒体,矢量图形以及访问机器等;可是对于CSS
,文本处理有不足,不容易被搜索;Ajax
对CSS
,文本处理有很好的支持,亦支持搜索;可是对多媒体,矢量图形以及访问机器等不足;共同点:
DOM
;cookies
是服务器暂时放在咱们电脑里的文本文件,好让服务器来辨认咱们的计算机。
当咱们在浏览网站的时候,web
服务器会先发送小部分资料放在咱们的计算机中,cookies
会帮助咱们,将咱们在网站上打印的文字或一些选择记录下来,当咱们再次访问同一个网站,web
服务器会先检查有没有它上次留下的cookies
资料。
如有,会依据cookies
里面的内容来判断使用者,从而给咱们推出相应的网页内容。
json
是一种轻量级的数据交换格式;number
,string
,boolean
, null
),数组,对象;一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。这里咱们能够简单的把进程理解成火车,线程理解为车箱。
区别:
cpu
。(不一样的火车能够开在不一样的轨道上,而同一火车的车箱只能形式在当前火车行驶的轨道上);===
和!==
来作比较;new Array
这种形式;switch
语句必需要带default
分支;fon-in
循环中的变量,用var
关键字说明做用域,防止变量污染;if..else..
条件语句;6
中状况是false
,false
、""
、0
、null
、undefined
、NaN
;其他的都是true
;typeof
,对象类型检测用instanceof
;闭包是可以读取其余函数内部变量的函数,使得函数不被GC
回收。可是滥用闭包,会致使内存泄漏;
js
和图片加载完才执行js;dom
树建立完成就执行的方法,原生是没有这种方法的。ajax
自动断开;ajax
请求,其核心是调用XML
对象的abort
方法,ajax.abort()
;script
,setTimeout
,setInterval
;Promise
,process.nextTick
(node.js);🌈🌈注意: 宏任务中的事件放在callback
queue
中,由事件触发线程维护;微任务的事件放在微任务队列中,由js
引擎线程维护。
get
传参方式是经过地址栏URL传递,是能够直接看到get
传递的参数,post
传参方式参数URL不可见,get
把请求的数据在URL
后经过?
链接,经过&
进行参数分割。psot
将参数存放在HTTP
的包体内;get
传递数据是经过URL
进行传递,对传递的数据长度是受到URL
大小的限制,URL
最大长度是2048
个字符。post
没有长度限制;get
回退不会有影响,post
回退会从新进行提交;get
请求能够被缓存,post
不能够被缓存;get
请求只URL
编码,post
支持多种编码方式;get
只支持ASCII
字符,post
提交没有字符类型限制;get
请求的记录会留在历史记录中,post
请求不会留在历史记录;(1)、1xx(临时响应)
100
: 请求者应当继续提出请求。101
(切换协议) :请求者已要求服务器切换协议,服务器已确认并准备进行切换。(2)、2xx(成功)
200
: 请求成功并返回正确接口结果;201
: 表示资源被正确建立。202
: 请求正确,但结果正在处理中,这时候客户端能够经过轮询等机制继续请求。203
: 非受权信息,服务器已成功处理了请求,但返回的信息可能来自另外一个源;204
: 无内容,服务器成功处理了请求,但没有返回任何内容;205
: 重置内容,服务器成功处理了请求,内容被重置;206
: 部份内容,服务器成功处理了部分请求;(3)、3xx(已重定向)
300
: 已经请求成功,可是有多个结果返回;301
: 请求成功,可是资源被永久转移;302
: 临时移动,请求的网页暂时跳转到其余页面,即暂时重定向;303
: 使用get访问新的地址来获取资源;304
: 请求的资源并无被修改过;305
: 使用代理,请求者应该使用代理访问该页面;306
: 临时重定向,请求的资源临时从其余位置响应;(4)、4xx(请求错误)
400
: 请求出现错误,好比请求头不对等;401
: 没有提供认证信息。请求的时候没有带上 Token
等;402
: 为之后须要所保留的状态码;403
: 请求的资源不容许访问,无权限;405
: 方法禁用,服务器禁用了请求中指定的方法;406
:不接受,没法使用请求的内容响应请求的页面;407
: 请求者须要使用代理受权;408
: 服务器请求超时;409
: 服务器在完成请求时发生冲突;410
:请求的资源已永久删除;411
: 须要有效长度。服务器不接受不含有效内容长度标头字段的请求;412
: 服务器未知足请求者在请求中设置的其中一个前提条件;413
: 请求实体过大,超出服务器的处理能力;414
: 请求网址过长,服务器没法处理;415
: 请求格式不被请求页面支持;416
: 页面没法提供请求的范围;417
: 服务器未知足指望请求标头字段的要求;(5)、5xx(服务器错误)
500
: 服务器内部错误,没法完成请求;501
: 请求尚未被实现,服务器不具有完整的请求功能;502
: 错误网关,服务器做为网关或代理,从上游服务器收到无效响应;503
: 服务不可用;504
:网关超时,服务器做为网关或代理。可是没有及时从上游服务器收到请求;505
:HTTP
版本不支持,服务器不支持请求中所用的HTTP
协议版本。IE
采用的是冒泡型事件,而DOM
是先捕获后冒泡事件;咱们能够看个例子:
<body>
<div>
<button>点击</button>
</div>
</body>
// 冒泡型事件模型: button->div->body (IE事件流)
// 捕获型事件模型: body->div->button (Netscape事件流)
// DOM事件模型: body->div->button->button->div->body (先捕获后冒泡)
复制代码
ie
没有回调函数,只能进行冒泡;addEventListener()
,支持attachEvent
,第一个参数须要加on
;IE
指向windows
,不指向触发的函数;html
页面添加交互行为;html
页面,或单独写成js文件。建议单独写成文件,有利于结构和行为分离,利于维护;windows
,linux
等;首先咱们须要知道:javascript是由ECMAScript,DOM,BOM三部分构成的。
ECMAScript
是一种语言,是对规定的语法,操做,关键字,语句的一个描述,javascript
实现了ECMAScript
;DOM
是文档对象模型,包括了获取元素,修改样式以及操做元素等三方面的内容,也是一般咱们用的最多的操做,其提供了不少兼容性的写法;BOM
是浏览器对象模型,包括浏览器的一些操做,window.onload
, window.open
等还有浏览器时间,监听窗口的改变onresize
,监听滚动事件onscroll
等;(1)、在一个标签内使用localStorage
。setItem(key, value)
添加(删除或修改)内容;
(2)、在另外一个标签页面监听storage
事件;
(3)、获得localStorage
存储的值,便可实现不用页面之间的通讯。
(1)、将要传递的信息存储在cookie
中,能够设置定时读取cookie
的信息,便可随时获取想要传递的信息。
(1)、webworker
做为浏览器的一个新特性,能够提供一个额外的线程来执行一些js代码,而且对浏览器用户界面不影响;
(2)、普通的Webworker
用 new worker()
便可建立,这种webworker
是当前页面专有的。而后还有种共享worker(SharedWorker)
,这种是能够多个标签页、iframe
共同使用;
(1)、SharedWorker
能够被多个window
共同使用,但必须保证这些标签页都是同源的(相同的协议,主机和端口号);
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。
如下几点回形成内存泄露:
dom
的引用);setTimeout
的第一个参数是字符串而不是函数的时候也会形成内存泄露(解决:尽可能不要讲第一个参数定义为字符串);DOM
元素(解决: 手动删除);javascript
具备自动垃圾回收机制,垃圾器回收会按照固定的时间间隔周期性的执行。
常见的垃圾回收机制有两种: 标记清除,引用计数。
原理: 当变量进入环境时,将这个变量标记为“进入环境”。当变量离开时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。
工做流程:
原理: 跟踪记录每一个值被引用的次数,声明一个变量,并将引用 类型赋值给这个变量,则这个值的引用次数+1
,当变量的值变成了另外一个,则这个值的引用次数-1
,当值的引用次数为0
的时候,就回收。
工做流程:
1
;+1
;-1
;0
的值所占的内存;Boolean
, String
, Number
, Null
, Undefined
, Symbol
(新增))的值保存在内存中。从一个变量向另外一个变量赋值基本类型的值,会建立这个值的一个副本;object
)的值是个对象,保存在堆内存中。🌈🌈注意:
javascript
不容许直接访问内存中的位置,也就是不能直接访问操做对象的内存空间。在操做对象时,实际上在操做对象的引用而不是实际的对象;(1)、堆和栈空间分配的区别
(2)、堆和栈缓存方式的区别
(3)、堆和栈结构区别
(1)、DNS解析
DNS
缓存;DNS
缓存;hosts
文件;DNS
服务器发起请求;.win
系统若没有好到,能够操做系统查找NetBIOS name cache
或查询wins
服务器或广播查找或读取LMHOSTS文件;(若以上都没有,则解析失败)
(2)、TCP三次握手
(3)、浏览器向服务器发送http请求
一旦创建了TCP
连接,web
浏览器就会向web
服务器发送请求命令。
(4)、浏览器发送请求头信息
浏览器发送其请求命令以后,还要以头信息的形式想web
服务器发送一些别的信息,以后浏览器发送了一空白行开通知服务器,它已经结束了该头信息的发送。
(5)、服务器处理请求
服务器收到http
请求以后,肯定用相应的一眼来处理请求。读取参数并进行逻辑操做后,生成指定的数据。
(6)、服务器作出响应
客户端向服务器发送请求后,服务端向客户端作出应答。
(7)、服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息同样,服务器也会随同应答向用户发送关于它本身的数据以及被请求的文档。
(8)、服务器发送数据
web
服务器向浏览器发送信息后,它会发送一个空白行来表示头信息的发送到此结束。接着,它会以Content-Type
应答头信息所描述的格式发送用户所请求的实际数据。
(9)、 TCP关闭(四次挥手)
通常状况下,一旦web
服务器向浏览器发送了请求数据,它就要关闭tcp
连接。若是浏览器或服务器在其头信息加入了Connection:keep-alive
,则会保持长链接状态,也就是TCP连接在发送后仍保持打开状态,浏览器能够继续经过仙童的连接发送请求。
(优势:保持连接节省了为每一个请求创建新连接所属的时间,还节约了网络宽带 )
通常状况下,javascript
会更快。javascript
是一种客户端语言,所以它不须要web
服务器的协助来执行。另外一方面,ASP
是服务端语言,所以老是比javascript
慢。可是须要注意的是:javascript
如今也能够用于服务端语言(例如nodejs
)。
java
是一门十分完整,成熟的编程语言;相比之下,javascript
是一个能够被引入HTML
页面的编程语言。这两种语言并非彻底相互依赖的,而是真对不一样的意图而设计的。java
是一种面向对象编程(OOPS
)或结构化的编程语言,相似于C++
和C
;而javascript
是客户端脚本语言,它被称为非结构化编程。负无穷大是javascript
中的一个数字,能够经过将负数除以零获得。
conosle.log(b);
// Uncaught ReferenceError: conosle is not defined
at <anonymous>:1:1
复制代码
undefined
。let c;
console.log(c); // undefined
复制代码
定时器用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码。经过函数setTimeout
、setInterval
和clearInterval
来完成。
function
, delay
)函数用于移动在所述延迟以后调用特定功能的定时器;function
,delay
)函数用于在提到的延迟中重复执行给定的功能,只有在取消时才能中止;id
)函数指示定时器中止;🌈🌈注意: 定时器在一个线程内运行,所以事件可能须要排队等待执行;
web
应用程序中的全部页面上访问的用户特定数据;delete
操做符用于删除程序中的全部变量或对象,可是不能删除使用var
关键字声明的变量。
console.log(5 + 8 + '7'); // 137
console.log(5 + '8' + 7); // 587
复制代码
能够这样理解:连续的整数能够直接相加,字符串直接相连。
innerHTML
’同样使用;+=like "innerHTML = innerHTML + 'html'"
,旧的内容仍然会被html
替换;innerHTML
内容被从新解析并构建成元素,所以它的速度会慢不少;innerHTML
不提供验证,所以可能会在文档中插入有效的和破坏性的HTML
并将其中断;JS的错误类型通常包含六种常见的派生错误以及手动抛出错误类型。
(1)、常见的几种错误类型
eval()
函数没有被正确执行时,会抛出evalError
错误;通常状况下,当页面首先加载脚本时,加载期间页面的HTML
代码将会暂停解析,直到脚本加载完才能执行。
因此会出现这么一种状况,就是当服务器速度很慢或者脚本很沉重的状况下,会致使网页延迟。在使用Defer
时,脚本会延迟执行直到html
解析器运行完成。这极大程度上减小了加载时间,提高了显示速度。
encodeURI()
用于将URL
转为十六进制编码,而decodeURI()
用于将编码的URL
转换成正常的URL
。
哈希表(亦称散列表),是根据关键码值直接进行访问的数据结构。也就是说,它经过把关键码映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数也称散列函数,存放记录的数组叫作散列表。
nodeType === 1
;nodeType === 2
;nodeType === 3
;innerHTML
(元素内包含的内容);outerHTML
(本身以及元素内的内容);offsetWidth/offsetHeight
(content
宽/高 + padding
宽/高 + border
宽/高);clientWidth/clientHeight
(content
宽/高 + padding
宽/高);CSS
、JS
文件;CSS
、JS
文件,减小http
请求;JS
、CSS
放在最底层;DOM
操做,尽量使用变量代替没必要要的DOM
操做;gzip
压缩;AJAX
对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp)
);open
打开链接,格式为open
(请求方式,'请求路径',同步/异步);send()
;ajax
对象完成第四步(onreadystatechange)
,数据接收完成。再判断对象状态码(readystate)
当状态码为成功接收的状态码时,HTTP
响应彻底接收 。 再判断http
响应状态(200-300
之间或者304
),(缓存)执行回调函数 获取的数据转成字符串格式(responseText)
。缺点:
ajax
下的先后退功能成本比较大;浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上岁最近请求过的文档进行存储,当用户再次访问这个文档时,浏览器会从本地磁盘显示此文档,从而提高页面加载速率。
cache-control
中的max-age
是实现内容cache
的重要手段,经常使用的策略有如下三种:
max-age
和ETag
的组合;max-age
;max-age
和Last-Modified
(If-Modified-Since)的组合;在此,拓展一下有关强制缓存(200)和协商缓存(304)部分的内容。
respone header
里面对该文件作了缓存配置。强制缓存不会向服务器发送请求,直接从缓存中读取资源,在chrome
控制台的network
选项中能够看到该请求返回200
的状态码;Etag
和Last-Modified
经过请求发给服务器,由服务器校验,返回状态码304
时,浏览器就能够直接使用缓存。共同点: 都是从客户端中读取数据;
区别: 强缓存不会发出请求,协商缓存会发出请求。
缓存中header(头部)的参数:
(1)、强制缓存:
response header
里的过时时间,浏览器再次加载资源时,若是在这个过时时间内,则命中强缓存。max-age=120
时,则表明在这个请求正确返回时间(浏览器也会记录下来)的2
分钟内再次加载资源,就会命中强缓存。(2)、协商缓存
hash
,每一个文件惟一。web
服务器响应请求时,告诉浏览器当前资源在服务器的惟一标识(生成规则由服务器决定);Cache-Control
标识的max-age
),发现资源具备Etag
声明,则再次向web
服务器请求时带上头If-None-Match
(Etag的值)。web
服务器收到请求后发现有头If-None-Match
则与被请求资源的相应校验串进行比对,决定是否命中协商缓存;header
中会加上Last-Modify
,Last-modify
是一个时间标识该资源的最后修改时间;当浏览器再次请求该资源时,request
的请求头中会包含If-Modify-Since
,该值为缓存以前返回的Last-Modify
。服务器收到If-Modify-Since
后,根据资源的最后修改时间判断是否命中缓存;🌈🌈注意:
Etag
要优于Last-Modified
;Etag
;Etag
要逊于Last-Modified
。这里,小编的理解是:虚拟DOM
是真实DOM
的内存表示,是一种编程概念,一种模式。它的做用是判断DOM
是否改变、哪些部分须要被从新渲染。这样,不须要操纵真实的DOM
,同时极大的提升了React
的性能。
虚拟DOM
使用diff
算法,当咱们屡次修改某一部分的内容时,首先在虚拟DOM
树从上至下进行同层比对(不影响真实DOM
),上层发生变化,下层从新渲染,直到最后修改完成,再在真实DOM
中渲染。
使用虚拟DOM
的缘由是,能够极大程度上减小DOM
节点的回流和重绘问题,节约资源,提高运行效率。
DOM
不会进行重排和重绘;DOM
进行频繁的修改,而后一次性比较并修改真实DOM
中须要修改的部分,最后进行回流和重绘,有效的减小了过多DOM
节点回流和重绘资源消耗的问题;DOM
有效下降大面积(真实DOM
节点)的回流和重绘,由于最终与真实DOM
比较差别,能够局部渲染。协议、域名、端口号不一样--跨域(也能够理解为协议、域名、端口号相同--同源策略)
解决跨域的几种办法:
document.domain + iframe
(只有在主域相同的状况下才能使用);script
;location.hash + iframe
;window.name + iframe
;postMessage
(HTML5
中的XMLHttpRequest Level 2
中的API
);CORS
(跨域资源共享);jsonp
;websockets
;跨站脚本攻击,黑客将恶意脚本代码植入到页面中从而实现盗取用户信息等操做(注意这里操做的是用户,攻击的方式只是代码的嵌入)。
预防措施:
post
,对get
使用时尽可能对路径长度作限制;httponly
来方式黑客经过脚本获取用户cookie
数据。跨站请求伪造,黑客假装成用户身份来执行一些非用户自愿的恶意以及非法操做(注意,这里是黑客假装成用户操做)。
预防措施:
token id
令牌;reFerer
是否正确;CSRF
须要登录后操做,XSS
不须要;CSRF
是请求页面api
来实现非法操做,XSS
是向当前页面植入js
脚原本修改页面内容。浏览器端异步和服务器端同步的模块化编程规范。
CommonJS:是为了解决 JavaScript
的做用域问题而定义的模块形式,可使每一个模块它自身的命名空间中执行。该规范的主要内容是,模块必须经过 module.exports
导出对外的变量或接口,经过 require()
来导入其余模块的输出到当前模块做用域中,module
标识模块自己。
AMD:是全局定义的,当即执行函数提供 module
和 exports
两个外部变量,模块就放在这个当即执行函数里面。模块的输出值放在 module.exports
之中,这样就实现了模块的加载。
var func = function() {};
定义的函数;区别:
undefined
;javascript
访问不会报错;检测方式:
null
是一种特殊的object
,表示无值;console.log(typeof null); // object
const a = null;
if(!a && typeof(a) !== 'undefined' && a!==0) {
alert('a is null')
} else {
alert('a is not null')
}
复制代码
undefined
: 是声明但未赋值的变量;const a = undefined;
if(typeof(a) === 'undefined') {
alert('a is undefined')
} else {
alert('a is not undefined')
}
复制代码
undeclared
:undeclared
是未声明也未赋值的变量,JavaScript
访问会报错。JS
中,对象是引用类型的数据,其优势在于频繁的修改对象时都是在原对象的基础上修改的,并不须要进行从新建立,这样就能够有效的利用内存,不会形成内存空间的浪费;immutable
对象时,都会建立一个新的不可变对象,在新对象上的操做不会影响到原对象的数据。Promise
是异步编程的一种解决方案,比传统的解决方案 回调函数和事件 更合理和更强大。它由社区最先提出和实现,ES6
将其写进了语言标准,统一了用法,原生提供了Promise
对象。
所谓Promise
,简单说就是一个容器,里面保存着某个将来才会结束的事件(一般是一个异步操做)的结果。从语法上说,Promise
是一个对象,从它能够获取异步操做的消息。Promise
提供统一的API
,各类异步操做均可以用一样的方法进行处理。
有了Promise
对象,就能够将异步操做以同步操做的流程表达出来,避免了层层嵌套的回调函数。此外,Promise
对象提供统一的接口,使得控制异步操做更加容易。
但Promise
同时存在一些缺点,例如:
Promise
,一旦新建它就会当即执行,没法中途取消;Promise
内部抛出的错误,不会反应到外部;Pending
状态时,没法得知目前进展到哪个阶段(刚刚开始仍是即将完成)。UA
字符串因为被浏览器厂商能够随意修改,所以给使用者的感受不太靠谱。Function.prototype.bind
方法会建立一个新的函数,当这个新函数被调用时,它的this
值是传给bind()
的第一个参数,它的参数是bind()
的其它参数和其本来的参数。
关于javascript
部分的整理,就先整理到这里吧,后继会持续更新。有关开发性能优化篇小编还在整理当中,可是因为最近项目压身,可能会延迟一丢丢吧(生活不易且珍惜🌻🌻)。
整理的过程当中,不免会有疏漏,如果看到有误或者须要补充的知识点,欢迎留言小编💌💌。