js
文章平均质量分 53
Janicelily
哪有什么大神,不过是一行一行敲来的,加油呀
展开
-
三个常用正则-- 邮箱、手机号与机构code
const regRule = { agencyCode: /^[A-Z\d]+$/, contactEmail: /^([A-Za-z0-9_\-.])+@([A-Za-z0-9_\-.])+\.([A-Za-z]{2,4})$/, phone: /^[0-9|-]{1,20}$/};原创 2021-07-15 11:53:15 · 356 阅读 · 0 评论 -
高阶函数 与设计模式之装饰者模式 以及实际应用
定义:高阶函数是指至少满足下列条件之一的函数。 函数可以作为参数被传递; 函数可以作为返回值输出。二、高阶函数实现AOP(面向切面编程)通常,在 JavaScript 中实现 AOP,都是指把一个函数“动态织入”到另外一个函数之中,具 体的实现技术有很多,本节我们通过扩展 Function.prototype 来做到这一点。代码如下:Function.propotype.before = function(beforefn){ var _self = this; return fun原创 2021-06-09 21:00:00 · 245 阅读 · 1 评论 -
深入理解闭包
一、变量作用域对于全局变量来说,全局变量的生存周期当然是永久的,除非我们主动销毁这个全局变量。而对于在函数内用 var 关键字声明的局部变量来说,当退出函数时,这些局部变量即失去了 它们的价值,它们都会随着函数调用的结束而被销毁。var func = function(){ var a = 1; return function(){ a++; alert ( a ); } };var f = func();f(); // 输出:原创 2021-06-08 11:48:18 · 210 阅读 · 1 评论 -
...扩展运算符的妙用
一、普通用法const arr1 = [1, 2, 3, 4]const arr2 = [5, 6, 7, 8]const newArr = [...arr1, ...arr2]二、妙用当它被用在函数形参上时,它还可以把一个分离的参数序列整合成一个数组function mutiple(...args) { let result = 1; for (var val of args) { result *= val; } return result;}mutiple(原创 2021-06-03 18:26:37 · 215 阅读 · 0 评论 -
Vue中事件绑定的原理
之前我搜这个原理的时候,好多文章,都只写了俩句话:原生事件绑定是通过addEventListener绑定给真实元素的。组件事件绑定是通过Vue自定义的key$on实现的。那具体是怎么实现的呢, 没有说?就现在具体看一下。// 原生事件绑定<div @click="fn()"></div>// 组件绑定<my-component @click.native="fn" @click="fn1"></my- component>原理:事件原创 2021-02-25 17:33:49 · 1354 阅读 · 1 评论 -
防抖 与 节流
防抖(debounce)防抖就是 短时间内大量触发同一件事,只触发一次;function debuonce(fn, delay){ let timer = null; return function() { if(timer) { clearTimeout(timer) // 将上一次的清除掉 } timer = setTimeout(fn, delay); // 然后重新计时 }}调用function log(){ console.log(2)}wind原创 2021-02-24 23:16:30 · 167 阅读 · 0 评论 -
手写实现peomise
Promises/A+ 规范作为 Modern JavaScript 基础设施的一部分,Promises 对前端开发者而言异常重要。它是 async/await 语法的基础,是 JavaScript 中处理异步的标准形式。并且,未来的 Web API,只要是异步的,都会以 Promises 的形式出现。如果不理解 Promises 相关的知识和运行机制,将来可能无法完成 Web 开发的日常工作。因此,Promises 成为了前端面试中的必问问题之一。在网络上,也可以搜索到很多 Promises 的技原创 2021-02-23 11:53:01 · 300 阅读 · 0 评论 -
有关虚拟滚动 以及 懒加载的原理
目录懒加载实现方式及底层原理一、浏览器的底层渲染机制:二、几个API三、getBoundingClientRect()四、基于 IntersectionObserver 实现图片懒加载虚拟滚动一、二者区别2、虚拟滚动有两个重要的基本概念:3、简单实现懒加载实现方式及底层原理一、浏览器的底层渲染机制:1、构建 DOM 树2、样式计算3、布局阶段4、分层5、绘制6、分块7、光栅化8、合成二、几个API1、document.documentElement.clientHeight获取屏幕原创 2021-02-22 17:31:41 · 2454 阅读 · 0 评论 -
手写实现数组的方法 --例如 findIndex
Array.prototype.myfindidx = function(fn) { for (var i = this.length - 1; i >= 0; i--) { if (fn(this[i], i, this)) return i } return -1 }原创 2021-01-18 16:08:30 · 248 阅读 · 0 评论 -
手写实现 call 与 apply 与 bind
一、call 与 bind 与 apply 的使用先定义一个 a对象 与 一个 函数let a = { value: 1 } function getValue(name, age) { console.log(name) console.log(age) console.log(this.value) }现在 如果单纯的正常 调用 getValue , 其中的this是指向 window但是 如果是以下调用 则 this指向 a对象。getValue.call(a原创 2021-01-13 15:02:35 · 135 阅读 · 1 评论 -
Set、Map、WeakSet 和 WeakMap 的区别
一、set它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成 Set 数据结构。数组去重 以及 字符串去重:[...new Set(array)]; Array.from(new Set(array)); [...new Set('ababbc')].join('')// "abc"向 Set 加入值的时候,不会发生类型转换。Array.from方法可以将 Set 结构转为数组。const items = new Set([1, 2, 3, 4,原创 2020-10-30 11:36:07 · 185 阅读 · 0 评论 -
location.search 进行处理,返回包含所有参数的一个对象
const qs = location.search.length > 0 ? location.search.substr(1) : ''; // 去掉? let args = {}; const itemsArr = qs.length > 0 ? qs.split('&') : []; itemsArr.forEach((el) => { let item = el.split('='); let name = decodeURIComponent(it.原创 2020-10-23 18:56:38 · 414 阅读 · 0 评论 -
时间线 timeline 样式修改,时间加在右侧
公司提出的需求如图, 时间线 要求时间在右侧, 且加上年的区分。 后端返回的数据 仅为每一条一条的数据技术栈 :element-ui官网 只有 top 和 bottom 的位置参数设置。通过修改 css样式进行。第一步选中时间这个元素 发现了这个类样式然后修改它就可以, 如下.el-timeline{ /deep/ .el-timeline-item__timestamp.is-bottom { position: absolute; left: -100px;原创 2020-09-10 18:07:06 · 5171 阅读 · 0 评论 -
如何防止用户打开控制台修改css(防止去掉水印)
加水印的需求都是为了不可去除的。所以一定要防止用户通过打开控制台, 进行css操作,再截图。用到的 api 是window.MutationObserver 。话不多说, 上代码:思路就是:当你监控到某一个元素样式变化了,你就再给style 画上。const canvasWM = ({ container = document.body, width = '160px', height = '130px', textAlign = 'center', font = '15px原创 2020-06-12 18:24:13 · 1644 阅读 · 0 评论 -
textarea 跟随光标位置 出现 提示框(类似输入法 的 功能)
实现思路利用 e.target.selectionStart 可以知道光标的 位置, 但是面对enter换行 与 空格的时候, 就不起作用了。而且 e.target.selectionStart 只能知道在文本字符串的位置,我们需要的是距离边框的位置, 这样才能给提示框的 left 和 top 赋值。所以 思路是 用一个 一模一样的 div 在 textarea 的同样的位置, 进行visibility hidden。光标的位置插入一个span 标签, 获取span 的offsetTop 和 off原创 2020-06-11 18:27:37 · 1674 阅读 · 1 评论 -
回顾JS的继承方式
首先提供一个父类(提供继承的属性)function Father(name){ this.name = name; this.sum = function(){ alert(this.name) }}Father.prototype.age = 38;一、原型链继承function Son(){ this.name = 'perter';}Son.prototype = new Father();// 最重要的!var per = new Son();console.原创 2020-05-15 14:02:30 · 168 阅读 · 0 评论 -
vue 自定义分模块写api 文件
一、vue的实例属性$options。vue的实例属性$options是用来获取定义在data外的数据和方法的。二、在每个模块定义自己的api 文件vue 中引用<script>import xxxapi from './xxxapi';export default{ api: [xxxapi], data(){ return {} }, method...原创 2020-04-23 15:50:39 · 1043 阅读 · 0 评论 -
俩个数组比较, 去掉相同值的最最最简洁方法, 一行搞定
一般人都是 双层for 循环实现, 存在相同项 则 把相同项splice 的思路;like this:function array_diff(a, b) { a = JSON.parse(JSON.stringify(a)) b = JSON.parse(JSON.stringify(b)) for (var i = 0; i < b.length; i++) { for (v...原创 2020-04-10 16:56:14 · 2988 阅读 · 1 评论 -
转换时间戳 踩坑
时常会遇到,后端返回的是 时间戳, 需要前端转换为 时间格式。转换的 methods:formatDate(now) {const year = now.getFullYear();const month = now.getMonth() + 1;const date = now.getDate();const hour = now.getHours();const minu...原创 2020-03-16 14:10:04 · 283 阅读 · 0 评论 -
getUserMedia 如何关闭摄像头
关于这个问题我搜了一些答案,经过自身验证,以下为正确关闭方法一、先说如何调用 window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext;const media = (navigator.mediaDevices.getUserMedia || navigat...原创 2019-12-28 14:35:07 · 6475 阅读 · 3 评论 -
前端建立WebSocket
建立,new一个this.wSocket = new WebSocket('ws://192.xx.xx.xx:8080/xxx/xxxx'); if (!this.wSocket) { console.log('您的浏览器不支持websocket协议!'); return; }PS:若是https环境,将ws改为wss即可俩个函数接收与发送this.wSocket....原创 2019-12-05 15:41:47 · 1909 阅读 · 0 评论 -
数组比较大小在不用写循环啦Math.max.apply
如果你还在用for循环来写一个数组中挨个比较来取出最大或最小值,那现在可以解放代码,将用俩行搞定。例如var buffer = [1,2,3,4,5,6,7];var maxVal = 0; for (var i = 0; i < buffer.length; i++) { if (maxVal < buffer[i]) { maxVal = buffer[i]; }...原创 2019-12-04 14:16:56 · 476 阅读 · 0 评论