简介
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。
小于 1 分钟
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automaton,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。
弱引用:不会影响垃圾回收机制。即: WeakMap 的 key 不再存在任何引用时,会被直接回收。
强引用:会影响垃圾回收机制。存在强应用的对象永远不会被回收。
<script>
let obj1 = {
name: '张三'
}
let obj2 = {
name: '张三'
}
// 强引用
const map = new Map()
// 弱引用
const weakMap = new WeakMap()
map.set(obj1,'value')
weakMap.set(obj2,'value')
obj1 = null
obj2 = null
console.log('map',map) // Map(1) {{…} => 'value'}
console.log('weakMap',weakMap) // WeakMap {} 空
/**
此时 WeakMap 中不存在任何值,即: obj2不存在其他引用时, WeakMap 不会阻止垃圾回收,基于obj2的引用将会被清除。这就证明了 WeakMap 的 弱引用特性。
*/
</script>
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
reduce(callbackFn)
reduce(callbackFn, initialValue)
this
对象指向this
要指向的对象,如果如果没有这个参数或参数为undefined
或null
,则默认指向全局window
apply
是数组,而call
是参数列表,且apply
和call
是一次性传入参数,而bind
可以分为多次传入bind
是返回绑定this之后的函数,apply
、call
则是立即执行 /**
* 在某些场景下,页面的请求数可能会有很多,
* 比如:抓取、分片上传等,如果我们需要等一个请求完成后,
* 再发起下一个请求,是必效率会比较低。
* 为了提升效率,我们可以同时发出多个请求,但数量又不能太多,
* 如若某请求完成,剩余等待的请求继续补位执行,
* 将请求的结果(不论成功或失败),按原有数组的顺序返回。
*/
/**
* 11-并发事件
* @param {string[]} urls 请求地址数组
* @param {number} max 最大并发数
*/
function consurRequest(urls, max) {
return new Promise((resolve,reject) => {
// 判断传入urls长度,为空直接返回[]
if(urls.length === 0){
resolve([])
return
}
const results = []
let count = 0 // 标识请求的完成数量
let index = 0 // 下一个请求
// 发送请求
async function request(){
// 退出逻辑
if(index === urls.length){
return
}
// 存储 index,保持后续请求结果数组与urls数组对应
const i = index
const url = urls[index]
index++
try {
const resp = await fetch(url)
// resp加入到 results中
results[i] = resp
} catch (err) {
// err 加入到results
results[i] = err
console.log('err',err)
} finally {
// 判断是否所以的请求都完成
count++
// if(count === urls.length){
if(count === urls.length){
resolve(results)
return
}
request()
}
}
const times = Math.min(max,urls.length)
let promiseList = []
for(let i = 0; i < times; i++){
promiseList.push(request())
}
Promise.race(promiseList).then(() => {
}).catch((err) => {
reject(err)
})
})
}
Proxy
与Object.defineProperty
Proxy
Proxy
将代理一个对象(被代理对象),得到一个新的对象(代理对象),同时拥有被代理对象中所有的属性。handler
的 getter
和 setter
Object.defineProperty
Object.defineProperty
为指定对象的指定属性设置属性描述符getter
和 setter
作者: 阮一峰
日期: 2015年2月 1日
特点:
let p1 = new Promise(resolve => {
setTimeout(resolve, 200, 1)
});
let p2 = new Promise((resolve, reject) => reject(2));
let p3 = 3;
console.log(Promise.all([p1, p2, p3]));//all方法
let myAll = function(parr) {
let result = [],//最后成功的结果
count = 0,//累加器,与len比较判断是否全部成功了
len = parr.length;
return new Promise((resolve, reject) => {
for (let p of parr) {// 依次测试传入的参数(转化为promise)是否是成功的
Promise.resolve(p).then(res => {
result[count] = res;// 成功就加入到结果中
count++;// 累加器加一
if (count == len) {// 如果相等,说明都成功了,可以走成功resolve
resolve(res);
}
}, err => {
// 只要有一个失败了,直接走失败reject
reject(err);
})
}
})
}
console.log(myAll([p1, p2, p3]));
在未排序区域中,从前向后不断对比相邻数据,将较大值不断向后移动,直至移动到未排序区域的最后一位。
const arr = [2, 44, 1, 0, -22, 56, -78];
// arr.sort((a,b)=>a-b)
function bubbleSort(arr){
let tmp;
for(let i=arr.length; i>0; i--){// 较大的arr[j]会冒泡到arr的尾部
for(let j=0; j<i-1; j++){
if(arr[j]>arr[j+1]){// 前一个元素比或一个大,则向后冒泡(交换)
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
return arr;
}
console.log(bubbleSort(arr));// [-78, -22, 0, 1, 2, 44, 56]