年纪渐渐大了,总喜欢怀旧,整理以前记得笔记看看还是有一些收获。
数据类型和运算符
基本数据:
- 数字Number类型
- 字符串String类型
- 布尔Boolean类型
- 未定义Undefined类型
- 空值Null类型
复杂数据类型:
- 对象Object类型
- 数组Array类型
- 函数Function类型
数据类型的检测:
typeof:后面紧跟小括号或用空格
可以检测的类型有number,string,undefined,boolean,function,
不可以检测的类型有array,null,object,reg,arguments等
constructor:返回创建实例对象的构造函数的引用,所有对象都会从它的原型上继承一个 constructor
属性:如果重写propotype原型对象会丢失原来的constructor,null和undefined没有constructor。
instanceof检测某一个实例是否属于这个类,在关于类之间通过原型链的方式实现继承的时候,我们instanceof检测出来的结果不准确。
如[] instanceof Object
返回true。
toString:toString检测数据类型的原理:执行Object原型上的toString,让这个方法中的this变为我们要检测的那个值,就是实现数据类型的检测
Object.prototype.toString.call(null);
运算符优先级
一. 括号
()
,优先级最高,以下逐步降低。二. 一元运算符 自加
++
,自减--
,取反!
。三. 算数运算符 乘除
*/
,取余%
,加减+-
。四. 关系运算符 大于小于
><
,大于等于>=
,小于等于<=
。五. 相等运算符 相等
== ===
,不相等!= !==
。六. 逻辑运算符 逻辑与或
&& ||
,逻辑与高于逻辑或。七. 赋值运算符
=
会将右边的结果赋值给左边。
函数
函数的参数
不定参arguments,代表所有实参的集合。通过下标获取参数的每一位;通过length获取实参的个数;集合是类数组,可以使用下标,但是没有数组中的各种方法。
...rest剩余参数,剩余参数只包含那些没有对应形参的实参,剩余参数是真正的 Array
实例。
函数的方法
- Function.prototype.call()使用一个指定的
this
值和单独给出的一个或多个参数来调用一个函数。 - Function.prototype.apply()使用一个指定的
this
值和传入一个数组作为参数来调用一个函数。 - Function.prototype.bind()使用一个指定的
this
值传入一个或多个参数返回一个新函数。
变量提升(预解析机制)
JS在读取到一个script标签(或者一个函数作用域)时,会把var声明的变量和function声明的函数体,提升到整个scriptt标签(或者一个函数作用域)最前边去。
var在预解析时,只提升声明,不会把赋值过程进行提升。function的函数体在预解析时,会把整个函数体提升至最前边。在预解析时,把var放在最前面,然后再预解析function,所以当var和function重名时,function会覆盖var;
作用域
作用域的分类:
- 全局作用域:通过var或function声明在全局(声明在任意函数之外和代码块之外)中的数据,在全局的任意地方都可以调用或修改(即全局变量)和在window下的属性
- 局部作用域:
函数作用域:声明在函数内部的某个数据(var,function,参数),就只能在函数内部使用(函数的局部作用域)
块级作用域(ES6新增)
作用域链:作用域链查找过程:在JS中我们调用一条数据时,会先在当前作用域进行查找,如果找不到,就从向上找父作用域的数据,还找不到就接着向上,一直找到全局作用域(window对象),window都找不到就报错。
闭包
js的作用域决定了外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量。
作用域的销毁:一般情况下,函数执行形成一个私有的作用域,当执行完成后就销毁了.
父函数返回子函数,调用父函数将子函数赋值给一个全局变量,子函数始终存在内存中,子函数存在依赖于父函数,因此父函数始终存在内存中,不会在调用结束后,被垃圾回收机制回收。
函数柯里化
把接受多个参数的函数变换成接受一个单一参数的函数(利用闭包对这个参数进行缓存),并且返回接受余下的参数而且返回结果的新函数的技术。
函数重写
函数重写基本思路是把原函数缓存起来,原函数名重新赋一个函数并调用缓存的函数。
console.log = function(console){
return function(){
console.apply(this,arguments)
}
}(console.log)
var _log = console.log;
console.log = function(){
_log.apply(this,arguments);
}
对象
对象的方法
hasOwnProperty():
返回一个布尔值,指示对象自身属性中是否具有指定的属性。
isPrototypeOf():
用于测试一个对象是否存在于另一个对象的原型链上。
Object.assign():
用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.create():
创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。即创建一个以指定的对象为原型的子对象。
Object.setPrototypeOf():
设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或null。
Object.getPrototypeOf():
返回指定对象的原型(内部[[Prototype]]
属性的值)。
Object.defineProperties():
直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
Object.defineProperty()
:会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
Object.keys()
:会返回一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in循环遍历该对象时返回的顺序一致 。
Object.values()
:返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
Object.entries()
:返回一个给定对象自身可枚举属性的键值对数组,其排列与使用for...in循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)。
Object.fromEntries()
:把键值对列表转换为一个对象,是Object.entries()
的逆操作。
Object.getOwnPropertyNames(obj)
返回对象的所有可枚举和不可枚举的键名所组成的数组。(对应in关键字)
Object.is():
判断两个值是否是相同的值。
js的原型对象
所有的js对象中可以定义自己的属性和方法,所有的js对象都会从改对象的原型对象中继承属性和方法。原型对象中有属性和方法,说明原型对象本质也是一个对象。
原型链
js的构造函数
所有的对象都是经过new关键字创建的,包括定义的数组[],对象{},正则/^$/g等,也是语法糖,也是通过new关键字和构造函数创建的。构造函数就是js的普通函数,和new一起使用后该函数会被js引擎重新调用,并且发生一些变化。
-
函数的返回值不受控制,强制返回一个对象。
-
函数作用域的this强制指向该函数返回的对象。
-
返回的对象的原型对象指向了函数的prototype。
通过new和构造函数创建一个对象obj,下面简称obj。来说明构造函数,实例对象和原型对象三者的关系
构造函数和原型对象的关系
- 访问obj的constructor属性,发现指向了该对象的构造函数。
- constructor属性并不是在obj的身上,而是在obj所创建的原型对象身上。obj只不过继承了原型对象的属性和方法。也就是说原型对象的constructor指向了构造函数。
- 构造函数的prototype属性指向了原型对象。
构造函数.prototype.constructor === 构造函数
形成了闭环。
实例对象obj和原型对象的关系
-
obj有一个属性__proto__属性,指向了obj的原型对象,当然可以继续向上指,原型对象也有__proto__指向原型对象的原型对象。
-
可以通过标准的api过去obj的原型对象,通过
Object.getPrototypeOf(obj)
的返回值是obj的原型对象 -
Object.getPrototypeOf(obj) === obj.__proto__
该公式是原型链的获取方式。 -
指定一个对象的原型对象,(一)直接修改
obj.__proto__
该方法不推荐。(二)使用Object.create()
创建一个新的对象,使用现有对象来作为新创建对象的原型对象。(三)Object.setPrototypeOf() 方法用于重新指定一个对象的原型对象。
构造函数和实例对象的关系
-
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链上。用来检测obj实例是不是由某个构造函数创建的。 -
实例对象的constructor指向了构造函数,实际上是因为实例对象继承了原型对象和构造函数的关系。
数组
数组的方法
Array.prototype.pop()
:删除末尾的元素,返回被删除的元素,改变原数组。
Array.prototype.push()
:末尾追加元素,返回数组的length,改变原数组。
Array.prototype.shift()
:删除开头的元素,返回被删除的元素,改变原数组。
Array.prototype.unshift()
:开头追加元素,返回数组的length,改变原数组。
Array.prototype.sort()
:对数组进行排序,返回排序后的数组,改变原数组。
Array.prototype.splice()
:插入,删除,替换,(删除开始位置,删除个数,添加的元素)返回被删除元素组成的数组,改变原数组。
Array.prototype.concat()
:返回合并后的数组,可以传入单个元素也可以传入数组,不改变原数组。
Array.prototype.slice()
:输入的拆分,返回新数组([开始的位置,结束的位置)),不改变原数组。
Array.prototype.join()
:用传入的参数连接每一个成员,并返回一个字符串,默认是以逗号连接。
Array.prototype.forEach()
:对数组的每个元素执行一次给定的函数。返回undefined。
Array.prototype.filter()
:方法创建一个新数组, 其包含通过所提供函数返回true的所有元素。
Array.prototype.map()
:方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
Array.prototype.reduce()
:方法对数组中的每个元素执行一个函数,将其结果汇总为单个返回值。参数说明array.reduce(function(初始值|计算结束后的返回值, 当前元素, 当前索引, 数组对象), initialValue)
initialValue:可选项,其值用于第一次调用 callback 的第一个参数。如果没有设置初始值,则将数组中的第一个元素作为初始值。空数组调用reduce时没有设置初始值将会报错。提供该值遍历n次,否则遍历n-1次。
Array.prototype.flat()
:方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。array.flat(Infinity);可展开任意深度的嵌套数组。flat() 方法会移除数组中的空项。
Array.prototype.some()
:方法测试数组中是不是至少有1个元素通过了被提供的函数测试。返回布尔值
Array.prototype.every()
方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。返回布尔值
Array.prototype.includes()
方法用来判断一个数组是否包含一个指定的值,返回布尔值
Array.prototype.find()
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined
。
Array.prototype.findIndex()
方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。
内置及包装对象
String对象
String.prototype.charAt()
:从一个字符串中返回指定的字符。如果没有提供索引,charAt() 将使用0。
String.prototype.concat()
:方法将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回。建议使用赋值操作符(+
, +=
)代替 concat
方法。
String.prototype.slice()
:提取某个字符串的一部分返回一个新的字符串,且不会改动原字符串。参数string.slice(开始索引,结束索引)可以传入负数。
String.prototype.substring
:返回一个字符串在开始索引到结束索引之间的一个子集,而substring不支持负数,它会被视为substring(0);因此substring的start和end位置调换也没关系,规则是由数值小的位置到数值大的位置,而slice则不行!当start,end都为正或为负时,slice的start必须比end小,否则没有值.
String.prototype.toUpperCase()
:方法将调用该方法的字符串转为大写形式并返回.
String.prototype.toLowerCase()
:会将调用该方法的字符串值转为小写形式,并返回。
String.prototype.search()
: 方法执行正则表达式和 String
对象之间的一个搜索匹配。返回正则表达式在字符串中首次匹配项的索引;否则,返回 -1
。
String.prototype.match()
: 方法检索返回一个字符串匹配正则表达式的结果。
String.prototype.replace()
:方法返回一个由替换值(replacement
)替换部分或所有的模式(pattern
)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern
是字符串,则仅替换第一个匹配项。
String.prototype.split()
:方法使用指定的分隔符字符串将一个String
对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。
String.prototype.trim()
:方法会从一个字符串的两端删除空白字符。
String.prototype.indexOf()
:方法返回调用它的 String 对象中第一次出现的指定值的索引,从 fromIndex 处进行搜索。如果未找到该值,则返回 -1。
String.prototype.lastIndexOf()
:方法返回调用String 对象的指定值最后一次出现的索引,在一个字符串中的指定位置 fromIndex处从后向前搜索。如果没找到这个特定值则返回-1 。
String.prototype.includes()
:方法用于判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false。
String.prototype.startsWith()
:方法用来判断当前字符串是否以另外一个给定的子字符串开头,并根据判断结果返回 true
或 false
。
String.prototype.endsWith()
:方法用来判断当前字符串是否是以另外一个给定的子字符串“结尾”的,根据判断结果返回 true
或 false
。
String.prototype.repeat()
:构造并返回一个新字符串,该字符串包含被连接在一起的指定数量的字符串的副本。
Boolean对象
Number对象
实例方法:Number.prototype.toFixed()
方法使用定点表示法来格式化一个数值。
对象方法:Number.isFinite()
方法用来检测传入的参数是否是一个有穷数。
对象方法:Number.isInteger()
方法用来判断给定的参数是否为整数。
对象方法:Number.isNaN()
方法确定传递的值是否为 NaN
,并且检查其类型是否为 Number
。它是原来的全局 isNaN()
的更稳妥的版本。
对象方法:Number.parseFloat()
方法可以把一个字符串解析成浮点数。该方法与全局的 parseFloat()
函数相同,并且处于 ECMAScript 6 规范中(用于全局变量的模块化)
对象方法:Number.parseInt()
方法依据指定基数,把字符串解析成整数。
Math对象
Math
是一个内置对象,所有属性与方法都是静态的。
Math.abs()
函数返回指定数字的绝对值。
Math.cbrt()
函数返回任意数字的立方根.
Math.ceil()
函数返回大于或等于一个给定数字的最小整数。
Math.floor()
返回小于或等于一个给定数字的最大整数。
Math.hypot()
函数返回所有参数的平方和的平方根
Math.max()
函数返回一组数中的最大值。
Math.min()
返回零个或更多个数值的最小值。
Math.pow()
函数返回基数的指数次幂,同**
。
Math.random()
函数返回一个浮点数, 伪随机数在范围从0到小于1,也就是说,从0(包括0)往上,但是不包括1。
Math.round()
函数返回一个数字四舍五入后最接近的整数。
Math.sign()
函数返回一个数字的符号, 指示数字是正数,负数还是零。共有5种返回值, 分别是 1, -1, 0, -0, NaN. 代表的各是正数, 负数, 正零, 负零, NaN。
Math.sqrt()
函数返回一个数的平方根。
Math.trunc()
方法会将数字的小数部分去掉,只保留整数部分。
Data对象
Date是构造函数,创建一个新Date
对象的唯一方法是通过new
操作符。
Date.prototype.getFullYear()
方法根据本地时间返回指定日期的年份。
Date.prototype.getMonth()
根据本地时间,返回一个指定的日期对象的月份,为基于0的值(0表示一年中的第一月)。
Date.prototype.getDate()
根据本地时间,返回一个指定的日期对象为一个月中的哪一日(从1--31)。
Date.prototype.getDay()
方法根据本地时间,返回一个具体日期中一周的第几天,0 表示星期天。对于某个月中的第几天。
Date.prototype.getHours()
方法根据本地时间,返回一个指定的日期对象的小时。
Date.prototype.getMinutes()
方法根据本地时间,返回一个指定的日期对象的分钟数。
Date.prototype.getSeconds()
方法根据本地时间,返回一个指定的日期对象的秒数。
Date.now()
方法返回自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数。
DOM对象
节点类型
Element类型
Element提供了对元素标签名,子节点和特性的访问,我们常用HTML元素比如div,span,a等标签就是element中的一种。
(1)nodeType为1
(2)nodeName为元素标签名,tagName也是返回标签名
(3)nodeValue为null
(4)parentNode可能是Document或Element
(5)子节点可能是Element,Text,Comment,Processing_Instruction,CDATASection或EntityReference
Text类型
Text表示文本节点,它包含的是纯文本内容,不能包含html代码,但可以包含转义后的html代码。Text有下面的特性:
(1)nodeType为3
(2)nodeName为#text
(3)nodeValue为文本内容
(4)parentNode是一个Element
(5)没有子节点
Attr类型
Attr类型表示元素的特性,相当于元素的attributes属性中的节点,它有下面的特性:
(1)nodeType值为2
(2)nodeName是特性的名称
(3)nodeValue是特性的值
(4)parentNode为null
Comment类型
Comment表示HTML文档中的注释,它有下面的几种特征:
(1)nodeType为8
(2)nodeName为#comment
(3)nodeValue为注释的内容
(4)parentNode可能是Document或Element
(5)没有子节点
Document
Document表示文档,在浏览器中,document对象是HTMLDocument的一个实例,表示整个页面,它同时也是window对象的一个属性。Document有下面的特性:
(1)nodeType为9
(2)nodeName为#document
(3)nodeValue为null
(4)parentNode为null
(5)子节点可能是一个DocumentType或Elemen
DocumentFragment类型
DocumentFragment是所有节点中唯一一个没有对应标记的类型,它表示一种轻量级的文档,可能当作一个临时的仓库用来保存可能会添加到文档中的节点。DocumentFragment有下面的特性:
(1)nodeType为11
(2)nodeName为#document-fragment
(3)nodeValue为null
(4)parentNode为null
节点创建型api
createElement
createElement通过传入指定的一个标签名来创建一个元素,如果传入的标签名是一个未知的,则会创建一个自定义的标签。
createTextNode
createTextNode接收一个参数,这个参数就是文本节点中的文本,和createElement一样,创建后的文本节点也只是独立的一个节点,同样需要appendChild将其添加到HTML文档树中
cloneNode
cloneNode是用来返回调用方法的节点的一个副本,它接收一个bool参数,用来表示是否复制子元素,参数为true,表示parent的子节点也被复制,如果传入false,则表示只复制了parent节点。
这里有几点要注意:
(1)和createElement一样,cloneNode创建的节点只是游离有html文档外的节点,要调用appendChild方法才能添加到文档树中
(2)如果复制的元素有id,则其副本同样会包含该id,由于id具有唯一性,所以在复制节点后必须要修改其id
(3)调用接收的bool参数最好传入,如果不传入该参数,不同浏览器对其默认值的处理可能不同。
createDocumentFragment
createDocumentFragment方法用来创建一个DocumentFragment。在前面我们说到DocumentFragment表示一种轻量级的文档,它的作用主要是存储临时的节点用来准备添加到文档中。
createDocumentFragment方法主要是用于添加大量节点到文档中时会使用到。假设要循环一组数据,然后创建多个节点添加到文档中。
页面修改型API
appendChild
将指定的节点添加到调用该方法的节点的子元素的末尾。如果被添加的节点是一个页面中存在的节点,则执行后这个节点将会添加到指定位置,其原本所在的位置将移除该节点,也就是说不会同时存在两个该节点在页面上,相当于把这个节点移动到另一个地方。
insertBefore
insertBefore用来添加一个节点到一个参照节点之前,和appendChild一样,如果插入的节点是页面上的节点,则会移动该节点到指定位置,并且保留其绑定的事件。
replaceChild
replaceChild用于使用一个节点替换另一个节点。
removeChild
删除子节点并返回子节点。
节点关系型api
父关系型api
parentNode:每个节点都有一个parentNode属性,它表示元素的父节点。Element的父节点可能是Element,Document或DocumentFragment。
parentElement:返回元素的父元素节点,与parentNode的区别在于,其父节点必须是一个Element,如果不是,则返回null
兄弟关系型api
previousSibling:节点的前一个节点,如果该节点是第一个节点,则为null。注意有可能拿到的节点是文本节点或注释节点,与预期的不符,要进行处理一下。
previousElementSibling:返回前一个元素节点,前一个节点必须是Element,注意IE9以下浏览器不支持。
nextSibling:节点的后一个节点,如果该节点是最后一个节点,则为null。注意有可能拿到的节点是文本节点,与预期的不符,要进行处理一下。
nextElementSibling:返回后一个元素节点,后一个节点必须是Element,注意IE9以下浏览器不支持。
子关系型api
childNodes:返回一个即时的NodeList,表示元素的子节点列表,子节点可能会包含文本节点,注释节点等。
children:一个即时的HTMLCollection,子节点都是Element,IE9以下浏览器不支持。
firstNode:第一个子节点
firstElementNode:第一个子元素
lastNode:最后一个子节点
lastElementNode:最后一个子元素
hasChildNodes方法:可以用来判断是否包含子节点。
元素属性型api
setAttribute:根据名称和值修改元素的特性。
getAttribute:返回指定的特性名相应的特性值,如果不存在,则返回null或空字符串。
removeAttribute:根据名称删除某个属性。
元素样式型api
window.getComputedStyle是用来获取应用到元素后的样式,假设某个元素并未设置高度而是通过其内容将其高度撑开,这时候要获取它的高度就要用到getComputedStyle
标签属性和Dom对象属性名称相同的id
,name
,type
,checked
,title
,src
,href
。chass在对象种的属性是className。
BOM对象
window.location
location.reload()
重载页面,当取值为 true
时,将强制浏览器从服务器重新获取当前页面资源,而不是从浏览器的缓存中读取,如果取值为 false
或不传该参数时,浏览器则可能会从缓存中读取当前页面。
location.href = 'src'
属性是一个可读可写的字符串,可设置或返回当前显示的文档的完整 URL。
location.assign()
方法会触发窗口加载并显示指定的URL的内容。
location.replace()
replace() 方法可用一个新文档取代当前文档。无历史记录。
location.href()
获取当前地址栏url
location.hash()
获取地址栏种#号后面的内容
location.search()
获取地址栏?号后面的内容
location.hostname()
获取域名
location.pathname()
获取目录地址
location.port()
获取端口号
location.protocol()
获取协议
window.history
history.back()
后退
history.forward()
前进
history.length
历史长度
history.go()
跳转到指定历史
Promise
promise方法
-
promise有三种状态,分别是pending(进行中),resolved(成功),rejected(失败)。异步操作的结果可以决定当前是那一种状态。
-
一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象状态的改变只有两种可能。从pending变为resolved和从pending变成rejected。变化后状态就凝固了。
-
then,catch都会被当作异步代码,在同步代码执行完成后的微任务队列中执行。
-
如果resolve传入的是一个promise,那么必须等待promise执行完成后,then或catch会接受传入的promise的结果。并不能得到当前promise的结果。
-
then方法执行完成后一定返回一个promise对象。如果内部return一个基本数据类型或对象。将会被包装成resolve状态的Promise对象
-
finally无论处于什么状态都会执行的代码。
-
promise.all()方法用于将多个promise实例包装成一个新的promise实例,所有子promise全部未resolved状态,则它就是resolved,其中一个rejected那么就直接rejected,then的参数是所有子promise的结果组成的数组。
-
promise.race()方法将多个promise实例包装成一个promise实例,then方法只接受执行最快的那个promise的参数。所有子promise之中有一个实例率先改变,当前promise的状态就跟着改变。
-
promise.resolve()
参数是一个 Promise 实例
如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。
参数是一个thenable对象
thenable对象指的是具有then方法的对象,Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。
参数是一个基本数据类型或者普通对象
promise.resolve方法返回一个新的状态为resolved的promise对象
不带任何参数
直接返回一个resolved状态的promise对象,then的返回值是undefined。 -
promise.reject()
返回一个新的promise实例,该实例的状态为rejected。promise.reject()方法的参数会原封不动的作为reject的理由,变成后续方法的参数。
事件队列
事件轮询
javascript代码执行顺序:1. 执行同步代码。2. 异步函数到了指定的时间再放到异步队列。3. 同步执行完毕,异步队列轮询执行。
当一个异步函数执行完之后,再到异步队列监视,一直不断循环往复,叫事件轮询。js引擎遇到异步事件后并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。
当一个异步事件返回结果后,js将这个事件加入与当前执行栈不同的另一个队列,我们称之为事件队列。被放入事件队列并不会立即执行其回调,而是等待当前执行栈中的所有任务都执行完毕,主线程处于闲置状态时,主线程会去查找事件队列中是否有任务。
如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码。
宏任务和微任务
当前执行栈执行完毕时会立刻先处理所有微任务队列中的事件,然后再去宏任务队列中取出一个事件。同一次事件循环中,微任务永远在宏任务之前执行。
宏任务:
I/O
setInterval
setTimeout
setImmediate
requestAnimationFrame
微任务:
process.nextTick
Promise.then.catch.finally
MutationObserve
正则表达式
语法/主体/修饰符
字符串传入正则的方法
split()根据匹配到的字符来切割字符串成数组。
match()返回一个包含匹配结果的数组。
search()对正则表达式或指定字符串进行搜索,返回第一个出现匹配项的下标。
replace()用正则表达式和字符串直接比较,然后用新的字串来替换被匹配的子串。
正则匹配的方法
exec()在字符串中寻找匹配的字符串。
test()检测当前正则是否匹配目标字符串。
修饰符
i(ignore)不区分大小写
g(global)执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m(multiline)执行多行匹配。当目标字符串含有\n,而且正则表达式中含有^或$的时候,/m修饰符才有作用。
exec()方法当使用/g匹配模式的时候,我们可以通过循环,获取所有的匹配项。
+
前面的字符出现1次或多次。等价于{1,}
*
前面的字符出现0次或多次。等价于{0,}
?
前面的字符出现0次或1次。等价于{0,1}
+
前面的字符出现1次或多次。等价于{1,}
{n}
前面的字符出现n次。
{n,}
前面的字符至少出现n次。
{n,m}
前面的字符出现n次到m次。
^
匹配字符串的开始的位置,如果设置了multiline属性,^也匹配\n或\r之后的位置。
$
匹配字符串的结束位置,如果设置了multiline属性,$也匹配\n或\r之前的位置。
贪婪模式:*,+,?,{n},{n,},{n,m}
在匹配时,在匹配一段内容时,遇到多个结束条件会默认匹配最后的结束条件。会尽可能的多的匹配内容。在这些限定符后面加一个?
可以实现最小匹配。
.
匹配除换行符之外的任何单个字符。
x|y
匹配x或y。
[xyz]
字符集合,匹配所包含的任意一字符。
[^xyz]
匹配未包含的任意字符。
[a-z]
匹配任意一个英文小写字符。
[a-Z]
匹配任意一个英文字符。
\b
匹配一个单词边界,单词和空格的位置。如/er\b/
匹配never中的er。
\B
匹配非单词边界。
\d
匹配一个数字字符,等价于[0-9]。
\D
匹配一个非数字字符。等价于[^0-9]
\s
匹配一个空白符包括\f
换页符,\n
换行符,\r
回车符,\t
制表符,\v
垂直制表符号
\S
匹配任何一个非空字符。
\w
匹配数字字母下划线,等价于[A-z0-9_]
\W
匹配非数字字母下划线。