最新要闻
- 当前消息!郴州市苏仙区开展2023年农村法治宣传教育月暨民法典宣传月启动仪式活动
- 环球微速讯:又遇极端天气!桂林2小时下完了1天的大暴雨
- 资讯:2999元 理想L9、L8官方车顶行李架上新预告:全自研、专车定制
- 旗舰同款!OPPO Reno10系列搭载动态光影屏:1400nit+120Hz高刷
- 天天观察:唯一百亿亿次 美国三度蝉联TOP500超算冠军:中国超算不陪着玩了
- 【全球快播报】强制单踏板“拜拜” 特斯拉新版本软件说明:动能回收可调力度了
- 今年会出现极端高温吗?专家:预计今夏高温情况比去年弱 每日简讯
- 【世界播资讯】水洼煮食物晾衣服生活中还遇到过哪些类似现象?
- 世界微资讯!安卓跑分要变天了!安兔兔V10公测版正式发布:分数要涨
- 世界速讯:突破封锁活下来了!华为88个子公司成功实现MetaERP切换:自主可控、全球上线
- 【报资讯】网易逆水寒手游彩蛋揭秘:日照金山宛如照片 这画质你敢信是手机能跑
- 搭载原相PAW3395旗舰传感器:雷柏推出VT9S无线鼠标
- 天天即时:红米平板2曝光:处理器换用骁龙680!主打极致性价比
- 六年级上册求阴影部分的面积及答案 六年级上册求阴影部分的面积_世界观速讯
- 以军在约旦河西岸打死3名巴勒斯坦人
- 焦点播报:用上比亚迪刀片电池 新款特斯拉Model Y海外下线:充电超猛
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--九个超级好用的 Javascript 技巧 环球速看料
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前言
在实际的开发工作过程中,积累了一些常见又超级好用的 Javascript 技巧和代码片段,包括整理的其他大神的 JS 使用技巧,今天筛选了 9 个,以供大家参考。
1、动态加载 JS 文件
在一些特殊的场景下,特别是一些库和框架的开发中,我们有时会去动态的加载 JS 文件并执行,下面是利用 Promise 进行了简单的封装。
(资料图片仅供参考)
function loadJS(files, done) { // 获取head标签 const head = document.getElementsByTagName("head")[0]; Promise.all(files.map(file => { return new Promise(resolve => { // 创建script标签并添加到head const s = document.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = file; // 监听load事件,如果加载完成则resolve s.addEventListener("load", (e) => resolve(), false); head.appendChild(s); }); })).then(done); // 所有均完成,执行用户的回调事件}loadJS(["test1.js", "test2.js"], () => { // 用户的回调逻辑});
上面代码核心有两点,一是利用 Promise 处理异步的逻辑,而是利用 script 标签进行 js 的加载并执行。
2、实现模板引擎
下面示例用了极少的代码实现了动态的模板渲染引擎,不仅支持普通的动态变量的替换,还支持包含 for 循环,if 判断等的动态的 JS 语法逻辑,具体实现逻辑在笔者另外一篇文章《面试官问:你能手写一个模版引擎吗?》做了非常详详尽的说明,感兴趣的小伙伴可自行阅读。
// 这是包含了js代码的动态模板var template ="My avorite sports:" +"<%if(this.showSports) {%>" + "<% for(var index in this.sports) { %>" + "<%this.sports[index]%>" + "<%}%>" +"<%} else {%>" + "none
" +"<%}%>";// 这是我们要拼接的函数字符串const code = `with(obj) { var r=[]; r.push("My avorite sports:"); if(this.showSports) { for(var index in this.sports) { r.push(""); r.push(this.sports[index]); r.push(""); } } else { r.push("none"); } return r.join("");}`// 动态渲染的数据const options = { sports: ["swimming", "basketball", "football"], showSports: true}// 构建可行的函数并传入参数,改变函数执行时this的指向result = new Function("obj", code).apply(options, [options]);console.log(result);
3、利用 reduce 进行数据结构的转换
有时候前端需要对后端传来的数据进行转换,以适配前端的业务逻辑,或者对组件的数据格式进行转换再传给后端进行处理,而 reduce 是一个非常强大的工具。
const arr = [ { classId: "1", name: "张三", age: 16 }, { classId: "1", name: "李四", age: 15 }, { classId: "2", name: "王五", age: 16 }, { classId: "3", name: "赵六", age: 15 }, { classId: "2", name: "孔七", age: 16 }];groupArrayByKey(arr, "classId");function groupArrayByKey(arr = [], key) { return arr.reduce((t, v) => (!t[v[key]] && (t[v[key]] = []), t[v[key]].push(v), t), {})}
很多很复杂的逻辑如果用 reduce 去处理,都非常的简洁。
4、添加默认值
有时候一个方法需要用户传入一个参数,通常情况下我们有两种处理方式,如果用户不传,我们通常会给一个默认值,亦或是用户必须要传一个参数,不传直接抛错。
function double() { return value *2}// 不传的话给一个默认值0function double(value = 0) { return value * 2}// 用户必须要传一个参数,不传参数就抛出一个错误const required = () => { throw new Error("This function requires one parameter.")}function double(value = required()) { return value * 2}double(3) // 6double() // throw Error
5、函数只执行一次
有些情况下我们有一些特殊的场景,某一个函数只允许执行一次,或者绑定的某一个方法只允许执行一次。
export function once (fn) { // 利用闭包判断函数是否执行过 let called = false return function () { if (!called) { called = true fn.apply(this, arguments) } }}
6、实现 Curring
JavaScript 的柯里化是指将接受多个参数的函数转换为一系列只接受一个参数的函数的过程。这样可以更加灵活地使用函数,减少重复代码,并增加代码的可读性。
function curry(fn) { return function curried(...args) { if (args.length >= fn.length) { return fn.apply(this, args); } else { return function(...args2) { return curried.apply(this, args.concat(args2)); }; } };}function add(x, y) { return x + y;}const curriedAdd = curry(add);console.log(curriedAdd(1)(2)); // 输出 3console.log(curriedAdd(1, 2)); // 输出 3
通过柯里化,我们可以将一些常见的功能模块化,例如验证、缓存等等。这样可以提高代码的可维护性和可读性,减少出错的机会。
7、实现单例模式
JavaScript 的单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并提供对该实例的全局访问点,在 JS 中有广泛的应用场景,如购物车,缓存对象,全局的状态管理等等。
let cache;class A { // ...}function getInstance() { if (cache) return cache; return cache = new A();}const x = getInstance();const y = getInstance();console.log(x === y); // true
8、实现 CommonJs 规范
CommonJS 规范的核心思想是将每个文件都看作一个模块,每个模块都有自己的作用域,其中的变量、函数和对象都是私有的,不能被外部访问。要访问模块中的数据,必须通过导出(exports)和导入(require)的方式。
// id:完整的文件名const path = require("path");const fs = require("fs");function Module(id){ // 用来唯一标识模块 this.id = id; // 用来导出模块的属性和方法 this.exports = {};}function myRequire(filePath) { // 直接调用Module的静态方法进行文件的加载 return Module._load(filePath);}Module._cache = {};Module._load = function(filePath) { // 首先通过用户传入的filePath寻址文件的绝对路径 // 因为再CommnJS中,模块的唯一标识是文件的绝对路径 const realPath = Module._resoleveFilename(filePath); // 缓存优先,如果缓存中存在即直接返回模块的exports属性 let cacheModule = Module._cache[realPath]; if(cacheModule) return cacheModule.exports; // 如果第一次加载,需要new一个模块,参数是文件的绝对路径 let module = new Module(realPath); // 调用模块的load方法去编译模块 module.load(realPath); return module.exports;}// node文件暂不讨论Module._extensions = { // 对js文件处理 ".js": handleJS, // 对json文件处理 ".json": handleJSON}function handleJSON(module) { // 如果是json文件,直接用fs.readFileSync进行读取, // 然后用JSON.parse进行转化,直接返回即可 const json = fs.readFileSync(module.id, "utf-8") module.exports = JSON.parse(json)}function handleJS(module) { const js = fs.readFileSync(module.id, "utf-8") let fn = new Function("exports", "myRequire", "module", "__filename", "__dirname", js) let exports = module.exports; // 组装后的函数直接执行即可 fn.call(exports, exports, myRequire, module,module.id,path.dirname(module.id))}Module._resolveFilename = function (filePath) { // 拼接绝对路径,然后去查找,存在即返回 let absPath = path.resolve(__dirname, filePath); let exists = fs.existsSync(absPath); if (exists) return absPath; // 如果不存在,依次拼接.js,.json,.node进行尝试 let keys = Object.keys(Module._extensions); for (let i = 0; i < keys.length; i++) { let currentPath = absPath + keys[i]; if (fs.existsSync(currentPath)) return currentPath; }};Module.prototype.load = function(realPath) { // 获取文件扩展名,交由相对应的方法进行处理 let extname = path.extname(realPath) Module._extensions[extname](this)}
上面对 CommonJs 规范进行了简单的实现,核心解决了作用域的隔离,并提供了 Myrequire 方法进行方法和属性的加载,对于上面的实现,笔者专门有一篇文章《38 行代码带你实现 CommonJS 规范》进行了详细的说明,感兴趣的小伙伴可自行阅读。
9、递归获取对象属性
如果让我挑选一个用的最广泛的设计模式,我会选观察者模式,如果让我挑一个我所遇到的最多的算法思维,那肯定是递归,递归通过将原始问题分割为结构相同的子问题,然后依次解决这些子问题,组合子问题的结果最终获得原问题的答案。
const user = { info: { name: "张三", address: { home: "Shaanxi", company: "Xian" }, },};// obj是获取属性的对象,path是路径,fallback是默认值function get(obj, path, fallback) { const parts = path.split("."); const key = parts.shift(); if (typeof obj[key] !== "undefined") { return parts.length > 0 ? get(obj[key], parts.join("."), fallback) : obj[key]; } // 如果没有找到key返回fallback return fallback;}console.log(get(user, "info.name")); // 张三console.log(get(user, "info.address.home")); // Shaanxiconsole.log(get(user, "info.address.company")); // Xianconsole.log(get(user, "info.address.abc", "fallback")); // fallback
本文转载于:
https://juejin.cn/post/7223938976158957624
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
-
Mybatis基本使用
1、创建maven项目,导入mybatis依赖。<dependency><groupId>org mybatis< groupId><artifactId>mybatis< ar
来源: -
sed
https: www bilibili com video BV1CS4y1C7ZY?p=61&vd_source=29cb78abf51970a872824d0975a7bff5Linux三剑
来源: 记录--九个超级好用的 Javascript 技巧 环球速看料
(笔记)运放电路中并联反馈电容与反馈电阻的工作原理 每日头条
Mybatis基本使用
sed
当前消息!郴州市苏仙区开展2023年农村法治宣传教育月暨民法典宣传月启动仪式活动
环球微速讯:又遇极端天气!桂林2小时下完了1天的大暴雨
资讯:2999元 理想L9、L8官方车顶行李架上新预告:全自研、专车定制
旗舰同款!OPPO Reno10系列搭载动态光影屏:1400nit+120Hz高刷
天天观察:唯一百亿亿次 美国三度蝉联TOP500超算冠军:中国超算不陪着玩了
【全球快播报】强制单踏板“拜拜” 特斯拉新版本软件说明:动能回收可调力度了
今年会出现极端高温吗?专家:预计今夏高温情况比去年弱 每日简讯
细谈使用CodeQL进行反序列化链的挖掘过程
世界观察:react-naive工作原理
债市日报:5月22日
【世界播资讯】水洼煮食物晾衣服生活中还遇到过哪些类似现象?
世界微资讯!安卓跑分要变天了!安兔兔V10公测版正式发布:分数要涨
世界速讯:突破封锁活下来了!华为88个子公司成功实现MetaERP切换:自主可控、全球上线
【报资讯】网易逆水寒手游彩蛋揭秘:日照金山宛如照片 这画质你敢信是手机能跑
搭载原相PAW3395旗舰传感器:雷柏推出VT9S无线鼠标
天天即时:红米平板2曝光:处理器换用骁龙680!主打极致性价比
六年级上册求阴影部分的面积及答案 六年级上册求阴影部分的面积_世界观速讯
分布式任务调度:xxl-job
全球速讯:湖北省荆州市沙市区领导参观考察璞华苏州总部
速读:论elasticsearch在Windows环境的安装
收评:两市窄幅波动沪指涨0.39% 供销社概念股领涨-焦点热议
以军在约旦河西岸打死3名巴勒斯坦人
焦点播报:用上比亚迪刀片电池 新款特斯拉Model Y海外下线:充电超猛
实时:吴刚《后浪》再登热搜:网友吐槽其侮辱中医
AMD Yes还能饭否? RX 7600显卡性能偷跑:差得有点多 要闻速递
神车上新!新款比亚迪宋PLUS DM-i实车现身:装上海豹同款大灯
支付宝App可以换皮肤了!官方教程出炉:免费领
MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!
比亚迪选用顶象无感验证,增强售后服务平台安全性
go语言变量定义及类型_焦点快看
【vue流程编辑器框架】Vue-Flowchart-Editor
揭秘百分比图的魅力:数据之美引领决策智慧
退休人员涨工资最新消息2023年 2023养老金上调4.5%是不是真的?
环球热头条丨内蒙古火车站乐手齐奏万马奔腾:旅客拍手叫好
JDG战队FMVP选手knight:生日能拿到冠军特别开心
当前热文:安卓最强性能!vivo X90S下月发布:搭载天玑9200+
今日视点:男子52次跟车式逃停车费2870元 结果惨了
【世界独家】怀柔温馨之家,欢迎你们!
时讯:【Java】引用传递?值传递?
看完这篇,DWS故障修复不再愁-全球热闻
【DSP视频教程】DSP视频教程第12期:TI开源分享IQmath DSP源码,适用于所有Cortex-M内核,本期教程做个手把手移植 (2022-05-22)
最全iOS 上架指南 全球微资讯
焦点滚动:(笔记)运放的带宽、增益带宽积、转换速率、反馈系统等概念理解
直击华尔街|Scott Redler解读华尔街一周:债务上限问题不会导致剧烈动荡 经济若衰退美联储需降息
李楠预测:手机的形态将迎来革命 这下网友有话说了
环球新资讯:清华大学女生获世界小姐选美冠军:谁说学霸就是丑 网友围观真美吗
底层重构 微软Win12最快明年问世:AI魔改搜索体验
使用ssh公钥密钥自动登陆linux服务器 环球快资讯
天天热消息:关于Excel表格中对多个General或者Number数值格式的单元转换为Text文本时-值包含E+的方法处理
世界最新:AI诈骗正在全国爆发!一公司老板10分钟被AI诈骗430万
全球要闻:专治PCIe 5.0发烧 利民SSD散热器到手99.9元(45W强悍散热)
今日关注:国内没人买?东风本田CR-V插混、e:NS1纯电车要卖到海外去了
环球播报:WPS AI再获升级:文档内容、格式规范一键生成
85%肉含量无淀粉 一口爆汁:火山石烤肠19.9元2斤大促
天准科技(688003.SH):机器视觉是一种非常通用的技术
Java使用HttpClient以multipart/form-data向接口上传文件
Seata 的可观测实践
直播源码技术录制功能知识
java 外壳加密,完美解决|全球看点
热文:个人养老金产品代销排行:招行、交行、平安暂居前三,优势还是烦恼?
全球观热点:开机先看电影?壁纸神器Wallpaper Engine惊现《流浪地球2》 网友吐槽缺德
世界即时看!路特斯被曝将试驾车当新车交付 车主:有全部证据 索赔385万
紫气东来!魅族20 PRO推出晨曦紫新配色:4399元起售 享3年质保
苹果神一样存在!iPhone彻底统治日本市场:份额超50% 安卓被摩擦-全球通讯
天天报道:小米Civi 3正面首曝:药丸曲面屏比iPhone 14 Pro更精致
南阳市新野县团结小学经典诵读展示活动成功举办
rt下降40%?程序并行优化六步法|天天最资讯
为什么MySQL单表不能超过2000万行?_环球动态
05-译码器
全球观焦点:消夏之夜购物节吸引百余商家汇聚 到场市民超过10万人次
每日讯息!OPPO Reno10影像称绝:全系标配长焦镜头
南宁路边停车一天收费上百 有车主欠费6.4万_当前快播
同调拼色设计辨识度拉满!小米Civi 3真机外观首秀来了 世界热闻
大内存大存储真香!新版真我GT Neo5官宣:16GB+1TB明日开售 报资讯
热点聚焦:国产视频剪辑软件取代PR?联想YOGA官宣与剪映独家合作
世界实时:【苗乡侗寨人物志】“想喝正宗酸汤,去凯里就对了”
Android Studio源码导入与调试_环球新资讯
天天快讯:From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
GPS北斗校时服务器(时间同步装置)助力桥梁检测系统建设
微动态丨HTTP1.0、HTTP1.1、HTTP2.0 协议的区别
时讯:出口货值增长近40倍!我国这个地方制造的汽车加速出口中亚→
焦点!拓邦发布钠离子电池:-40℃放电容量近80% 秒杀锂电
玩家化身手工耿血洗《塞尔达》:不仅造出了坦克飞机还要修仙
独悬变扭力梁、气囊也少了 新款丰田卡罗拉上市:11.68万起
国内营收占10%以上 美光成美国存储芯片独苗:内存全球第三_每日快看
新车下饺子!比亚迪宋Pro DM-i冠军版内饰官图发布:新配色真高级
优选营养素密度高的食物,合理膳食提升免疫力
c语言程序设计知识点总结03-精彩看点
没有5G卖4G的华为手机比苹果还牛:消息称逆势上调全年出货量目标 全行业第一家|天天精选
1499元!小度青禾学习手机开启预售:一机顶6台 立省1万元
热门看点:400年前的画里有男孩穿耐克鞋 网友称穿越:还有百年前画作出现iPhone
全红婵的水花让物理学不存在了 网友点赞:物理学对她不适用|全球观热点
一个月没找到 美国30吨爆炸性化学品铁路运输时丢失:科普硝酸铵理化性质-世界热点
快报:中国抗体-B(03681.HK):SM17新药研究申请获国家药监局药品审评中心受理
天天精选!交易商协会发布4月债务融资工具业务量统计和主承分类统计
印为何收回2000卢比纸币?专家:缓解银行流动性危机和加息压力