-
javascript的执行机制\
- 因为js是一门单线程语言但因为我们业务需要所以把执行任务分为了同步和异步,同步任务当然是在主线程执行而异步任务是先放在事件table中然后注册回调函数当指定此事情完成时再放入事件队列中,当我们主线程内任务执行完毕为空就去事件队列读取对应函数进入主线程执行。上述过程重复就是常说的事件循环。\
- setTimeout是异步的,且我们有对任务的精细定义像宏任务包括整体代码,setTimeout,setInterval,微任务包括promise,process.nextTick\
- 当我们执行完一个宏任务结束之后去事件队列查看也没有可以执行的微任务然后把微任务全部执行调就开始新的宏任务,执行一个宏任务之后清空所有的微任务(现有的。\
-
async函数\
- async和await可以让我们更简洁的写出基于promise的异步行为而非刻意链式调用promise。\
- 且我们通常await周围用try catch语句包围起来,这个async函数的返回值一定是promise,这个promise要么会通过一个由async函数返回的值被解决,要么会通过一个从async函数中抛出或者是没有被捕获到的异常被拒绝也就是返回的promise是这个reject态。\
- await表达式会暂停整个async函数的执行进程并让出他的控制权,只有等待的基于promise的异步操作被兑现或被拒绝之后才会恢复进程,所以被async声明的函数就是和普通函数不一样,也就是await之后的代码相当于await返回的promise之后的then,是在promise状态确定之后才被扔进任务队列等待执行的,且promise的解决值会被当作该await表达式的返回值。\
- 且在await表达式之后的代码可以被认为是存在在链式调用的then回调中,多个await表达式都将加入链式调用的then回调中也就是多个then一直向下调用,返回值将作为最后一个then回调的返回值。\
- 如果async函数中没有return那就默认返回undefined。\
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
}catch (e) {
v = await downloadFallbackData(url); //抛出异常的话就执行这个promise
}
return processDataInWorker(v); //上面try中语句正常运行不抛出error的话则返回此promise也就相当于try中的then
// 且返回值没有加 await 是因为返回值默认就是promise因为是async函数所以他会被隐式传递给promise.resolve正常来说返回promise的话前面都要加await的。
}
\
-
小tips\
- 空字符串和null不一样啊,一般返回空的话可能是null。\
- throw可以不用在try catch中 如果判断条件为true 直接抛出 程序就停了。\
- try catch finally是配套的语句,和await没什么必然关系,只不过我们想如果axios返回的promsie是失败状态的话想让其在catch中输出操作一下而已且如果真的失败状态那await此语句之后的代码块必然不会执行。在try和catch的代码块中,如果碰到return语句,那么在return之前,会先执行finally中的内容,若finally中有return那就return他,之前的return则不会执行。\
- 感觉装饰器都是用在class相关的,且如果装饰器有参数且返回函数也有那就没有什么语法糖的必要了。\
- 域名不包含/之后的那些 且单页面是用/#/包含 com之类的是顶级域名,往前来看 父子域名关系 a.b.com是b.com的子域名 ,单页面应用是部分渲染,而多页面也是用/去跳转 然后渲染。我们用localstorage的时候要看会不会和第一次不一样,比如新人引导我们要存下来这个状态用local缓存,而像用户登陆我们不应该用localstroage 这个缓存不仅仅是持久化存值,你要和上一次状态有关系?仔细想一下🐻?\
- 且localstorage不会在父子域名中共用你要iframe或者改变协议才ok 此缓存是特定于页面的协议。\
- 拦截器简单点说就是拦截每一次你的请求和响应,然后进行相应的处理,之后再进到 then / catch ,也就是说我如果能进到then那就说明我一定成功了此刻返回的promise 所以axios响应拦截返回的promise一定有状态去进到第一个参数还是第二个参数 ,或者返回就一定抛出错误在catch中,因为我们拦截的时候去第二个参数处理也就是去吞掉了此错误,让他不会再向上传 或者是根本不会向下执行程序。如果返回一个reject呢 那await还是会拿到并且到catch吧?向上传输error这个我还是没有搞明白。🐻?\
- 但你只是promise.reject了 返回还是undefined的promise是的 然后就默认是then状态的进入下一个then链,除非你throw或者reject不然他就返回一个成功的promise segmentfault.com/a/119000001… 看一下以及源码?🐻\
-
axios相关\
- 首先他是一个基于promise的http库可以用在浏览器和nodejs中。可以拦截请求和响应,转换请求和响应数据,也可以取消请求,自动转换json数据,客户端还支持防御xsrf。\
- get请求中axios.get('/user?ID=12345')等同于 axios.get('/user',{params:{ID:12345}})\
- axios.all是执行多个并发请求参数是函数数组。且在axios.post(url[,data[,config]])也就是说顶多他接收三个参数,所以除了url和data其他参数都要用{}包起来当作config一个对象。\
- 请求配置一般有url method baseURL transformRequest可以在向服务器发送前修改请求数据 同理也可以在这定义修改响应数据的对象回调函数 headers自定义的请求头 params与请求一起发送的url参数 data是作为请求主体被发送的数据 对象形式key-value timeout如果请求花费超过了此时间则被终端此请求 还有proxy。\
- 响应结构一般有data status 以及来自服务器响应的http状态信息 headers响应头 config为请求提供的配置信息 等。\
-
try catch捕获异常\
- 能被try catch 捕捉到的异常,必须是在报错的时候线程执行已经进入 try catch 代码块,且处在try catch里面,这个时候才可以被捕获到,像try中有一个定时器那么如果定时器的回调函数出现错误catch是捕获不到的因为catch以及执行过去了,定时器这个任务执行的时候已经不在try这个代码块了,还有如果在try中定义个函数,在外面去执行那么如果这个函数有问题也不会catch进入,因为try代码块是定义了此函数且已经执行过去了,所以调用此函数的时候不会哦。\
- 还有try catch执行如果碰到了错误进入了catch那么以后的代码一定不会执行,就像突然断掉了然后进入了catch代码块执行完catch就无了,或者我们平常没有catch代码块的时候也是 遇到有错误,编译或者什么的就是直接停掉了然后提示你 自己出一个错误信息让你去改,程序就是停止了。那么如果try catch里面又套了一个try catch 那一样的道理 里面的catch如果捕捉到了错误就是立马抛出,程序停止的。这和promise不一样他如果catch那她知道了我现在状态是失败的 我会按照链式调用寻找下面的所有失败状态promise一个一个执行。且finally内容是放在return之前的 如果finally中return了那就直接return了 自己内部状态的return就不执行了。\
- but promise如果被包在try catch内部,promise出现异常他是不会向上抛出的不会让catch代码块感受到,也就是对外感觉没有异常,这是为啥呢,且promise内部有了异常程序也不会停止下来,反而是继续正常运行的只不过此时promise状态为失败而已,是因为promise内部也有try catch包裹但 且如果发生了reject和Promise.prototype.catch那promise就会捕获到异常认定自己是失败状态了 用promise包裹起来此错误信息,那我内部捕获到了,且reject函数调用和catch抛出 其实是一样的处理,那就不会向上抛出异常了。因为他自己内部有try catch包裹所以他有能力可以捕获到catch错误进行处理,所以当你想操作什么的时候去向内部promise增加.catch()回调函数就可以啦。\
- 但上面说的是try里是正儿八经then resolve这种链式调用的promsie 那如果是await呢 ,因为我们await是想让他成功的因为我们想要结果数据,且想实现一种感觉是同步形式的操作,所以如果await之后的promise如果是reject状态那就会到catch语句,所以我们最好必须await用try catch包裹起来,因为你之后必然不会对一个错误信息进行数据操作,所以他并不会默默无闻的返回一个失败态,虽然他是promise但他更是await可能有一些语法修改吧,这个待考究🐻?,且如果我们请求数据返回的是promise最好就用await搞他,异步嘛毕竟快一点,性能好一点。\
- promise也有then catch finally方法 且 如果你不resolve或者reject他是一直处于pending状态的,所以在axios请求post什么的时候注意要返回。\
- promise如果没有resolve或者reject是会内存泄漏的 catch中也要reject()他应该不会自动成为失败状态吧?🐻?\
-
高阶函数\
- 高阶函数是指必须满足以下要求其一当然可以都满足,1.函数作为参数被传递 2.函数作为返回值输出\
- 像之前取消请求的那个高阶函数一开始我只是想函数传入然后在内部去执行这个函数,但经同事提点也是可以用一个新函数去包起来然后返回此新函数,再新函数内部去执行,这样可以达到我们目的,此处还想说两个tips,学会解构在一些地方不同变量之间可以value相同或者此方法名对应别的map的key,这样容易操作,props传递数据也可以直接解构他会给你命名为同名的变量方法,不影响很有必要,我们ts中常用const 一般都是不会变的常量,还有我们需要去操作值的时候也可以去挂到一个必须传的值上去,之后在内部拿出来再delete掉,怎么让我们的操作简单,不要冗余,尽量一个操作里面只操作这个东西,别的方法里面不要有任何相关这个的东西,也就是拆分逻辑吧,注意⚠️,还有很多时候我们可以获得此方法的名字getname或者别的相关属性去进行处理,这是很好用的注意,还有一些localstorage和window这种全局属性具体🐻?要会,prototype🐻?原型。\
- 让我们回到正题,用高阶函数实现aop,面向切面编程一般都是指把一个函数动态织入到另外一个函数比如用Function.prototype.xxx这种感觉不常用hh,还有就是 函数柯里化currying,一个函数会接受一些参数但这些参数并不会去立即求值操作而是继续返回另外一个函数,用args,刚才传入的参数也就相当于闭包被保存起来,在函数被真正需要求值的时候再把所有参数一次性用于求值。 还有函数节流去返回一个函数吧🐻?防抖节流看一下 等。\
-
Browser对象\
- window location history 都是一些可以直接去调取使用某些属性的对象。www.runoob.com/jsref/obj-w…\
- 看一些router相关文档,项目中使用的hashhistory直接push路径什么的就可以跳转了🐻?\
- \
-
备忘录整理(摆烂\
- n.
faas功能即服务
iaas基础设施即服务
paas平台即服务
saas软件即服务
ci持续集成服务
- js命名规范
一.bool类型命名
1.表示可见性,进行中的状态
is+动词的现在进行时或形容词
isShow
visible loading connecting validating正在验证中 running运行 listening正在监听中
2.属性状态类
描述实体比如组件对象的功能属性
disabled是否禁用 editable是否可编辑 clearable是否可清除 readonly只读 expandable是否可展开
checked是否选中 enumerable是否可枚举 iterable是否可迭代 clickable是否可点击 draggable是否可拖拽
3.配置类,选项类
主要是组件功能的开启与关闭,功能属性的配置
withXXX表示组件在基本功能形态外的其他功能
enableXX表示组件某些功能的开启
allowXx功能属性的配置
withTab是否带选项卡 withoutTab不带选项卡 enableFilter开启过滤 allowCustomScale允许自定义缩放
shouldClear是否清除 canSelectItem是否能选中元素
只用一种allow也可以
二.函数命名
1.事件处理时
事件处理包括 浏览器原生事件,异步事件,组件自定义事件。onXx onXxClick handleXx handleXxChange
原生事件用onXx 自定义事件使用handleXx 事件主动监听采用onXx 被动处理使用handleXx
在表单提交的时候采用onSubmit函数
如果有时候单词太多可能就省略on或者handle了 动词开头就好
handleSizeChange 处理分页页数改变
handlePageChange处理分页每页大小改变
onKeydown按下键时
2.异步处理时
主要是写数据层服务,状态管理中的action命名,以及ajax回调的命名规则。
getUsers获取用户列表 fetchToken取得token deleteUser删除用户 removeTag移除标签
addUser添加用户 createAccount创建账户
get也许是数据源不一定取自异步的原始数据可能是加工处理后的,而fetch是直接拿的原始数据。
deleteXx主要用于数据删除而remove是移除数据,通常数据是存在的只是没有显示或者是数据假删除
update是数据更新操作,add是添加新项,而create是创建新实例。
3.跳转路由时
有时候我们可能是通过事件触发去跳转目标地址的这个时候需要一个函数去处理
toTplDetail跳转到模版详情页面
navigateToHome导航到首页
goHome跳转首页
jumpHome跳转首页
redirectToLogin重定向到登陆页
switchTab切换到tab选项卡
backHome回到主页
三.数据加工
1.根据特定属性获取属性
getXxByYy() Xx可以是特定上下文的名字1 比如·element item option data selection list 这种
Yy就比如id index key value selected actived这种
除了使用get 还可以使用query fetch
getItemById
getItemBySelected根据传入的已选列表id来获取列表全部数据 这种情况写成getItemsSelected更好
queryUserByUid根据uid查询用户
2.格式化数据
比如说排序 调整数据结构 过滤数据 添加属性
formatXx convertXx转换 inverseXx反转 toggleXx parseXx解析 flatXx展开1
sliceXx joinXx结合数组方法这种的也可以
formatDate格式化日期
toggleAllSelected切换所有已选择的数据状态
flatSelect展开选择数据
3.数组命名 用复数
options选项 list maps nodes节点 entities实体 collection
userList users tabOptions stateMaps btnGroup userEntities selectedNodes stateMaps
4.选项元素,下拉元素命名
title name key label field value id children index nodes
5.当前选项,激活项命名
active current select
activeTab currentPage selectedData
6.数据循环时候
menu item option data key object index ijk xyz mn
count次数 skipped跳过的数量 result结果
7.
from 从 to 到
prev 上一个 next 下一个 cur当前
source源 target目标
start开始 end结束
oldVal newVal 旧 新
promis中then的回调函数第一个参数:res data json entity都可以
8.
ch 单个字符 str字符串 n次数 reg正则 expr表达式 lens数组长度 count数量
q查询query src数据源 no数字 rate比率 status状态 func函数 size大小 hoz水平方向
radix基数 vert垂直方向
四.dom事件
load已完成加载
unload资源正在被卸载
abort中止时
focus获得焦点
scroll滚动事件
offline离线状态
touch轻按
pause暂停
suspend挂起
complete完成
seek搜索
install安装
progress进行
zoom放大
rotate旋转
active激活
scale缩放
valid有效 void 空
assignedEvent分配事件
closedEvent关闭事件
labeledEvent标签事件
deployedEvent部署事件
五.
infinite无限的
- css里面类的一般命名不会搞驼峰太奇怪 多个单词之间用-分隔 class名字小写不加_尽量不缩写 (less里面如果有变量声明可以驼峰。
常见class关键词
布局类:header, footer, container, main, content, aside, page, section
包裹类:wrap, inner
区块类:region, block, box
结构类:hd, bd, ft, top, bottom, left, right, middle, col, row, grid, span
列表类:list, item, field
主次类:primary, secondary, sub, minor
大小类:s, m, l, xl, large, small
状态类:active, current, checked, hover, fail, success, warn, error, on, off
导航类:nav, prev, next, breadcrumb, forward, back, indicator, paging, first, last
交互类:tips, alert, modal, pop, panel, tabs, accordion, slide, scroll, overlay
星级类:rate, star
分割类:group, seperate, divider
等分类:full, half, third, quarter
表格类:table, tr, td, cell, row
图片类:img, thumbnail, original, album, gallery
语言类:cn, en
论坛类:forum, bbs, topic, post
方向类:up, down, left, right
其他语义类:btn, close, ok, cancel, switch; link, title, info, intro, more, icon; form, label, search, contact, phone, date, email, user; view, loading...
常用的CSS命名
头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar
栏目:column 页面外围控制整体布局宽度:wrapper 左右中:left right center
登录条:loginbar 标志:logo 广告:banner 页面主体:main 热点:hot
新闻:news 下载:download 子导航:subnav 菜单:menu
子菜单:submenu 搜索:search 友情链接:friendlink 页脚:footer
版权:copyright 滚动:scroll 内容:content 标签页:tab
文章列表:list 提示信息:msg 小技巧:tips 栏目标题:title
加入:joinus 指南:guild 服务:service 注册:regsiter
状态:status 投票:vote 合作伙伴:partner
(1)页面结构
容器: container 页头:header 内容:content/container
页面主体:main 页尾:footer 导航:nav
侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wrapper
左右中:left right center
(2)导航
导航:nav 主导航:mainbav 子导航:subnav
顶导航:topnav 边导航:sidebar 左导航:leftsidebar
右导航:rightsidebar 菜单:menu 子菜单:submenu
标题: title 摘要: summary
(3)功能
标志:logo 广告:banner 登陆:login 登录条:loginbar
注册:regsiter 搜索:search 功能区:shop
标题:title 加入:joinus 状态:status 按钮:btn
滚动:scroll 标签页:tab 文章列表:list 提示信息:msg
当前的: current 小技巧:tips 图标: icon 注释:note
指南:guild 服务:service 热点:hot 新闻:news
下载:download 投票:vote 合作伙伴:partner
友情链接:link 版权:copyright
注意事项::
1.一律小写;
2.尽量用英文;
3.不加中槓和下划线;
4.尽量不缩写,除非一看就明白的单词。
CSS样式表文件命名
主要的 master.css
模块 module.css
基本共用 base.css
布局、版面 layout.css
主题 themes.css
专栏 columns.css
文字 font.css
表单 forms.css
补丁 mend.css
打印 print.css\
- 正则表达式 deerchao.cn/tutorials/r…\
- after伪元素是两个双引号 显示的内容属于自身的content属性 属于内联元素(行内元素\
- \
- n.
-
flex布局\
- 任何一个容器都可以成为flex布局。他的所有子元素自动成为容器成员为flex项目。\