
Javascript
SeriousLose
✎﹏小飞飞 认真你就输了,一直认真你就赢了
展开
-
查找数组中从最大到最小再到最大的距离
let a=[1,5,5,2,6]; // 4 5,5,2,6let b=[1,1]; // 2 1,1let d=[2,6,8,5]; // 3 2,6,8原创 2022-12-06 16:52:26 · 1015 阅读 · 3 评论 -
Copy
深拷贝 拷贝的对象的值中如果有 function、 undefined、 symbol 这几种类型, 经过 JSON.stringify 序列化之后的字符串中这个键值对会消失; 拷贝 Date 引用类型会变成字符串; 无法拷贝不可枚举的属性; 无法拷贝对象的原型链; 拷贝 RegExp 引用类型会变成空对象; 对象中含有 NaN、 Infinity 以及 - Infinity, JSON 序列化的结果会变成 null; 无法拷贝对象的循环应用, 即对象成环(obj[key] = obj)原创 2022-12-05 13:07:05 · 1059 阅读 · 0 评论 -
File Type
如果系统无法获取文件类型,则读取二进制流,对二进制进行解析文件类型原创 2022-12-03 19:00:25 · 1012 阅读 · 0 评论 -
数组方法考察
【代码】数组方法考察。原创 2022-11-18 17:35:57 · 861 阅读 · 0 评论 -
get(obj, “a.b[0].c“, 0)
/ 实现一个 get 函数,get(obj, chain, defaultVal)get(obj, "a.b[0].c", 0) // 输出 1。get(obj, "a.b.c", 0) // 输出 0。💡 未做异常处理,请注意;原创 2022-11-09 13:02:16 · 1122 阅读 · 0 评论 -
[5, [[4, 3], 2, 1]]=>(5 - ((4 - 3) - 2 - 1))
实现一个函数,能够将诸如 [5, [[4, 3], 2, 1]] 的数组当做(5 - ((4 - 3) - 2 - 1))进行分组的减法运算,并返回结果。(不能使用eval,建议使用递归);原创 2022-11-09 12:51:48 · 1383 阅读 · 0 评论 -
NPM RXJS
对象时,它会把订阅者添加到观察者列表中,每当有接收到新值时,它就会遍历观察者列表,依次调用观察者内部的。,但又想在每次新的订阅时,它都会重新发送最后几个值,这个时候就可以用到。需要传入一个初始值,然后这个值将不断变化,我们只能看见当前的值。侧重于缓存,那么当它完成时,并不会影响我们继续观测它缓存的值。只是缓存了最近的值,它仍然反映的是不断有值产生的流(执行,所以它可以存储多个旧值并发送给它的新订阅者。表示你可以始终直接从。,但是它还有一个额外的特性,它可以记录一部分的。时,订阅它仍然可以拿到缓存的值,而。转载 2022-10-19 11:09:11 · 1177 阅读 · 0 评论 -
Error URIError
浏览器url上拼接上(原创 2022-09-05 18:27:05 · 1063 阅读 · 0 评论 -
JS Regex
中国手机号(最宽松), 只要是1开头即可, 如果你的手机号是用来接收短信, 优先建议选择这一条。大于等于0, 小于等于150, 支持小数位出现5, 如145.5, 用于判断考卷分数。中国手机号(宽松), 只要是13,14,15,16,17,18,19开头即可。最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符。二代身份证号(18位数字),最后一位是校验位,可能为数字或字符X。微信号,6至20位,以字母开头,字母,数字,减号,下划线。用户名正则,4到16位(字母,数字,下划线,减号)...原创 2022-08-30 13:19:22 · 1428 阅读 · 0 评论 -
JS EventListener
addEventListener 添加监听的事件 阻止默认事件preventDefault() 阻止事件冒泡stopPropagation() removeEventListener 移出事件 💡 removeEventListener 需要知道你需要移出的是哪个事件处理函数。匿名函数丢弃了自身函数名,是移出不了。 💡 IE9以下的IE浏览器不支持 addEventListener...原创 2022-06-26 23:39:50 · 587 阅读 · 0 评论 -
页面嵌入iframe 点击浏览器后退问题
在iframe绑定load事件,这样子就可以监听到打开 iframe 点击浏览器后退 按钮事件;原创 2022-06-21 14:25:23 · 3642 阅读 · 2 评论 -
JS Standard
使用空格,而不使用tab除了行终止符外,在系统文件中,空格是唯一表示空白的字符,这意味着 tab 不能作为缩进使用。规定用2个空格(而不是4个)来表示缩进。必不可少的分号每个语句都必须以分号结尾,不要依赖编译器自动插入分号。不使用 var声明局部变量用 const 或者 let,默认使用 const,除非变量需要重新赋值。箭头函数完美替代 function箭头函数不仅语法简洁易读,而且修复了 this 的问题,特别是在嵌套函数中。用模板字符串替代字符串拼接用模板字符串(用 ` 分原创 2022-05-25 00:28:07 · 249 阅读 · 0 评论 -
JS Touch
$("body").on("touchstart", function(e) { e.preventDefault(); startX = e.originalEvent.changedTouches[0].pageX, startY = e.originalEvent.changedTouches[0].pageY;});$("body").on("touchmove", function(e) { e.preventDefault(); moveEndX .原创 2022-05-24 23:56:21 · 150 阅读 · 0 评论 -
&& 与 ||
与(&&)运算符将会返回第一个false/‘falsy’的值。当所有的操作数都是true时,将返回最后一个表达式的结果。举个🌰let one = 1, two = 2, three = 3;console.log(one && two && three); // Result: 3console.log(0 && null); // Result: 0或(||)运算符将返回第一个true/‘truthy’的值。当所有原创 2022-05-24 10:00:06 · 135 阅读 · 0 评论 -
Array assemble
a = [1, 2, 3];b = [2, 4, 5];ES7// 并集let union = a.concat(b.filter((v) => !a.includes(v))); // [1,2,3,4,5]// 交集let intersection = a.filter((v) => b.includes(v)); // [2]// 差集let difference = a.concat(b).filter((v) => a.includes(v) &am.原创 2022-05-19 23:43:47 · 158 阅读 · 0 评论 -
Chrome 禁止调试
noDebugger.jslet onDebug = function () { document.write('检测到非法调试!请你停止调试后刷新本页面!');};setInterval(function () { let st, et; st = new Date().getTime(); et = new Date().getTime(); if ((et - st) > 1000) { onDebug(); }},原创 2022-05-01 22:50:32 · 2103 阅读 · 0 评论 -
JS FormData
FormData**FormData**接口提供了一种表示表单数据的键值对key/value的构造方式,并且可以轻松的将数据通过[XMLHttpRequest.send()](<https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/send>)方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为"multipart/form-data",它会使用和表单一样的格式。创建formData对象...原创 2022-04-10 22:09:38 · 5626 阅读 · 0 评论 -
JS Statements var / let / const
关键字 范围 变量提升 可以重新分配 可以重新定义 var 全局、局部 Yes Yes Yes let 局部 No Yes No const 局部 No No No 能用const的情况尽量使用const,其他情况下大多数使用let,避免使用varvar 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是wi原创 2022-03-27 19:07:41 · 539 阅读 · 0 评论 -
JS Error
function demo() { return 1; console.log('我是SeriousLose'); return 2;}console.log(demo()); // 1function demo() { try { return 1; } catch (err) { console.log(err); return 2; } finally { return 3; }}.原创 2022-03-14 00:50:19 · 498 阅读 · 0 评论 -
Eexport & Import
Eexportexport关键字,可以导出变量、函数、类给其他模块。变量导出直接导出 先定义,后导出 重命名导出// 导出变量--写法1export let name = 'Peter';// 导出变量--写法2:先定义,再导出let name1 = "Peter";export { name1 };// 导出变量--写法3:重命名let name2 = "Peter";export { name2 as PersonName }; // 这里export时记得加花括号,原创 2022-02-16 15:14:02 · 667 阅读 · 0 评论 -
排序数字英文字母交错,由小到大
/** * @description: 排序数字英文字母交错,由小到大 * @param {type} 如:[1,’a’,2,’b’,3,’c’,’d’,’e'] * @return: */ const array = ['z', 's', 'g', 'h', 'i', 'j', 'f', 's', 16, 66, 36, 616, 6, '', 0]; const test4 = (arr = []) => { let newAry = []; // 新数组.原创 2022-02-15 15:25:52 · 237 阅读 · 0 评论 -
Array deduplication
数组去重new Set 方式const removeDuplicateItems = arr => [...new Set(arr)];// const removeDuplicateItems = arr => Array.from(new Set([1,2,3,3,4,4]));removeDuplicateItems([42, 'foo', 42, 'foo', true, true]); //=> [42, "foo", true]indexOf 方式v原创 2022-02-15 15:14:44 · 404 阅读 · 0 评论 -
JS Addition
杜绝0.1 + 0.2 =0.30000000000000004 问题;function add(num1, num2) { const num1Digits = (num1.toString().split('.')[1] || '').length; const num2Digits = (num2.toString().split('.')[1] || '').length; const baseNum = Math.pow(10, Math.max(num1Digits, num2原创 2022-02-15 14:38:43 · 330 阅读 · 0 评论 -
TS Decorator
装饰器装饰器是实现 AOP(面向切面)编程的一种重要方式。 装饰器是一种特殊类型的声明,本质上就是一个方法,可以注入到类、方法、属性、参数上,扩展其功能; 常见的装饰器: 类装饰器、 属性装饰器、 方法装饰器、 参数装饰器... 装饰器在写法上有: 普通装饰器(无法传参)、 装饰器工厂(可传参) 装饰器已是ES7的标准特性之一,是过去几年JS最大的成就之一启用装饰器// tsconfig.json 中添加 "compilerOptions": {原创 2022-01-24 15:34:54 · 301 阅读 · 0 评论 -
ECMAScript6 编码规范
规范内容声明 1.1 变量 对于只在当前作用域下有效的变量,应使用let来代替var 对于全局变量声明,采用var,但应避免声明过多全局变量污染环境 // 不好const variables; const globalObj = null; // 不是定义一个常量let globalObj = null; for (var i=0; i<5; i++) { console.log(i);}console.log(i);// 好let variable转载 2022-01-17 13:53:34 · 222 阅读 · 0 评论 -
XMLHttpRequest
若Ajax请求是由jQuery的$.ajax发起的,默认情况下可以使用 jQuery的Global Ajax Event Handlers监听到Ajax事件 兼容性 IE 9+、Chrome 15+、FireFox 11+、Edge、Safari 6.1+、Opera 12.1+ 监听所有请求(function () { if (typeof window.CustomEvent === 'function') return false; function CustomEv原创 2021-12-31 11:09:22 · 1119 阅读 · 0 评论 -
js实现最小堆
// 最小堆 class MinHeap { constructor() { this.heap = []; // 堆以数组表示 } /** * @description: 插入操作 * @param {*} val */ insert(value) { this.heap.push(value); this.moveUp(this.heap.length - 1); } /**...原创 2021-12-17 16:23:16 · 693 阅读 · 0 评论 -
Web PostMessage
postMessage API H5新加的内容,支持ie8及其以上. 却可用于实现不同源之间消息通信 使用场景 a标签中有iframe,iframe引用b页面,实现ab页面的相互通信 需要两个页面相互配合 const iframe = document.querySelector('iframe');iframe.contentWindow.onmessage...原创 2021-11-11 17:36:11 · 955 阅读 · 0 评论 -
Web Broadcast Channel
Broadcast Channel API 可以实现同源下浏览器不同窗口、Tab 页或者 iframe 下的浏览器上下文之间的简单通讯。 通过创建一个监听某个频道下的 BroadcastChannel 对象,你可以接收发送给该频道的所有消息 可以发送内容 字符串 Blob、 ...原创 2021-11-11 17:31:25 · 747 阅读 · 0 评论 -
Snabbdom(虚拟dom-9-patchVnode函数)
patchVnode // 对比新旧节点,vnode渲染成真实dom,并返回vnode function patchVnode( oldVnode: VNode, vnode: VNode, insertedVnodeQueue: VNodeQueue ) { const hook = vnode.data?.hook; /...原创 2021-11-03 09:42:20 · 194 阅读 · 0 评论 -
Snabbdom(虚拟dom-8-removeVnodes函数)
function invokeDestroyHook(vnode: VNode) { const data = vnode.data; if (data !== undefined) { // 执行用户设置的destroy 钩子函数 data?.hook?.destroy?.(vnode); // 调用模块的destroy钩子函数 for (let i = 0; i < cbs.destroy.length; ++i) cbs.d...原创 2021-11-03 09:40:14 · 148 阅读 · 0 评论 -
Snabbdom(虚拟dom-7-addVnodes函数)
function addVnodes( parentElm: Node, before: Node | null, vnodes: VNode[], startIdx: number, endIdx: number, insertedVnodeQueue: VNodeQueue ) { for (; startIdx <= endIdx; ++startIdx) { const ch = vnodes[startIdx];...原创 2021-11-03 09:39:16 · 161 阅读 · 0 评论 -
function好的写法
const cache = {}; // 模拟缓存 // 坏的 // 不要在函数中嵌入缓存逻辑 const func = (key) => { if (key in cache === false) { const value = key + key; // 逻辑处理,抽离出来 cache[key] = value; } return cache[key]; }; func('aa'); func('aa’); //...原创 2021-10-18 17:09:01 · 99 阅读 · 0 评论 -
Click(点击)
点击事件 点击事情方式 监听点击事件 事件响应方式 <button id="btn" onclick="threeFn()">点我</button> // 第一种 通过点击事件 btn.onclick = function () { alert('这是第一种点击方式'); };...原创 2021-09-07 06:48:53 · 1712 阅读 · 0 评论 -
Vue (响应式原理-模拟-5-Watcher)
Watcher 功能 当数据变化触发依赖, dep 通知所有的 Watcher 实例更新视图 自身实例化的时候往 dep 对象中添加自己 class Watcher { constructor(vm, key, cb) { this.vm = vm //...原创 2021-09-05 11:38:07 · 140 阅读 · 0 评论 -
Vue (响应式原理-模拟-4-Dep)
Dep 功能 收集依赖,添加观察者(watcher) 通知所有观察者 class Dep { constructor() { // 存储所有的观察者 this.subs = [] } // 添加观察者 addSub (sub) { if (sub && sub.u...原创 2021-09-05 11:36:55 · 242 阅读 · 0 评论 -
Vue (响应式原理-模拟-3-Compiler)
Compiler 功能 负责编译模板,解析指令/插值表达式 负责页面的首次渲染 当数据变化后重新渲染视图 // 负责解析指令/插值表达式class Compiler { constructor(vm) { this.vm = vm this.el = vm.$el ...原创 2021-09-05 11:34:54 · 188 阅读 · 0 评论 -
Vue (响应式原理-模拟-2-Observer)
Observer 功能 负责把 data 选项中的属性转换成响应式数据 data 中的某个属性也是对象,把该属性转换成响应式数据 数据变化发送通知 添加 Dep 和 Watcher 的依赖关系 数据变化发送通知 ...原创 2021-09-02 11:50:53 · 141 阅读 · 0 评论 -
Vue (响应式原理-模拟-1-vue)
Vue 功能 负责接收初始化的参数(选项) 负责把 data 中的属性注入到 Vue 实例,转换成 getter/setter 负责调用 observer 监听 data 中所有属性的变化 负责调用 compiler 解析指令/插值表达式 ...原创 2021-09-01 23:55:21 · 133 阅读 · 0 评论 -
Vue (响应式原理-模拟-0)
Vue 把data中的成员注入到Vue实例,并且把data中的成员转化为getter/setter Observer 能够对数据对象的所有属性进行监听,如有变动可以拿到最新值并通知Dep Vue 功能 负责接收初始化的参数(选项) ...原创 2021-09-01 23:53:46 · 128 阅读 · 0 评论