1 | function binarySearch(arr, target) { |
1 | //冒泡排序思想: |
1 | function insertionSort(arr) { |
该方法可以将多个Promise实例包装成一个Promise实例,成功时返回结果数组,失败时返回最先被reject的值
1 | let p1 = Promise.resolve('success'); |
Promise.all可以处理多个异步请求,比如等待多个异步请求结果返回后才执行相应的操作
Promise.all成功结果数组里的数据顺序和接受到的数据顺序是一致的
1 | const wake = (time) => { |
该方法获取接受的参数中,哪个最先获得结果,就返回该结果,不管是成功还是失败
1 | let p4 = new Promise((resolve, reject) => { |
js遇到异步代码时不会马上执行,而是会将该异步任务挂起,继续执行执行栈中的同步任务。当异步任务返回结果后,js会将该事件放入到事件队列中。
当执行栈中的所有任务都执行完毕,主线程为空闲状态,主线程会查看事件队列中是否有任务,如果有任务,则取出排在第一个的任务放到执行栈中执行。
js会不断重复主线程从事件队列中拿取任务并执行的这一过程,该过程称为事件循环(Event Loop)
异步任务之间并不相同,其执行优先级也会有区别
异步任务有两类:宏任务和微任务
在一个事件循环中,异步任务返回结果后,该事件会被分配到对应的宏任务队列或微任务队列中去。
当执行栈为空时,主线程会去微任务队列查看是否有微任务存在,如果不存在,主线程会从宏任务队列中取出最前的一个事件放到执行栈中执行,如果存在微任务,则主线程会依次执行微任务队列中的事件,直至微任务队列为空,然后从宏任务中取出最前的一个事件放到执行栈中执行,如此重复
总的来说:当执行栈执行完毕后会立刻先处理微任务队列中的所有微任务,然后再去宏任务队列中取出一个执行。同一次事件循环中,微任务永远在宏任务之前执行
本文简述下判断js数据类型的四种方式
typeof 返回一个值的类型,对于基本数据类型,除了null都会返回正确的结果(null返回Object)
当用typeof判断引用数据类型时,对于函数会返回Function,其余的会返回Object
instanceof 只能用来判断对象,它判断某一个对象是否是某个构造函数的实例
例如:
1 | const obj={}; |
toString()是Object的原型方法,调用该方法,默认返回当前对象的 [[Class]]。这是一个内部属性,其格式为[object xxx],其中xxx就是对象的类型
该方法既可以判断简单数据类型,也可判断引用数据类型
1 | console.log(Object.prototype.toString.call('hello world'));//[object String] |
简单数据类型和引用数据类型都可以使用该方法判断
1 | let num = 2; |
token的引入:
token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,token便应运而生。
token的定义:
token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个token便将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
使用token的目的:
使用token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
会话(session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与session。cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是cookie的工作原理。
cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨认用户状态。服务器还可以根据需要修改cookie的内容。
session是另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是session。客户端浏览器再次访问时只需要从该session中查找该客户的状态就可以了。
如果说cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份。session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
token:服务端生成并返回给客户端的一串字符串,客户端只需带上token来请求数据,无需再次带上用户名和密码。这样一来服务端就不用频繁查询用户名和密码用于验证,有助于减轻服务端压力
cookie:由服务端发送给客户端,客户端请求时带上cookie,服务端就可以通过cookie来识别客户端身份了
session:存储在服务端,保存的是客户端的状态相关数据
在ES5中是利用构造函数的形式来实现面向对象的,ES6新增了类(class)的概念,是ES5中构造函数形式的语法糖,其本质也是函数
以下分别是ES5和ES6中的继承例子:
ES5中的继承有多种方式,这里以组合继承为例
1 | // 父类 |
1 | class Father { |
浅拷贝和深拷贝是只针对引用数据类型而言的,基本数据类型无所谓浅拷贝和深拷贝
基本思路:
如果是原始数据类型,无需拷贝,直接返回
如果是引用数据类型,创建一个新的对象,遍历需要深拷贝的对象,将该对象的属性进行深拷贝后依次添加到新对象上,返回这个新对象
1 | function deepClone(target) { |
个人觉得对于数组的深拷贝,还可以这样实现:
1 | function deepCloneArray(arr) { |
附上Github上的30-seconds-of-code仓库中深拷贝的实现:
1 | const deepClone = obj => { |
1 | let arr = [1, 2, 3, 4, 5]; |
频繁执行dom操作,资源加载等行为,可能会导致UI卡顿或浏览器崩溃
如果每次执行事件就会触发函数,这样的做法不仅没有意义,还会浪费资源
每隔一定的时间才能调用函数,而不是每次触发事件就执行一次,这样会减少资源的浪费
(连续触发事件但是在 n 秒中只执行一次函数。节流会稀释函数的执行频率。)
当事件触发完一定时间后,在这个时间间隔内没有事件再次触发,就认为该事件触发完成了,此时可以执行函数
(触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。)
节流:
1 | function throttle(fn, delay) { |
防抖:
1 | function debounce(fn, delay) { |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true