年纪渐渐大了,总喜欢怀旧,整理以前记得笔记看看还是有一些收获。

数据类型和运算符

基本数据:

  1. 数字Number类型
  2. 字符串String类型
  3. 布尔Boolean类型
  4. 未定义Undefined类型
  5. 空值Null类型

复杂数据类型:

  1. 对象Object类型
  2. 数组Array类型
  3. 函数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():方法用来判断当前字符串是否以另外一个给定的子字符串开头,并根据判断结果返回 truefalse

String.prototype.endsWith():方法用来判断当前字符串是否是以另外一个给定的子字符串“结尾”的,根据判断结果返回 truefalse

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匹配非数字字母下划线。

posted on 2021-12-23 17:05  解放牌翻斗车  阅读(64)  评论(0编辑  收藏  举报