关于javascript:前端全局捕获错误-Vue3PromiseJs

前言尽管在开发当中都会解决好谬误,但就怕有脱漏或者某些特地的、奇奇怪怪的bug,这些谬误就难以捕获,所以钻研了一下全局捕捉谬误的三种办法。 1.window.onerrorMDN文档:window.onerror当资源加载失败或无奈应用时又或者script执行谬误时会被这个api捕捉到 /** * @return * message:谬误音讯(字符串) * source:引发谬误的脚本的URL(字符串) * lineno:产生谬误的行号(数值) * colno:产生谬误的行的列号(数值) * error:谬误对象(对象) * * 特点: * 辨认所有的js的谬误 * 辨认到Vue监听不到的谬误,例如异步谬误 */ window.onerror = (message, source, lineno, colno, error) => { console.log(message, source, lineno, colno, error);}2.unhandledrejectionMDN文档:unhandledrejection用于捕捉全局的、未被Promise.reject解决的Promise谬误 // 全局Promise谬误捕捉/** * @return * reason:异样解决办法中的谬误起因 * * 特点: * 捕捉所有未被Promise.reject解决的谬误 */ window.addEventListener('unhandledrejection', (event) => { console.error(event.reason);})3.app.config.errorHandler该api属于Vue.js,用于为利用内抛出的未捕捉谬误指定一个全局处理函数。Vue3文档:Vue3 app.config.errorHandlerVue2文档:Vue2 app.config.errorHandler const app = createApp(App)app.use(router)app.mount('#app')/** * @params * err:谬误对象 * instance:触发该谬误的组件实例 * info:一个指出谬误起源类型信息的字符串 * * 特点: * 组件渲染器 * 事件处理器 * 生命周期钩子 * setup() 函数 * 侦听器 * 自定义指令钩子 * 过渡 (Transition) 钩子 */ app.config.errorHandler = (err: any, instance: any, info: any) => { console.error(err);}

May 12, 2023 · 1 min · jiezi

关于javascript:miniprogramcomputed之computed源码解析

前言用惯了vue的computed属性,在小程序开发中不免也会想着应用,而官网正好提供了miniprogram-computed来在小程序中应用computed属性。本着精进技术的准则,一起来瞅瞅官网的源码吧! 根本应用// js代码import { behavior as computedBehavior } from 'miniprogram-computed'Component({ behaviors: [ computedBehavior ], data: { a: 1, b: { c: 1, d: [2, 3] } }, computed: { total(data) { return data.a + data.b.c + data.b.d[0] } }})// 页面中应用// <view>{{ total }}</view>源码解析1.初始化computedWatchInfo对象在created生命周期中初始化了computedWatchInfo对象,并保留到页面根实例上。<span style="color:rgb(236, 68, 68);">computedWatchInfo</span>对象保护了以后组件实例的computed计算信息。 <span style="color:rgb(236, 68, 68);">computedUpdaters数组</span>保留了包装后的计算函数,每当data值变动后,就执行其中保留的包装函数,并依据computedRelatedPathValues中收集的依赖关系,来判断是否要执行原始计算函数。 <span style="color:rgb(236, 68, 68);">computedRelatedPathValues</span>对象保留了computed属性值与计算函数运算过程中所依赖的key与keyValue的映射关系,用于前期data值变动后,通过查找依赖值是否变动,来决定是否进行从新计算。 // 初始化以后组件的监听对象const computedWatchInfo = { // 保留包装后的计算函数 computedUpdaters: [], // 依据computed属性值保留计算过程中依赖的data中的key及value computedRelatedPathValues: {}, watchCurVal: {}, _triggerFromComputedAttached: {}}// 保留到根实例_computedWatchInfo属性中if (!this._computedWatchInfo) this._computedWatchInfo = {}// computedWatchDefId 继续自增的数字this._computedWatchInfo[computedWatchDefId] = computedWatchInfo2.遍历computed对象将key及computedValue设置到data中在attached生命周期中,遍历所有的computed属性及对应的计算函数,执行计算函数并传入代理后的data对象,将key及计算后的value值通过setData设置到data中。(1)在attached生命周期中,遍历computed,拿到所有的计算函数,进行computed值的初始化,并对每个计算函数所依赖的data属性值进行依赖关联关系收集,并将收集后的关系表保留到监听对象computedRelatedPathValues对象中。 ...

May 12, 2023 · 2 min · jiezi

关于javascript:从vuecli迁移到Vite的过程

vite迁徙记录为什么要迁徙到vite当咱们开始构建越来越大型的利用时,须要解决的 JavaScript 代码量也呈指数级增长。蕴含数千个模块的大型项目相当广泛。基于 JavaScript 开发的工具就会开始遇到性能瓶颈:通常须要很长时间(甚至是几分钟!)能力启动开发服务器,即便应用模块热替换(HMR),文件批改后的成果也须要几秒钟能力在浏览器中反映进去。如此周而复始,机灵的反馈会极大地影响开发者的开发效率和幸福感。为了进步开发的幸福感和愉悦度,和进步开发效率的状况下,最近对一个我的项目进行了革新迁徙,迁徙实现后热更速度让我有了十分舒畅的感觉。 vite为什么这么快在冷启动的时候,基于打包器的形式启动必须优先抓取并构建你的整个利用,而后能力提供服务。然而vite通过在一开始将利用中的模块辨别为 依赖 和 源码 两类。 依赖 大多为在开发时不会变动的纯 JavaScript。一些较大的依赖(例如有上百个模块的组件库)解决的代价也很高。依赖也通常会存在多种模块化格局(例如 ESM 或者 CommonJS)。 Vite 将会应用 esbuild 预构建依赖。esbuild 应用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。 源码 通常蕴含一些并非间接是 JavaScript 的文件,须要转换(例如 JSX,CSS 或者 Vue 组件),时常会被编辑。同时,并不是所有的源码都须要同时被加载(例如基于路由拆分的代码模块)。Vite 以 原生 ESM 形式提供源码。这实际上是让浏览器接管了打包程序的局部工作:Vite 只须要在浏览器申请源码时进行转换并按需提供源码。依据情景动静导入代码,即只在以后屏幕上理论应用时才会被解决。 Webpack 式的经典 bundler 示意图 Vite 式的 No-bundler 示意图 Vite能兼容IE吗应用官网插件 @vitejs/plugin-legacy 反对 环境要求是什么最低要求Node14.18.0+ 开始迁徙必备插件必要的依赖:vite-plugin-html, vite,Vue 3 单文件组件反对:@vitejs/plugin-vueVue 3 JSX 反对:@vitejs/plugin-vue-jsxVue 2.7 反对:vitejs/vite-plugin-vue2Vue <2.7 的反对:underfin/vite-plugin-vue2Eslint集成咱们在awesome-vite库中可能会看到两个Eslint插件,那么他们有什么不同呢?在这里了举荐应用@nabla/vite-plugin-eslint,为什么呢? 相较于vite-plugin-eslint,下面举荐的能够放弃HMR迅速,因为linting是异步实现的,不会阻塞编译的进行,而这个插件会先查看linting再编译,这样咱们的HMR就变慢了。 环境变量辨别Vite 应用 dotenv 从你的 环境目录 中的下列文件加载额定的环境变量: .env # 所有状况下都会加载.env.local # 所有状况下都会加载,但会被 git 疏忽.env.[mode] # 只在指定模式下加载.env.[mode].local # 只在指定模式下加载,但会被 git 疏忽mode是怎么配置的,能够在启动vite的时候增加--mode ${你的mode} ...

May 12, 2023 · 1 min · jiezi

关于javascript:JavaScript-函数式编程

函数式编程 Functional Programming什么是函数式编程函数式编程是一种计划简略、性能独立、对作用域外没有任何副作用的编程范式(paradigms):INPUT -> PROCESS -> OUTPUT。 函数式编程: 1)性能独立——不依赖于程序的状态(比方可能发生变化的全局变量); 2)纯函数——同一个输出永远能失去同一个输入; 3)无限的副作用——能够严格地限度函数内部对状态的更改。 函数式编程中应用较多的变量和函数,并且只有须要计算时才把数据传给函数,其余状况下函数和数据是拆散的。函数会返回新数值并传递到代码的其余局部。而在面向对象编程中,变量和函数被写在一个对象外部。 一些术语 Terminology回调 Callbacks:是被传递到另一个函数中调用的函数。 例如在 filter 中,回调函数通知 JavaScript 以什么规定过滤数组。第一等公民 First-class citizens:函数就像数值一样,能够赋值给变量、传递给另一个函数,或从其它函数返回,这种函数叫做头等 first class 函数。 在 JavaScript 中,所有函数都是头等函数。高阶函数 Higher order:将其余函数作为参数或/和被调用时返回函数的函数。当函数被传递给另一个函数或从另一个函数返回时,那些传入或返回的函数能够叫做 lambda。纯函数和副作用 Pure functions and side effects:纯函数指同一输出失去同一输入,传函数没有副作用。副作用指函数使其内部产生扭转的结果,包含: 扭转函数外的变量值或者依赖函数外的变量调用浏览器 API,甚至是控制台调用相似 Math.random() 这样的办法 - 因为这个值不能牢靠地反复const prepareGreenTea = () => 'greenTea';const prepareBlackTea = () => 'blackTea';const getTea = (prepareTea, numOfCups) => { const teaCups = []; for(let cups = 1; cups <= numOfCups; cups += 1) { const teaCup = prepareTea(); teaCups.push(teaCup); } return teaCups;};const tea4GreenTeamFCC = getTea(prepareGreenTea, 27);const tea4BlackTeamFCC = getTea(prepareBlackTea, 13);console.log( tea4GreenTeamFCC, tea4BlackTeamFCC);副作用和防止变动 Avoid Mutation and Side Effect函数式编程的外围准则之一是不扭转任何货色。 变动会导致谬误。 如果一个函数不扭转传入的参数、全局变量等数据,那么它造成问题的可能性就会小很多。 ...

May 12, 2023 · 4 min · jiezi

关于javascript:Part3JavaScript生态加速攻略eslint

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug. 本文探讨了如何通过优化选择器引擎和AST转换过程,以及欠缺JavaScript中的linter,从而减速JavaScript和TypeScript我的项目。作者提到,一个现实的用JS编写的linter能够在不到一秒钟的工夫内运行结束。 在本系列的前两篇文章中,咱们曾经探讨了很多对于代码格调查看的内容,所以我认为是时候给eslint一个应有的关注了。总的来说,eslint非常灵活,甚至能够将解析器齐全替换成另一个不同的解析器。随着JSX和TypeScript的衰亡,这种状况并不少见。得益于丰盛的插件和预设生态系统,可能曾经有了实用于每个应用场景的规定,如果还没有,优良的文档会领导你如何创立本人的规定。 但这也给性能剖析带来了问题,因为配置灵活性的广泛性,两个我的项目在进行代码查看时可能会有十分不同的体验。不过咱们须要从某个中央开始,所以我想,何不从查看 eslint 存储库中应用的代码查看设置开始咱们的考察呢! 应用 eslint 对 eslint 进行代码查看代码库应用工作运行器形象来协调常见的构建工作,然而通过一些开掘,咱们能够拼凑出针对 JavaScript 文件进行“lint”工作的命令 node bin/eslint.js --report-unused-disable-directives . --ignore-pattern "docs/**"Eslint正在应用eslint来查看他们的代码库!就像本系列的前两篇文章一样,咱们将通过node的内置 --cpu-prof 参数生成 *.cpuprofile ,而后将其加载到Speedscope中进行进一步剖析。几秒钟后(确切地说是22秒),咱们筹备好深入研究了! 通过合并相似的调用堆栈,咱们能够更分明地理解工夫破费在哪里。这通常被称为“左重(left-heavy)”可视化。这与规范的火焰图不同,其中x轴示意调用产生的工夫。相同,在这种格调中,x轴示意总工夫耗费的工夫,而不是产生的工夫。对我来说,这是 Speedscope 的次要长处之一,而且感觉更加迅速。这并不意外,因为它是由 Figma 的几个开发人员编写的,他们以在咱们行业中的工程卓越而闻名。 一个特定的 BackwardTokenCommentCursor 条目仿佛很乏味,因为它是一堆中最大的块。追随附加的文件地位到源代码,它仿佛是一个保留文件中咱们所处地位状态的类。作为第一步,我增加了一个简略的计数器,每当该类被实例化时就会减少,并再次运行了lint工作。 超过2000万次后总的来说,这个类曾经被构建了超过2000万次。这仿佛相当多。请记住,咱们实例化的任何对象或类都会占用内存,这些内存稍后须要清理。咱们能够在数据中看到这种结果,即垃圾回收(清理内存的行为)总共须要2.43秒。这不好。 在创立该类的新实例时,它调用了两个函数,这两个函数仿佛都会启动搜寻。不过,如果不理解它正在做什么,第一个函数能够被排除在外,因为它不蕴含任何模式的循环。从教训来看,循环通常是性能考察的次要嫌疑对象,因而我通常从那里开始搜寻。 只管第二个函数称为 utils.search() ,但它蕴含一个循环。它循环遍历从咱们在此时进行代码查看的文件内容中解析出的标记流。标记是编程语言的最小构建块,能够将它们视为语言的“单词”。例如,在JavaScript中,function一词通常示意为一个函数标记,逗号或单个分号也是如此。在这个 utils.search() 函数中,咱们仿佛关怀找到文件中最靠近以后地位的标记。 exports.search = function search(tokens, location) { const index = tokens.findIndex(el => location <= getStartLocation(el)); return index === -1 ? tokens.length : index;};为了做到这一点,通过JavaScript的本地 .findIndex() 办法在令牌数组上进行搜寻。该算法的形容如下: ...

May 12, 2023 · 4 min · jiezi

关于javascript:Nodejs版本管理工具我选择n

文件收录: 集体网址:https://linglan01.cn/ Github: https://github.com/CatsAndMice/blog/issues为什么要治理Node.js版本?这是咱们要先明确的点。 假如我电脑Node.js版本为v14.x,日常工作中可能会遇到以下场景: 我想要尝鲜新版本的Node.js所带来的新个性,顺带提一声Node.js官网近期已公布v20.x版本;我要给华为云开源的组件库TinyVue奉献一波,运行它要求Node.js版本为 v16.x;团队成员 Node.js 版本不对立: 守旧派用 v12.x、保守派用 v14.x、激进派用 v17.x,忽然某天老板让我去保护守旧派负责的我的项目,运行后因为Node.js版本不统一间接报错。如何解决呢?卸载重装?又low还折腾。 如果咱们应用Node.js版本管理工具就能任意切换Node.js版本,不须要卸载重装。 它能帮咱们做到v12.x、v14.x、v20.x等等版本重复横跳。 简略选型咱们看看社区有哪些Node.js版本管理工具,做一个简略的选型吧。 Node.js版本管理工具npm下载量/周GitHub Star特点nvm不反对npm装置66.9k反对Linux、MacOS,不反对Windows,Windows设施应用nvm-windows。n70k+17.6k反对Linux、MacOS;Windows平台必须通过 WSL(Linux 的 Windows 子系统)工作; 无配置,应用简略。nvs不反对npm装置2.3k基于Node.js开发,跨平台。fnm不反对npm装置11.8kRust语言编写,一个字快,反对跨平台。再阐明一下我的状况:我电脑是MacOS,环境已装置Node.js具备npm包管理器,对Node.js版本管理器性能要求不多,不便我切换Node.js版本就够了,综上我抉择n。 抉择理由: 它反对npm形式装置,不须要我再学习其余不相熟的装置工具;简略,无需配置;反对MacOS。童鞋们视本身状况抉择适合的Node.js版本管理工具,并不一定要抉择n。 如果您与我的状况一样,举荐应用n。 n装置npm/yarn装置: npm i n -g# 或yarn global add n应用 Brew 装置,未装置能够参考 Brew 官网装置。 brew install nn命令详情仅阐明常用命令,其余的命令童鞋们本人去钻研一波。 命令命令作用n lsr查看 Node.js 近程版本n i 版本装置指定版本n list查看本地已装置的Node.js版本n交互式切换Node.js版本n rm 版本删除指定版本n lsr查看近程版本,默认20条数据,想查看所有的版本应用n lsr —-all。 装置指定版本n i 版本,间接装置最新版本n i 20.1.0 。 n list查看到v20.1.0已装置至本地。 n交互式容许咱们抉择想要的Node.js版本。 over,上述命令足够了,简略吧!!! ...

May 11, 2023 · 1 min · jiezi

关于javascript:答题积分小程序云开发实战接口联调篇进入首页自动鉴权静默登录

微信小程序云开发实战-答题积分赛小程序 接口联调篇:进入首页主动鉴权静默登录根本介绍微信云开发提供了多个根底能力,包含数据库、存储、云函数等。其中,云函数是一段运行在云端的代码,无需治理服务器,在开发工具内编写、一键上传部署即可运行后端代码。小程序内提供了专门用于云函数调用的 API。开发者能够在云函数内应用 wx-server-sdk 提供的 getWXContext 办法获取到每次调用的上下文(appid、openid 等)。 技术要点1、wx-server-sdk云函数中应用 wx-server-sdk 需在对应云函数目录下装置 wx-server-sdk 依赖,在创立云函数时会在云函数目录下默认新建一个 package.json,云函数的运行环境是 Node.js 。 2、getWXContext在云函数中获取微信调用上下文。 const cloud = require('wx-server-sdk') exports.main = async (event, context) => { const { OPENID,//小程序用户 openid,小程序端调用云函数时有 APPID,//小程序 AppID,小程序端调用云函数时有 UNIONID,//小程序用户 unionid,小程序端调用云函数,并且满足 unionid 获取条件时有 ENV,//云函数所在环境的 ID } = cloud.getWXContext() return { OPENID, APPID, UNIONID, ENV, }}定义云函数定义一个云函数,命名为 getOpenId ,性能是实现主动鉴权,获取用户登录态(openid): const cloud = require('wx-server-sdk') // 初始化 cloudcloud.init({ env: 'test-5613f6abn21'}) /** * 这个示例将经主动鉴权过的小程序用户 openid 返回给小程序端 * * event 参数蕴含小程序端调用传入的 data * */exports.main = async (event, context) => { // 可执行其余自定义逻辑 // console.log 的内容能够在云开发云函数调用日志查看 // 获取 WX Context (微信调用上下文),包含 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件) const wxContext = cloud.getWXContext() console.log(wxContext) return { event, openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID, }}部署云函数在 cloudfunctions/getOpenId 文件夹右击,而后抉择 “上传并部署”。 ...

May 11, 2023 · 1 min · jiezi

关于javascript:深浅拷贝温故知新

1、深拷贝1.1、概念对象的深拷贝是指其属性与其拷贝的源对象的属性不共享雷同的援用(指向雷同的底层值)的正本。 因而,当你更改源或正本时,能够确保不会导致其余对象也产生更改;也就是说,你不会无心中对源或正本造成意料之外的更改。 在深拷贝中,源和正本是齐全独立的。深拷贝与其源对象不共享援用,所以对深拷贝所做的任何更改都不会影响源对象。 1.2、实现形式:1.2.1、应用 JSON.stringify() 将该对象转换为 JSON 字符串,而后应用 JSON.parse() 将该字符串转换回(全新的)JavaScript 对象。前提:JavaScript 对象能够被序列化 序列化异样报错 存在循环援用时,会抛出异样 TypeError ("cyclic object value")(循环对象值)存在 BigInt 类型的值时,如:{ num: BigInt(1111111111) } 会抛出 TypeError ("BigInt value can't be serialized in JSON")(BigInt 值不能 JSON 序列化).序列化须要留神的隐式转换 非数组对象的属性不能保障以特定的程序呈现在序列化后的字符串中undefined、任意的函数以及 symbol 值,在序列化过程中会被疏忽(呈现在非数组对象的属性值中时)或者被转换成 null(呈现在数组中时)。函数、undefined 被独自转换时,会返回 undefined,如 JSON.stringify(function(){}) or JSON.stringify(undefined).所有以 symbol 为属性键的属性都会被齐全疏忽掉,即使 replacer 参数中强制指定蕴含了它们。Date 日期,会调用 toJSON() 将其转换为 string 字符串(同 Date.toISOString())NaN 和 Infinity 格局的数值及 null 都会被当做 nullMap/Set/WeakMap/WeakSet,仅会序列化可枚举的属性HTML 元素对象, 会失去 {}示例 // 隐式转换 JSON.stringify([new Number(1), new String("false"), new Boolean(false)]); // '[1,"false",false]' JSON.stringify({x: undefined, y: Object, z: Symbol("")}); // '{}' JSON.stringify([undefined, Object, Symbol("")]); // '[null,null,null]' JSON.stringify({[Symbol("foo")]: "foo"}); // '{}' JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]); // '{}' JSON.stringify( {[Symbol.for("foo")]: "foo"}, function (k, v) { if (typeof k === "symbol"){ return "a symbol"; } } ); // undefined // 不可枚举的属性默认会被疏忽: JSON.stringify( Object.create( null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true } } ) ); // "{"y":"y"}" JSON.stringify(document.body) // '{}' JSON.stringify(new Set([1, 2, 3])) // '{}' JSON.stringify(new Map([['num', 2]])) // '{}'1.2.2、应用 window.structuredClone(),应用结构化克隆算法将给定的值进行深拷贝。前提:可序列化的对象,且在浏览器环境和任何其余实现了 window 这样全局对象的 JavaScript 运行时的环境(structuredClone() 不是 JavaScript 语言自身的个性) ...

May 11, 2023 · 2 min · jiezi

关于javascript:uniapp结合PHP实现单用户登陆

&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp单用户登陆,即在一个利用中,同一个用户只能在线登陆一个,一个用户登陆,在其余设施上会被即时挤下线,确认后清空登陆该设施上的登陆装填并退回到登陆界面。 &nbsp&nbsp&nbsp&nbsp&nbsp&nbspuni-app是目前能通过应用vue.js框架只须要编写一套代码同时打包Android,IOS,微信小程序,头条支付宝小程序和H5,通过应用HBuilder工具不便调试与云打包,对于苹果证书,举荐CW.PUB,https://cw.pub/index/document/index。应用HBuilder打越狱包通过那个网站签名就能够在失常苹果手机装置,不过网上还有其余些办法这里就不列举了。 &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp个别APP做单用户登陆会应用第三方音讯推送平台,尽管uni-app尽管也能够对接友盟,极光等推送平台。但还是因为工夫,对接平台审核等流程工夫不容许。之前应用gatewayworkman和websocket做了即时聊天,所以单用户登陆也应用websocket实现。 uni-app socket单用户登陆例1.uni-app前端在初始化socke时发送以后设施的惟一标识,而后实时接管一个“强制退出”类型的音讯,一下只是简略示例。 //初始化socket.on('init', () => { //连贯初始化 socket.send({ type: 'login', token: uni.getStorageSync('access_token'), device_no: plus.device.uuid, //手机设施惟一编号 });}).on('quit_push',(res)=> { if(res) { uni.showModal({ title: '退出告诉', content: '你的账号在其余设施上登录!', showCancel: true, cancelText: '勾销', confirmText: '确定', success: res => { if(res.confirm) { uni.clearStorageSync() store.commit('chat/clear') uni.reLaunch({ url:"../../pages/login/index" }) }else if(res.cancel) { uni.clearStorageSync() store.commit('chat/clear') uni.reLaunch({ url:"../../pages/login/index" }) } } }); }});2.后端接管“设施惟一标识”参数,先查找缓存是否存在,不存在记录设施标识和socket的clientid。 3.登陆接口接管设施标识,缓存或库里取出标识记录与以后接管的设施标识判断是否统一,不统一则依据缓存中的clientid发送音讯。 $is_online = Db::name('UserLoginClient')->where('user_id',$user['id'])->order('id desc')->find();if(isset($device_no) && $device_no && $is_online['device_no'] != $device_no && !empty($is_online['device_no'])) { Tools::sendToClient($is_online['client_id'],json_encode([ 'type' => 'quit_push', 'data' => 'ip', 'message' => '强制下线' ])); }4.工具类sendToClient办法局部 ...

May 11, 2023 · 2 min · jiezi

关于javascript:JavaScript-面向对象编程

面向对象编程 Object Oriented Programming面向对象编程用对象把数据和办法聚合起来。 面向对象编程的长处能写出模块化的代码能使得代码更灵便能进步代码的可重用性面向对象编程的准则继承(inheritance):子类/派生类从父类/基类/超类中派生,造成继承构造封装(encapsulation):代码的实现对用户不可见,例如调用 toUpperCase(),间接调用即可,不必思考函数外部的实现形象(abstraction):形象就是形象出你正在尝试做的事件的概念,而不是解决这个概念的具体表现形式多态(polymorphism):多种状态对象创建对象应用对象字面量创立:let dog = { name: "Mit", numLegs: 2}应用 Object.create() 创立:(所有的对象都来自某个类,对象是类的实例,也是一种层级构造)class Animal { /* code */}var myDog = Object.create(Animal);console.log(Animal);应用 new 关键字:(当应用默认或者空构造函数办法,JS 会隐式调用对象的超类来创立实例)class Animal { /* code here */ }var myDog = new Animal();console.log(Animal)拜访对象属性let dog = { name: "Mit", numLegs: 2}console.log(dog.name); // Mit对象办法 Method对象能够有一个叫做 method 的非凡属性。 办法属性也就是函数。 这给对象增加了不同的行为。 let dog = { name: "Spot", numLegs: 4, sayLegs: function() { return "This dog has 4 legs." }};dog.sayLegs();thisthis 代表上下文环境中援用的对象。 ...

May 11, 2023 · 6 min · jiezi

关于javascript:郑州~超经典智慧城市CIMBIM数字孪生可视化项目开源工程及源码

数字孪生是时下十分风行的技术,而在智慧城市建设中,数字孪生更是施展着极为重要的作用。当初,智慧郑州的工程和源码均会收费赠送! 我的项目介绍作为中国中部的区域核心城市,郑州位于河南省中部偏东、中原经济区腹地。 在智慧郑州的建设中,咱们使用AI解决地形影像,应用高精度的max模型在中原区进行场景优化,而其余区域则采纳了AI生成的cim3数据。这样,咱们的智慧郑州能够更好地为市民提供各种服务,同时也享受着更加业余、精准的数字孪生技术的反对。 除此之外,咱们还应用数字孪生技术来整合数据和场景,从而将郑州的夜景出现得栩栩如生。 功能分析智慧郑州提供了多项性能,次要包含: 经济态势通过智慧郑州,咱们能够在每个区县上应用柱子进行3D可视化,从而展现其经济态势。 地表演变在智慧郑州中,咱们加载了公共的栅格数据,这样就能够将郑州城市地表演变刻画得更为实在。 省会交通在河南省的地图板块上,通过流动的线来展现郑州的交通不便水平。 夜间出行在智慧郑州中,咱们描述了郑州夜间出行的态势,展示了城市的夜间生态。 智慧郑州将数字孪生技术与城市建设完满联合起来,使城市治理更加科学化、智能化、高效化。心愿智慧郑州可能为市民提供更好的生存环境和更高质量的服务。须要源码请一键三连,私聊【源码】

May 10, 2023 · 1 min · jiezi

关于javascript:Electron登录注册桌面应用源码安装文件的打包方法

1.成果展现 2.前言在当下流量简直被瓜分的背景下,如果说Web利用是从他人那里抢流量,那桌面利用和手机利用就是留住抢来的流量。Web利用裸露在搜索引擎下,所以能够通过网络营销链接不便疾速的引流web产品上。 然而桌面和手机利用是封闭式的,这样就又能够从本人Web产品上导流,通过独到益处的性能减少用户粘性。那么本人的一套简略的互联网生态圈就能够定型了,前期再凋谢商户端口进行商业化经营。所以有了Web和App或小程序外,桌面利用也很有必要。 3.Electron介绍Electron是一个能让你应用传统前端技术(Nodejs, Javascript, HTML, CSS)开发一个跨平台桌面利用的框架。这里所说的桌面利用指的是在Windows、OSX及Linux零碎上运行的程序。 4.环境要求(1). Node.js(2). Cnpm(3). Electron(4). Visual Studio(5). electron-packager 打包工具 5.编码Electron的环境搭建网上也有很多,一下仅以开发案例阐明网络申请,主过程,渲染过程,窗口交互,利用的调试与打包等等。 (1). 创立窗口 const {app, BrowserWindow} = require('electron')const path = require('path')const url = require('url')const ipc = require('electron').ipcMain // 跳转主过程let mainWindow = null; // 主窗口function createWindow() { // 创立主窗口 mainWindow = new BrowserWindow({ width: 340, // 窗口宽度 height: 280, // 窗口高度 //frame: false, // 勾销window自带的敞开最小化等 resizable: false, // 禁止扭转主窗口尺寸 webPreferences: { nodeIntegration: true, // 解决在渲染层的其余js文件中呈现require无奈应用的状况【node的形式引入模块】 webSecurity: false, preload: path.join(__dirname, 'preload.js') } }) // 加载本地页面到利用中 mainWindow.loadFile('index.html') mainWindow.setMenu(null); // 敞开菜单栏 //mainWindow.webContents.openDevTools(); // 开启调试}(2). 跳转窗口1——创立新窗口 ...

May 10, 2023 · 3 min · jiezi

关于javascript:开源之夏-2023欢迎报名-MOSN-社区项目

开源之夏是由“开源软件供应链点亮打算”发动并长期反对的一项暑期开源流动,旨在激励在校学生积极参与开源软件的开发保护,促成优良开源软件社区的蓬勃发展,造就和挖掘更多优良的开发者。 流动联结国内外各大开源社区,针对重要开源软件的开发与保护提供我的项目工作,并面向寰球高校学生凋谢报名。 2023 年,MOSN 社区再次退出中国科学院软件研究所的高校开源流动—— “开源之夏 2023” ,为大家筹备了三个工作,波及 Go、HTTP、Security、Software-Defined Networking、Container 等多个畛域。 MOSN 我的项目介绍 MOSN (Modular Open Smart Network) 是一款基于 Go 语言开发的云原生网络代理平台,由蚂蚁团体开源并在双 11 大促期间通过几十万容器的生产级验证。MOSN 为服务提供多协定、模块化、智能化、平安的代理能力,交融了大量云原生通用组件,同时也能够集成 Envoy 作为网络库,具备高性能、易扩大的特点。另外,MOSN 能够集成 Istio 构建 Service Mesh,也能够作为独立的四、七层负载平衡,API Gateway、云原生 Ingress 等应用。 Layotto 我的项目介绍 Layotto (/let/) 是一款应用 Golang 开发的利用运行时, 旨在帮忙开发人员疾速构建云原生利用,帮忙利用和基础设施解耦。它为利用提供了各种分布式能力,例如状态治理、配置管理、事件公布订阅等,以简化利用的开发。 流动规定 开源之夏官网: (https://summer-ospp.ac.cn/ 各位同学能够自由选择我的项目,与社区导师沟通实现计划并撰写我的项目计划书。被选中的学生将在社区导师领导下,按计划实现开发工作,并将成绩奉献给社区。社区评估学生的完成度,主办方依据评估后果发放赞助金额给学生。 MOSN 社区我的项目 我的项目链接:[*https://summer-ospp.ac.cn/org/orgdetail/f0813e66-fa19-4302-a3...) MOSN Go、HTTP、Security 我的项目社区导师:罗泽轩 mailto:spacewanderlzx@gmail.com 基于 Coraza 和 MOSN on Envoy 开发 Envoy 的 WAF 插件 项目编号:23f080212 我的项目难度:进阶/Advanced Coraza 是一个用 Go 实现的 WAF 引擎,咱们心愿可能借助 MOSN on Envoy 的能力,让 Coraza 运行在 Envoy 当中,并与官网的基于 Wasm 的实现 (https://github.com/corazawaf/coraza-proxy-wasm) 进行比拟。 ...

May 9, 2023 · 1 min · jiezi

关于javascript:基于-React-Flow-与-Web-Audio-API-的音频应用开发

明天咱们来学习通过 React Flow 和 Web Audio API 来创立一个可交互的语音广场。咱们将会从最小的场景开始,在学习 React Flow(包含:状态治理,实现自定义节点,增加交互能力) 之前,咱们会先学习 Web Audio API。 这个教程会一步一步地带你欠缺这个利用,当然你也能够跳过两头的一些步骤。但如果你是一名老手,还是倡议你从头到尾按程序看完。 Web Audio API让咱们来看一些 Web Audio API 。以下的高亮是你须要晓得的知识点: Web Audio API 提供了许多不同的音频节点,包含:音频源(比方: OscillatorNode 和 MediaElementAudioSourceNode ),音频成果(比方:GainNode, DelayNode , ConvolverNode )输入(比方:AudioDestinationNode)音频节点能够相互连贯在一起来造成一个「图」,咱们个别称之为「音源解决图」或者「信号图」或者「信号链」音频解决在原生代码中是在一个独自的过程中解决的,这就意味着即便主线程正在忙于解决其余的工作,咱们也能够继续进行音频工作解决AudioContext 充当音频解决图的大脑。 咱们能够应用它来创立新的音频节点并进行暂停或复原音频解决。你好,声音让咱们看看这些货色的一些理论利用并构建咱们的第一个网络音频应用程序!咱们临时不会做太简单的事件:咱们将制作一个简略的鼠标电子琴。咱们将应用 React 来解决这些示例,并应用 vite 来打包和热更新 当然,你也能够应用其余的打包工具比方 parcel 或者 CRA ,也能够应用 Typescript 来替换 Javascript 。为了让利用足够的简略,咱们临时都不应用他们,然而 React Flow 是类型残缺的(齐全由 Typescript 编写)。 npm create vite@latest// Project name: audio-hello// Select a framework: › React// Select a variant: › JavaScriptVite 会为咱们创立一个简略的 React 利用,但咱们能够删掉一些不须要的资源。跳转到 App.jsx ,删掉默认创立的组件内容,创立一个新的 AudioContext 并将咱们须要的节点放在一起。咱们须要一个 OscillatorNode 来生成一些音调和一个 GainNode 来管制音量。 ...

May 9, 2023 · 9 min · jiezi

关于javascript:Typescript-基本使用汇总

// 定义根本数据类型let str: string = 'title';let num: number = 20;let bool: boolean = true;let obj: null = null;let undef: undefined = undefined;// 定义联结类型let l: number | string;l = 100;l = 'title';// 定义任意类型let any_temp: any;any_temp = [];any_temp = '任意类型';// 数组类型let arr1: number[] = [1, 2, 3, 4];let arr2: string[] = ['a', 'b', 'c', 'd'];let arr3: any[] = [1, 'a', null];// 数组泛型let arr4: Array<number> = [1, 2, 3, 4];let arr5: Array<string> = ['a', 'b', 'c', 'd'];let arr6: Array<number | string> = [1, 'a', 'xxx'];// 定义对象类型// 定义对象类型之前须要定义好对应的接口interface Person { name: string, date: string, sex: string, age?: number, // 可选属性 [propName: string]: any //任意属性}let person: Person = { name: 'lk', date: '2012-12-12', sex: '男', age: 12, action: (): void => { console.log('你好!'); }}person.height = '168cm';person.weight = '52kg';// 定义函数:输出类型,输入类型function s1(x: number, y: number): number { return x + y;}s1(1, 2);function s2(x: number, y?: number): number { // y为可选参数 if (y) { return x + y; } else { retun x; }}s2(1);s2(2,3);// 泛型的应用// 泛型的概率:在定义函数、类、接口时不指定类型,在应用的时候才指定类型的一种个性;function s3<T>(x: T, y: T): T{ return x + y;}s3<number>(1, 3);

May 9, 2023 · 1 min · jiezi

关于javascript:dayjs备忘录

day.js备忘录如何显示上午/下午import dayjs from 'dayjs';require('dayjs/locale/zh-cn');dayjs().locale('zh-cn').format('MM月DD日 A h:mm');

May 9, 2023 · 1 min · jiezi

关于javascript:如何利用Layui实现导航栏点击高亮效果

最近我正在开发 OneNav,心愿实现左侧导航栏的主动高亮性能,以晋升用户体验。我应用了 ChatGPT 轻松地实现了这个小性能。 OneNav后盾应用了Layui组件,因而这个办法实用于所有应用Layui组件的场合。 Layui中导航栏点击高亮这是OneNav中原始的导航栏代码,应用的a标签进行链接跳转,每次点击的时候都会跳转到新的页面。 <ul class="layui-nav layui-nav-tree" lay-filter="test"> <li class="layui-nav-item layui-nav-itemed"> <a class="" href="javascript:;">链接治理</a> <dl class="layui-nav-child"> <dd><a href="/index.php?c=admin&page=link_list">我的链接</a></dd> <dd><a href="/index.php?c=admin&page=add_link">增加链接</a></dd> <dd><a href="/index.php?c=admin&page=imp_link">书签导入</a></dd> <dd><a href="/index.php?c=admin&page=setting/share">书签分享</a></dd> </dl> </li> </ul>Layui中,如果要实现某个菜单高亮,只须要加上layui-this这个类即可。 于是我将上述代码给到了ChatGPT,并通知他点击高亮只须要增加现有的layui-this类,最终给出的代码如下: <script> $(document).ready(function() { // 获取以后页面的 URL var currentUrl = window.location.href; // 遍历导航栏菜单的子菜单项 $('.layui-nav-child dd a').each(function() { var $this = $(this); var linkUrl = $this.attr('href'); // 如果子菜单项的链接与以后页面的 URL 匹配,则为该子菜单项增加 'layui-this' 类 if (currentUrl.indexOf(linkUrl) !== -1) { // 移除其余菜单项的 'layui-this' 类 $('.layui-nav-child dd').removeClass('layui-this'); // 为匹配的子菜单项增加 'layui-this' 类 $this.parent().addClass('layui-this'); // 完结遍历 return false; } }); });</script>这段代码首先在文档加载实现后获取以后页面的 URL。而后,它遍历所有导航栏菜单的子菜单项,查看子菜单项的链接是否与以后页面的 URL 匹配。如果匹配,它将移除其余子菜单项的 'layui-this' 类,而后为匹配的子菜单项增加 'layui-this' 类。这样,当页面加载时,相应的菜单项将会被高亮显示。 ...

May 9, 2023 · 1 min · jiezi

关于javascript:HTML5CSS3JS实现动态时钟

HTML5+CSS3+JS实现动静时钟利用HTML5+CSS3+JS实现简略的钟表,仅供参考学习效果图: 在线成果预览 思路: 1. 先定义一个类名为timepiece的圆表表盘 HTML: <div class="timepiece"> </div>CSS: .timepiece { position: relative; width: 401px; height: 401px; border: 1px solid #333; border-radius: 50%; margin: 0 auto; }2. 定义一类名为constantly的ul标签来放li用来做钟表的时刻 HTML: <div class="timepiece"> <!-- 钟表的刻度 --> <ul class="constantly"></ul> </div>3. 利用JS来生成工夫刻度并增加相应的款式类名 CSS: /* 所有时刻的款式类名 */.constantly .li { position: absolute; left: 50%; top: 0; transform: translate(-50%); width: 1px; height: 9px; background-color: #333; transform-origin: center 200px; }/* 每个小时的时刻款式 */.constantly .lip { width: 3px; height: 12px; }JS: ...

May 9, 2023 · 2 min · jiezi

关于javascript:Angular之父为什么怼React

大家好,我卡颂。 前几天,Angular之父Miško Hevery和Dan在推上产生了一段乏味的对话,对话背景大略是: 传统SSR(服务端渲染)场景下应用的技术叫Hydration,Miško曾向Dan演示了一个新技术概念 —— ResumableDan认为这项技术不可行 Miško在Qwik框架中实现了ResumableDan示意在React中咱们之所以没有思考Resumable,并不是因为框架不好接入,而是因为Resumable并不是更优解 Miško示意这是吃不到葡萄说葡萄酸 那么,Resumable到底是什么技术?他和React在推动的RSC(React Server Component)有什么区别?Miško为什么会作出上述舆论? 让咱们通过本文理解一下。 欢送退出人类高质量前端交换群,带飞 Resumable(复原)是什么Resumable的概念源于一次思路的转变。 尽管支流前端框架都反对SSR,但不论是React、Vue还是Angular,他们都是CSR(客户端渲染)优先。 在这些框架中,SSR是在CSR的根底上附加的新性能。 正是因为传统前端框架都是CSR优先的产物,才导致一些常见SSR问题,比方: 首屏渲染时,页面短时间无奈响应交互,因为此时框架还未hydrate实现即便仅有局部内容须要交互,但整个页面还得全量hydrate这些问题拉低了SSR场景下的FCP(First Contentful Paint)与TTI指标(time to interactive)。 下图展现了SSR场景下hydrate的流程,包含4个步骤,只有在整个流程实现后利用能力响应交互: 下载HTML下载所有JS文件解析、执行JS文件(次要是框架及其依赖,还有业务逻辑代码)绑定事件(即hydrate操作) 在某些利用场景(比方电商、博客)下,除了第一步,其余步骤可能不是必须的。 比方,对于一个电商商品详情页,除了展现商品所需的HTML外,其余都不是首屏渲染所必须的。 这就是Qwik框架中Resumable技术的设计理念 —— HTML优先,JS按需下载: 要实现Resumable,须要摈弃传统框架以CSR为根底(用JS生成HTML为主)的思路,转而以SSR为根底(以服务端生成HTML为主),再在此基础上附加CSR性能。 为什么叫Resumable?Resumable的理念概括起来就是按需下载、执行JS。 所有JS代码的下载及运行会提早到须要的时候再执行。在如下官网示例1中,会渲染一个按钮,按钮的点击回调对应代码不会在首屏渲染时下载: export default component$(() => { return ( <button onClick$={() => { // 这部分代码不会在首屏渲染时下载 console.log('click'); const div = document.querySelector('#container')! as HTMLElement; div.style.background = 'yellow'; }} > 执行 </button> );});只有在点击按钮时,对应代码才会被下载并执行: 这就使得首屏渲染时须要下载及执行的JS文件大大减少,进步了FCP及TTI指标。 实际上,如果以Chrome lighthouse的评分作为评判根据,其余框架的确都难以望Qwik的项背这项技术之所以叫Resumable(复原),是因为它与传统Hydration技术在首屏渲染时客户端逻辑的区别。 传统Hydration技术在首屏渲染时,客户端(比方浏览器)会全量执行框架代码与业务逻辑代码,并在此过程中实现: 框架组件对应的树状数据结构初始化(比方在React中叫Fiber树,在Vue中叫VNode树)组件内状态初始化事件绑定而以上过程在Resumable技术中是产生在服务端的。比方,对于上述按钮的例子,点击回调对应的下述代码会在服务端生成HTML时实现序列化: onClick$={() => { console.log('click'); const div = document.querySelector('#container')! as HTMLElement; div.style.background = 'yellow';}}序列化后的数据会以HTML属性的模式存在: ...

May 9, 2023 · 1 min · jiezi

关于javascript:开源项目智慧软件园江苏某软件园数字孪生可视化项目开源工程及源码

数字孪生——智慧软件园,工程和源码收费赠送!一场数字反动即将来临! 我的项目介绍智慧软件园是一个全新的数字孪生我的项目,通过歪斜摄影技术克隆软件园三维场景,综合利用现代化技术手段,实现全方位的智能化治理服务。当初,咱们的我的项目凋谢工程和源码,收费赠送,期待与您的单干!智慧软件园,是一项数字孪生我的项目,将歪斜摄影技术与软件园治理相结合, 通过实时高精度的数据和场景纠正,合成一张实景图,实现疾速精确的地图定位和导航。 功能分析智慧软件园的性能次要包含园区监控、企业人才、供电系统、守法抓拍等模块。具体介绍如下: 园区监控通过数字孪生建模技术,实现对园区内所有监控点位的全景展现,让整个园区实现无死角可视化,实时监控园区平安。 企业人才展现园区内所有楼层的企业与人才详情,让企业间共享人才资源,激发翻新生机,进步企业的竞争力。 供电系统可视化展现园区供电系统的网络结构,实时监测与治理,进步供电效率和可靠性,同时为园区能源节约奉献一份力量。 守法抓拍 实时监测车辆违规行为,对违规车辆进行抓拍,及时发现隐患并追责解决,实现园区治安的精准保护。能无效进步园区的安全级别,保障员工和企业的利益。 数字孪生,是将来数字经济的重要组成,智慧软件园的推出不仅代表着技术的变革,更代表着产业的提高。让咱们携手共建智慧软件园,发明更美妙的今天!须要源码请一键三连,私聊【源码】

May 9, 2023 · 1 min · jiezi

关于javascript:Markedjs让您的文档编辑更加轻松自如

低代码利用平台——kintone既能够保留更改记录,也有流程治理的性能,在公司外部分享会议记录啊、wiki等文档或学习材料等时十分的便当。 kintone还有丰盛的文本编辑框,能够对内容进行编辑进步易读性。然而还是有不少人感觉如果可能应用Markdown编辑,将更加轻松,文本也将更加好看。※特地受程序员的欢送:) 这次就向大家介绍如何应用Cybozu CDN中的marked来让kintone利用也能够应用Markdown。 一、Markdown是什么?Markdown是用于编写文章或笔记等内容的标记语言。依据其规定的标记规定来编写后,能够显示题目、粗体字、斜体字等成果。  题目1 题目2 题目3- 列表1    - 列表2            - 列表3对于标记规定请参考以下链接。Markdown 使用指南 - 根底语法 - 链滴 二、在会议记录的利用里增加Markdown性能接下来咱们试着在会议记录利用里增加Markdown的性能。而后在多行文本框字段中用Markdown来编辑会议记录,保留后在详情页面的空白栏字段里显示编辑成果。 1、对于空白栏字段空白栏字段在JavaScript自定义时常用于搁置按钮等元素。表单中可增加的字段(空白栏) 2、筹备利用利用的表单里设置如下。其实用到的只有“内容”字段和“markdown-display”的空白栏字段,其余的任意设置。(为了便于了解,这里字段名称和字段代码设为雷同内容) 3、JavaScript自定义1. 导入marked在JavaScript自定义页面导入marked。用的是后面提到的Cybouzu CDN。https://js.cybozu.cn/markedjs/v0.3.5/marked.min.js 2. 编辑JavaScript接下来用JavaScript进行自定义。marked自身像上面这样用起来十分的简略。1 marked(字符串);联合利用的字段,代码如下。 (function() {    "use strict";    kintone.events.on("app.record.detail.show", function(event) {        var record = event.record;        // 获取空白栏字段        var spaceEl = kintone.app.record.getSpaceElement('markdown-display');         // 在空白栏字段中显示markdown的内容        spaceEl.innerHTML = marked(record['内容'].value);        // 因为内容反复显示,因而把内容字段暗藏。        kintone.app.record.setFieldShown('内容', false);        return event;    });})(); 3. 筹备CSS本次应用github-markdown-css。您也能够抉择其余的CSS,也能够间接用这个。将下载下来的文件上传到kintone设置页面。github-markdown-css不是用于整个body,而是markdown-body类,十分的不便。 CSS加完后成果显示如下。 最初一结尾咱们就提到了kintone用于保留和分享公司外部文档上十分的便当,再加上Markdown的话就更加锦上添花了。请务必亲自尝试一下。 更多利用请查看:开发者网站---Marked.js 

May 8, 2023 · 1 min · jiezi

关于javascript:答题积分小程序云开发实战接口联调篇积分排名页实现积分由高到低排名功能

微信小程序云开发实战-答题积分赛小程序 接口联调篇:积分排名页实现积分由高到低排名性能我的项目技术栈微信原生小程序+云开发。为什么抉择微信原生小程序进行开发呢?因为可能间接利用它的云开发能力吖。我这里次要应用了云开发能力中的小程序端SDK,说白了就是在javascript中就能间接操作数据库。 业务需要答题小程序中的网络安全常识竞答流动,每人每天答题机会不限次数,积分由高到低进行排名。奖项设一等奖2名、二等奖5名、三等奖10名、优秀奖20名。所以须要借助实现积分排行榜来实现这个业务需要。 技术要点1、Collection指数据库汇合援用。2、Collection.where(condition: Object): Collection指定查问条件,返回带新查问条件的新的汇合援用。3、Collection.orderBy(fieldPath: string, string: order): Collection1)指定查问排序条件。2)order 只能取 asc 或 desc。3)同时也反对按多个字段排序,屡次调用 orderBy 即可,多字段排序时的程序会依照 orderBy 调用程序先后对多个字段排序。4、Collection.get(): Promise<Object>1)获取汇合数据,或获取依据查问条件筛选后的汇合数据。2)小程序端:如果没有指定 limit,则默认且最多取 20 条记录。3)小程序端兼容 Callback 格调调用。 要害代码积分排行榜实现,按答题积分totalScore字段进行排降序,也就是totalScore越大越靠前。 getRankList() { // 连贯云数据库 const db = wx.cloud.database(); // 获取汇合的援用 const user = db.collection('user'); // 数据库操作符 const _ = db.command; // 数据库汇合的查问操作实例 user .where({ // 依据条件过滤文档 totalScore: _.exists(true) }) .orderBy('totalScore', 'desc') // 指定查问排序条件,totalScore按降序排序 .get() // 操作定义实现,相似发动ajax异步申请 .then(res => { // 获取汇合数据,或获取依据查问条件筛选后的汇合数据。 let data = res.data || []; // 将数据从逻辑层发送到视图层,艰深的说,也就是更新数据到页面展现 this.setData({ rankList:data }); }) },实现后果 ...

May 8, 2023 · 1 min · jiezi

关于javascript:js类型转换truthy和falsy

JavaScript 在须要用到布尔类型值的上下文中应用强制类型转换(Type Conversion )将值转换为布尔值,比方:在条件语句或者循环语句中 falsy 值阐明falsefalse 关键字0数值 zero-0负 zero0n当 BigInt 作为布尔值应用时,听从其作为数值的规定。0n 是 falsy 值。"", '', ``这是一个空字符串 (字符串的长度为零). JavaScript 中的字符串可用双引号 "", 单引号 '', 或 模板字面量 `` 定义。nullnullundefinedundefinedNaNNaNtruthy 除了falsy以外的所有值都是truthy,包含空数组、空对象这里要辨别非严格相等==的类型转换,比方:Boolean([]) === true // []显著是truthy真值然而 [] == false // true 步骤如下:合乎一个操作数是对象,另一个是根本类型的条件 1.@@toPrimitive()拿到[]原始值,就是[]自身2.valueOf()[].valueOf(), // 返回[]3.toString() [].toString() // 返回''4.'' == false,进入根本类型的比拟环节 如果其中一个操作数是布尔型而另一个不是,则将布尔型转换为数字:true 转换为 1,false 转换为 0。而后再次松散地比拟两个操作数。 5.第五步,布尔类型false转为0应用与 Number() 构造函数雷同的算法将字符串转换为数字。6.第六步,Number()转换数组类型转换后的值''为07.最初一步,0 == 0,返回true[].valueOf().toString() == false // true

May 8, 2023 · 1 min · jiezi

关于javascript:职业建议辞职时提前通知很重要

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug. 这篇文章探讨了辞职时提前告诉的益处。文章指出,通常状况下,提前两周告诉是辞职时的黄金规范。然而,提前更长时间告诉实际上有很多益处。通常,这样做能够让你在工作中只做本人最喜爱的局部,加重大部分压力,薪水不变,还能缩短福利工夫。这些益处使得辞职前的过渡期更加顺利。 另一方面,在某些状况下,提前告诉辞职可能导致雇主立刻辞退员工。因而,在决定提前多长时间告诉辞职时,须要权衡利弊。总之,只管提前辞职告诉可能会带来一些益处,但在实际操作中,员工须要依据本人的理论状况和公司文化来判断。 注释开始 两周告诉是辞职时的黄金规范。但实际上,提前更多工夫告诉(比方很多工夫)有很多益处。通常,你能够: 只做你最喜爱的工作局部加重工作压力取得雷同的薪水缩短福利工夫应用未休的假期减少股票收益取得奖金以踊跃的形式来到受到大家的感激和赞叹最初一点并非玩笑。如果你是一名在公司有良好名誉的称职软件工程师,提前多于两周的告诉通常对所有相干人员都是无利的。每个人都会感激和赞叹你,因为你真的在帮忙他们 为什么任何公司会批准这样做?通常须要批准缩短告诉期的人是工程师的经理,可能还有人力资源部。然而,如果你的经理真的心愿你留下来,人力资源部不会进行否决。让你留在公司更长时间对你的经理来说有很多益处。 首先,这是纯利润。让你留下来对你的经理来说没有任何老本。你的经理不领取你的薪水或福利。你的辞职曾经让你的经理在下次绩效评估时取得了一张收费出狱卡。如果他/她没有达到某个重要的里程碑或满足某个要害指标,他/她只须要说“要害工程师X的到职的确打乱了咱们的打算”,没有人会嗔怪他/她。无论你是否多留一段时间,这种状况都实用。在抉择领有更多有能力的工程师小时数和更少的小时数之间,没有更多的工夫老本,对于经理来说,这是一个毫无疑问的抉择。 即便你的经理必须在让你留下更长时间和立刻雇佣一名新工程师之间做抉择,状况也是如此。你绝对于替代品的价值是微小的。很容易,你当初对那个经理来说比他/她能雇佣的任何新工程师更有价值。即便你过得轻松,没有致力工作,任何新工程师不仅不会为团队减少价值,实际上还会升高团队的生产力。 其次,这有助于更顺利地过渡。你的经理能够布局事件,而不是急于寻找接手你我的项目的人,也不是将其他人从其余重要工作中抽调进去或让他们负担过重。其余工程师能够调配到团队,不太重要的我的项目能够逐步进行。你的经理能够争取更多资源,放弃团队衰弱,而不是要求接手你我的项目的工程师在极短的工夫内取得背景和能力,给他们带来压力甚至可能导致他们疲劳。 第三,这是一种很好的危险缓解策略。你是否对某件事有独特的理解,但没有人(包含你本人)意识到?你的经理只有在你的工作交接后才会发现。你是否有独特的资格来点燃一场突发的危机?只有在零碎由一群非你的人来运行时能力晓得。让你以无限的能力留下来,就像是一个安全网,能够显著升高这些危险。 有人通知我,他们放心如果给出更长时间的告诉,他们会面临被辞退的危险。他们放心公司会把他们视为“搭便车者”或“无用之重”,并试图削减老本。 但这简直必定不会产生。首先,这不是事实:让你留下来对做决策的人来说十分有价值(参见上文)。其次,员工常常低估辞退员工的老本。如果公司要求你在你想进行工作之前进行工作,那么他们就是在辞退你,这通常意味着他们必须向你领取赔偿金,这简直必定比让你留下来的工夫更低廉。 你能够提前多久告诉?这取决于很多因素: 你对团队/公司/经理的价值(价值越高 —> 告诉期越长)你手头正在进行的工作(工作越重要 —> 告诉期越长)你的资格(资格越高 —> 告诉期越长)公司的财务状况(财务状况越好 —> 告诉期越长)等等仅提供几个数据点:在一家大型(7000+人)的硅谷科技公司,我提前近3个月告诉到职;在一家小型(75人)的数字媒体公司,我提前大概1.5个月告诉到职。在这两种状况下,他们都表示感激,而且我可能还能够提前更久告诉。 对于你的下一份工作?通常倡议在仍在工作时寻找新工作。这会让你在会谈薪资和福利时处于更无利的位置。然而大多数时候,新雇主心愿你尽快开始工作。那么,如果你的新工作心愿你立即开始,你如何在当前工作中提前很长时间告诉呢? 简略地说:你不能。 这是你在抉择下一份工作时应该会谈的事件。只需通知他们,你不喜爱让人陷入困境,你须要一些工夫来无效地交接你的我的项目。他们应该了解。事实上,他们应该把这看作是一个好兆头:你是一个坏蛋。你看待到职公司的礼貌很可能就是你看待他们的礼貌。如果他们不了解并且必须立即要求你退出,那么这就是一个警示信号。很可能这是一个你不想为之工作的公司,这样的公司会把人逼得太紧。 然而,大多数公司对于推延某人的入职日期并没有问题。人们经常说他们须要劳动一段时间,或者曾经打算好了度假,或者须要安顿新的出行/托儿安顿等等。我亲眼目睹过几十个人在签订offer信之后一个多月才开始工作。公司常常推延入职日期。 如何为此进行谈判人们通常在与潜在雇主会谈时,会利用本人现有的雇主/薪资作为筹码。然而,许多人没有意识到的是,你实际上能够反过来,利用你的下一份工作来与现有雇主会谈一个更无利的到职条件。 首先,当你与经理进行谈话时,要亲自进行——或者至多是通过视频通话。做一个有人情味的人,进行一次对话。我再强调一遍:要让这件事胜利,你须要让你的经理站在你这边。 你能够与经理开始这样的对话:“我思考了很多,我决定是时候来到了。”把事件摊在桌面上。给你的经理一个机会去思考和理解失去你意味着什么。而后廓清:“我并不焦急,我也不想把你或者团队留在一个蹩脚的地步。”松了口气。每个人都松了口气。很好。 你的经理会问你接下来要做什么。“我将在X公司从事Y工作,但我已要求在((将来某个较远的日期))开始工作,以便我先在这里交接工作。”好吧,这还有一段时间,人们通常不会这样做。但这是如许善意的行动!你的经理甚至可能会感觉你太好了:“哦,这太好了,但你不用这样做。”你能够诚恳地说:“谢谢,但我违心。” 请记住,你当初依然处于一个十分无利的会谈位置。你总是能够回到X公司,通知他们,其实你能够在2周后开始工作。每个人都晓得X公司会承受你的提议。你当初的公司和经理是惟一在你这样做的状况下真正输的一方。 最初,以示意你心愿持续探讨事件并制订一个具体的到职打算来完结对话。这会给你的经理一些思考的工夫,他/她可能反正也想要这样的工夫,并开始启动到职流程。很可能会告诉人力资源部等等。 你下次与经理的谈话可能是一个好时机,让你更具体地论述你想要的内容。例如: 在我剩下的工夫里,我想专一于高杠杆工作:移交我的项目、培训工程师以及传递状态/上下文。我认为加入冲刺会议、值班或进行技术面试或者((其余你不喜爱做的事件))对我来说没有价值。我还想休一下累积的假期。 不要过分,但也不要保留。你的经理想要让这个过程顺利进行,即便不能达成共识,你依然处于无利位置。要自信。你会诧异地发现他们批准了什么。 如果有人(我指的是你,人力资源部门)对此提出反驳,能够让他们找你的经理。解释说你是与经理独特商议这些细节的,你只是想让到职对团队影响尽量小。应用“分阶段退出打算”这个词。你要让他们明确这不是零和游戏,你并没有试图疾速达成协议。通知他们你对达成解决方案充满信心,并示意违心放弃灵便。 如果看起来你只是在推延问题,那你齐全是对的。有时人们对缩短告诉工夫产生负面的直觉反应——因为这不合乎商业常规——但放弃灵便能够缓解局势,当他们认真思考时,通常会承受。 例如,我已经遇到过人力资源部门拥护我在到职前休假。这违反了公司政策。我通知他们我对咱们能解决问题放弃乐观,他们与我的经理进行了沟通,我的经理明确示意尽可能长时间留住我是有帮忙的,我调整了休假的日期以合乎政策要求(我依然休了全副假期),最初大家都很称心。 注意事项这种办法在以下状况下有效: 你的经理不反对这个(我曾经说过了吗?)你的经理不器重你你是一个不称职/懈怠的工程师,他人不想要你留在四周你是一个须要领导的十分高级的工程师你只在公司呆了几个月你失去了负面的绩效评价你的名誉不佳你连累了团队你行将退出竞争对手如果呈现了任何这些状况,请不要尝试这种办法。它不会起作用。 如果你到职是为了退出竞争对手,没有人会心愿你持续留在公司。实际上,他们很可能会通知你两周曾经足够了,而且你不须要在那段时间工作,当初就交出你的笔记本电脑,他们会把你从Slack零碎里锁定。 然而,如果你做得正确,缩短告诉期对所有参加的人来说可能是一件十分好的事件。 代码部署后可能存在的BUG没法实时晓得,预先为了解决这些BUG,花了大量的工夫进行log 调试,这边顺便给大家举荐一个好用的BUG监控工具 Fundebug。 原文:https://davidlaprade.github.io/give-a-lot-of-notice 交换有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

May 8, 2023 · 1 min · jiezi

关于javascript:JavaScript中的四种枚举方式

字符串和数字具备无数个值,而其余类型如布尔值则是无限的汇合。 一周的日子(星期一,星期二,...,星期日),一年的节令(夏季,秋季,冬季,秋季)和根本方向(北,东,南,西)都是具备无限值汇合的例子。 当一个变量有一个来自无限的预约义常量的值时,应用枚举是很不便的。枚举使你不用应用魔法数字和字符串(这被认为是一种反模式)。 让咱们看看在JavaScript中创立枚举的四种好办法(及其优缺点)。 基于对象的枚举枚举是一种数据结构,它定义了一个无限的具名常量集。每个常量都能够通过其名称来拜访。 让咱们来思考一件T恤衫的尺寸:Small,Medium,和Large。 在JavaScript中创立枚举的一个简略办法(尽管不是最现实的)是应用一个一般的JavaScript对象。 const Sizes = { Small: 'small', Medium: 'medium', Large: 'large',}const mySize = Sizes.Mediumconsole.log(mySize === Sizes.Medium) // logs trueSizes是一个基于JavaScript对象的枚举,它有三个具名常量:Sizes.Small、Sizes.Medium以及Sizes.Large。 Sizes也是一个字符串枚举,因为具名常量的值是字符串:'small' ,'medium',以及 'large'。 要拜访具名常量值,请应用属性拜访器。例如,Sizes.Medium的值是'medium'。 枚举的可读性更强,更明确,并打消了对魔法字符串或数字的应用。 优缺点一般的对象枚举之所以吸引人,是因为它很简略:只有定义一个带有键和值的对象,枚举就能够了。 然而在一个大的代码库中,有人可能会意外地批改枚举对象,这将影响应用程序的运行。 const Sizes = { Small: 'small', Medium: 'medium', Large: 'large',}const size1 = Sizes.Mediumconst size2 = Sizes.Medium = 'foo' // Changed!console.log(size1 === Sizes.Medium) // logs falseSizes.Medium 枚举值被意外地扭转。 size1,尽管被初始化为Sizes.Medium,但不再等同于Sizes.Medium! 一般对象的实现没有受到爱护,因而无奈防止这种意外的扭转。 让咱们认真看看字符串和symbol枚举。以及如何解冻枚举对象以防止意外扭转的问题。 枚举值类型除了字符串类型,枚举值能够是一个数字: const Sizes = { Small: 0, Medium: 1, Large: 2}const mySize = Sizes.Mediumconsole.log(mySize === Sizes.Medium) // logs true上述例子中,Sizes枚举是数值枚举,因为值都是数字:0,1,2。 ...

May 8, 2023 · 3 min · jiezi

关于javascript:关于Javascript-隐式类型转换篇

一、两种数据类型:根本类型、援用类型根本类型:String、 Boolean、Number、Undefined、Null、Symbol、 BigInt 援用类型:Array、Object、Function 二、根底类型的转换:1、数字加字符串,变字符串var num = 1 + '2'; //只有有string类型的,原始值转化字符串toString()操作,进行字符串拼接2、数字 减 乘 除 大于 小于 字符串,字符串转数字如果字符串是纯数字或空字符串或16进制则转成数字,否则NaN var num = 12 - '3'; //9 数字var num = 12 / '3'; //4 数字var num = 12 * '3'; //36 数字var num = 12 - '3a'; //NaN 字符串转NaN 数字-NaN 等于NaNvar bo = 12 > '3'; //true 字符串3转数字 再比拟var bo = 12 > '3a'; //false 字符串转NaN 比拟不成立谬误三、援用类型的转换:先把援用类型转根底类型再依照根底类型的形式比拟。如果是Date类型的PreferredType被设置为String ,其余PreferredType被设置为Number 1、PreferredType为Number 先valueOf()再toString()1 输出的值是原始值, 则间接返回原始值2 否则调用对象的valueOf()办法,如果valueOf()办法的返回值是原始值,则返回这个原始值。3 否则调用对象的toString()办法, 如果toString()办法的返回值是原始值,则返回这个原始值。4 否则 抛出TypeError异样2、PreferredType为String 先toString()再valueOf()1 输出的值是原始值,则间接返回原始值2 否则调用对象的toString()办法,如果toString()办法返回值是原始值,则返回这个原始值。3 否则调用valueOf()办法,如果valueOf()办法的返回值是原始值,则返回这个原始值。4 否则 抛出TypeError异样 局部例子:console.log([] + []); //'' (空字符串)//1 []以Number为转换规范, valueOf() 失去的仍然是[]//2 [] toString 失去 ''// '' + '' 失去 console.log([] + {}); // '[object Object]'//1 []以Number转换规范, valueOf() > toString() 失去 ''//2 {}以Number转换规范, valueOf()失去{} > toSting() 失去 '[object Object]'//两边字符串凭借失去'[object Object]’console.log({} + {}); //'[object Object][object Object]'//1 {}以Number转换规范, valueOf()失去{} > toSting() 失去 '[object Object]’//两边字符串凭借失去'[object Object][object Object]’var a = 'hello ', b = {};console.log( a + b ); // ‘hello [object Object]’//1 a是原始类型 间接返回//2 {}以Number转换规范, valueOf()失去{} > toSting() 失去 '[object Object]’//3 'hello ' + '[object Object]'四、无关==的隐式转换规定 1:NaN和其余任何类型比拟都是false(包含和他本人)NaN == NaN // false规定 2:Boolean和其余任何类型比拟,Boolean首先转成Numbertrue == 1 // true true == '2' // false, 先把 true 变成 1 再比拟true == ['1'] // true, 先把 true 变成 1, ['1']拆箱成 '1', undefined == false // false ,首先 false 变成 0,而后参考规定4null == false // false,同上规定 3:String和Number比拟,String转成Number类型123 == '123' // true, '123' 会先变成 123'' == 0 // true, '' 会首先变成 0‘0’ == false // true 两者转数字规定 4:null == undefined是true,除此之外,null、undefined和其余任何后果比拟都为falsenull == undefined // truenull == '' // falsenull == 0 // falsenull == false // falseundefined == '' // falseundefined == 0 // falseundefined == false // false规定 5:原始类型和援用类型做比拟时,援用类型会按照ToPrimitive规定转换为原始类型再比拟'[object Object]' == {} // true, 对象和字符串比拟,对象通过 toString 失去一个根本类型值'1,2,3' == [1, 2, 3] // true, 同上 [1, 2, 3]通过 toString 失去一个根本类型值五、图示类型值转换 ...

May 7, 2023 · 2 min · jiezi

关于javascript:JavaScript-事件流

一、名称解释1、事件事件是文档或者浏览器窗口中产生的,特定的交互霎时。事件是用户或浏览器本身执行的某种动作,如click,load和mouseover等事件。事件是javaScript和DOM之间交互的桥梁。2、事件流事件产生时会在元素节点与根节点之间依照特定的程序流传,门路所通过的所有节点都会收到该事件,这个流传过程即DOM事件流。事件流包含三个阶段:事件捕捉阶段、处于指标阶段、事件冒泡阶段3、事件流模型事件流传的程序对应浏览器的两种事件流模型:捕捉型事件流和冒泡型事件流。冒泡型事件流:事件的流传是从最特定的事件指标到最不特定的事件指标。即从DOM树的叶子到根。捕捉型事件流:事件的流传是从最不特定的事件指标到最特定的事件指标。即从DOM树的根到叶子。ps. 事件捕捉阶段:理论指标(<div>)在捕捉阶段不会接管事件。也就是在捕捉阶段,事件从document到<html>再到<body>就进行了。上图中为1~3.处于指标阶段:事件在<div>上产生并解决。然而事件处理会被看成是冒泡阶段的一部分。冒泡阶段:事件又流传回文档。二、事件冒泡 vs 事件捕捉事件冒泡 和 事件捕捉 别离由 微软 和 网景 公司提出,起初 W3C 将两者联合,制订了对立的规范 —— 先捕捉再冒泡。在 JavaScript 中,addEventListener 办法用于向指定元素增加事件句柄。语法:element.addEventListener(event, function, useCapture)1、事件冒泡来看一段代码实例,思考运行后会打印出什么。 依据冒泡事件流模型由外向外的规定,会顺次弹出:click div -> click body -> click html -> click docuement2、事件捕捉将上一段代码中的 false 都改为 ture,则变为捕捉形式: 依据捕捉事件流模型由内向内的规定,会顺次弹出:click document -> click html -> click body -> click div3、事件冒泡&事件捕捉同时存在如果两种事件流模型同时存在会怎么展现呢? 准则:a.从外向内,捕捉后退,遇到捕捉事件立刻执行b.非 target 节点,先捕捉再冒泡c.target 节点,按代码书写程序执行(无论冒泡还是捕捉)因而会顺次弹出:click document -> click html -> click div -> click body4、阻止冒泡的办法----event.stopPropagation()办法 这是阻止事件的冒泡办法,不让事件向document上蔓延,然而默认事件依然会执行,当你调用这个办法的时候,如果点击一个连贯,这个连贯依然会被关上。5、阻止默认事件的办法---event.preventDefault()办法这是阻止默认事件的办法,调用此办法是,连贯不会被关上,然而会产生冒泡,冒泡会传递到上一层的父元素。举个栗子:看图谈话,在上面的空白处,无论我怎么点击右键,无论在什么地位点击,都会呈现默认框。如果咱们不想要这种默认的框怎么办呢? 6、return false这个办法比拟暴力,他会同时阻止事件冒泡也会阻止默认事件;写上此代码,链接不会被关上,事件也不会传递到上一层的父元素;能够了解为return false就等于同时调用了event.stopPropagation()和event.preventDefault()三、事件委托1.什么是事件委托?事件委托又名事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就能够治理某一类型的所有事件。举个栗子:班级收作业收作业有两种办法:一是谁写完了本人去交个老师。二是写完了对立交给班长,让班长交给老师,事实当中,咱们大都采纳第二种办法。这就能够了解为委托,无论是谁交给老师,目标只有一个就是作业可能失常上交。2.为什么要用委托?一般来说,dom须要有事件处理程序,咱们都会间接给它设事件处理程序就好了,那如果是很多的dom须要增加事件处理呢?比方咱们有100个li,每个li都有雷同的click点击事件,可能咱们会用for循环的办法,来遍历所有的li,而后给它们增加事件,那这么做会存在什么影响呢?在JavaScript中,增加到页面上的事件处理程序数量将间接关系到页面的整体运行性能,因为须要一直的与dom节点进行交互,拜访dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会缩短整个页面的交互就绪工夫,这就是为什么性能优化的次要思维之一就是缩小DOM操作的起因;如果要用事件委托,就会将所有的操作放到js程序外面,与dom的操作就只须要交互一次,这样就能大大的缩小与dom的交互次数,进步性能;每个函数都是一个对象,是对象就会占用内存,对象越多,内存占用率就越大,天然性能就越差了。比方下面的100个li,就要占用100个内存空间,如果是1000个,10000个呢,如果用事件委托,那么咱们就能够只对它的父级(如果只有一个父级)这一个对象进行操作,这样咱们就须要一个内存空间就够了,是不是省了很多,天然性能就会更好。3.事件委托原理事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,而后逐渐向上流传事件,举个栗子:页面上有这么一个节点树,div>ul>li>a;比方给最外面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行程序a>li>ul>div,有这样一个机制,那么咱们给最里面的div加点击事件,那么外面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。4.事件委托怎么实现? 当用事件委托的时候,基本就不须要去遍历元素的子节点,只须要给父级元素增加事件就好了,其余的都是在js外面的执行,这样能够大大的缩小dom操作。5.总结那什么样的事件能够用事件委托,什么样的事件不能够用呢?适宜用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress。值得注意的是,mouseover和mouseout尽管也有事件冒泡,然而解决它们的时候须要特地的留神,因为须要常常计算它们的地位,解决起来不太容易。不适宜的就有很多了,举个例子,mousemove,每次都要计算它的地位,十分不好把控,在不如说focus,blur之类的,自身就没用冒泡的个性,天然就不能用事件委托了。

May 7, 2023 · 1 min · jiezi

关于javascript:浅谈JS的运行机制

一、辨别过程和线程1、过程是cpu资源分配的最小单位(是能领有资源和独立运行的最小单位)2、线程是cpu调度的最小单位(线程是建设在过程的根底上的一次程序运行单位,一个过程中能够有多个线程)3、不同过程之间也能够通信,不过代价较大4、个别通用的叫法:单线程与多线程,都是指在一个过程内的单和多。(所以外围还是得属于一个过程才行) 二、浏览器都蕴含哪些过程咱们晓得:浏览器是多过程的,再来看看它到底蕴含哪些过程:(为了简化了解,仅列举次要过程) 1、Browser过程:浏览器的主过程(负责协调、主控),只有一个。负责浏览器界面显示,与用户交互。如后退,后退等负责各个页面的治理,创立和销毁其余过程将Renderer过程失去的内存中的Bitmap,绘制到用户界面上网络资源的治理,下载等 2、第三方插件过程:每种类型的插件对应一个过程,仅当应用该插件时才创立3、GPU过程:最多一个,用于3D绘制等4、浏览器渲染过程(浏览器内核)(Renderer过程,外部是多线程的):默认每个Tab页面一个过程,互不影响。次要作用为:页面渲染,脚本执行,事件处理等ps.在浏览器中关上一个网页相当于新起了一个过程(过程内有本人的多线程)当然,浏览器有时会将多个过程合并(譬如关上多个空白标签页后,会发现多个空白标签页被合并成了一个过程)。三、浏览器多过程的劣势相比于单过程浏览器,多过程有如下长处:1、防止单个page crash影响整个浏览器2、防止第三方插件crash影响整个浏览器3、多过程充分利用多核优势4、方便使用沙盒模型隔离插件等过程,进步浏览器稳定性 四、浏览器内核(渲染过程)对于一般的前端操作来说,最重要的是什么呢?答案是渲染过程。能够这样了解,页面的渲染,JS的执行,事件的循环,都在这个过程内进行。浏览器的渲染过程蕴含的线程(列举一些次要常驻线程): 1、GUI渲染线程负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。当界面须要重绘(Repaint)或因为某种操作引发回流(reflow)时,该线程就会执行留神,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被解冻了),GUI更新会被保留在一个队列中等到JS引擎闲暇时立刻被执行。 2、JS引擎线程也称为JS内核,负责解决Javascript脚本程序。(例如V8引擎)JS引擎线程负责解析Javascript脚本,运行代码。JS引擎始终期待着工作队列中工作的到来,而后加以解决,一个Tab页(renderer过程)中无论什么时候都只有一个JS线程在运行JS程序同样留神,GUI渲染线程与JS引擎线程是互斥的,所以如果JS执行的工夫过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。 3、事件触发线程归属于浏览器而不是JS引擎,用来管制事件循环(能够了解,JS引擎本人都忙不过来,须要浏览器另开线程帮助)当JS引擎执行代码块如setTimeOut时(也可来自浏览器内核的其余线程,如鼠标点击、AJAX异步申请等),会将对应工作增加到事件线程中当对应的事件合乎触发条件被触发时,该线程会把事件增加到待处理队列的队尾,期待JS引擎的解决留神,因为JS的单线程关系,所以这些待处理队列中的事件都得排队期待JS引擎解决(当JS引擎闲暇时才会去执行) 4、定时触发器线程传说中的setInterval与setTimeout所在线程浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的精确)因而通过独自线程来计时并触发定时(计时结束后,增加到事件队列中,期待JS引擎闲暇后执行)留神,W3C在HTML规范中规定,规定要求setTimeout中低于4ms的工夫距离算为4ms。 5、异步http申请线程在XMLHttpRequest连贯后是通过浏览器新开一个线程申请将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中,再由JavaScript引擎执行。 五、JS的运行机制JS分为同步工作和异步工作同步工作都在主线程上执行,造成一个执行栈主线程之外,事件触发线程治理着一个工作队列,只有异步工作有了运行后果,就在工作队列之中搁置一个事件。一旦执行栈中的所有同步工作执行结束(此时JS引擎闲暇),零碎就会读取工作队列,将可运行的异步工作增加到可执行栈中,开始执行。 macrotask(宏工作)与microtask(微工作)JS中分为两种工作类型:macrotask和microtask,在ECMAScript中,microtask称为jobs,macrotask可称为task。 1、macrotask(又称之为宏工作),能够了解是每次执行栈执行的代码就是一个宏工作(包含每次从事件队列中获取一个事件回调并放到执行栈中执行)每一个task会从头到尾将这个工作执行结束,不会执行其它浏览器为了可能使得JS外部task与DOM工作可能有序的执行,会在一个task执行完结后,在下一个 task 执行开始前,对页面进行从新渲染 2、microtask(又称为微工作),能够了解是在以后 task 执行完结后立刻执行的工作也就是说,在以后task工作后,下一个task之前,在渲染之前所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行结束(在渲染前) 3、别离什么样的场景会造成macrotask和microtask呢?macrotask:主代码块,setTimeout,setInterval等(能够看到,事件队列中的每一个事件都是一个macrotask)microtask:Promise,process.nextTick等 4、总结下运行机制:执行一个宏工作(栈中没有就从事件队列中获取)执行过程中如果遇到微工作,就将它增加到微工作的工作队列中宏工作执行结束后,立刻执行以后微工作队列中的所有微工作(顺次执行)以后宏工作执行结束,开始查看渲染,而后GUI线程接管渲染渲染结束后,JS线程持续接管,开始下一个宏工作(从事件队列中获取) 对于macrotask与microtask,举个栗子:console.log('script start');setTimeout(function() { console.log('setTimeout');}, 0);Promise.resolve().then(function() { console.log('promise1');}).then(function() { console.log('promise2');});console.log('script end');由上可知,正确执行程序是这样子的: script startscript endpromise1promise2setTimeout

May 7, 2023 · 1 min · jiezi

关于javascript:CSS变量用法及与js交互

浏览器反对状况次要浏览器根本反对,挪动端开发、混合开发、微信开发都能够思考。什么是CSS变量?CSS变量(CSS variables),官网称为CSS 自定义属性(CSS custom properties)。CSS变量和预处理器中的变量有什么不同?你可能曾经在CSS预处理器中尝试过应用变量而带来的益处了,比方Sass和Less。预处理器让你能设置变量,以及在函数、循环、数学计算等等中央中应用它们。这是否意味着CSS变量曾经无关紧要了呢?那可未必,次要是因为,CSS变量与预处理器中的变量其实是不同的货色。这些不同基于一个事实:CSS变量是浏览器中间接可用的CSS属性,而预处理中的变量是用于编译成惯例的CSS代码,浏览器其实对它们无所不知。这意味着,你能够在样式表中,在内联款式中,在SVG的标签中间接更新CSS变量,甚至能够在运行时用JavaScript间接批改它。而你是无奈对预处理器中的变量做下面这些操作的。CSS 变量提供了 JavaScript 与 CSS 通信的一种路径。不是说你必须要在两者间做出抉择:没有什么货色限度你,你能够同时应用CSS变量和预处理变量,并享有它们各自带来的微小益处。三、CSS变量用法1、变量的申明申明变量的时候,变量名后面要加两根连词线(--)。你可能会问,为什么抉择两根连词线(--)示意变量?因为$title-color被 Sass 用掉了,@title-color被 Less 用掉了。为了不产生抵触,官网的 CSS 变量就改用两根连词线了。变量名大小写敏感,--title-color和--Title-Color是两个不同变量。2、变量的读取var()函数用来读取变量,函数还能够应用第二个参数,示意变量的默认值。如果该变量不存在,就会应用这个默认值。var()函数还能够用在变量的申明。变量值只能用作属性值,不能用作属性名。3、变量值的类型如果变量值是一个字符串,能够与其余字符串拼接。如果变量值是数值,不能与数值单位间接连用。数值与单位间接写在一起,这是有效的。必须应用calc()函数,将它们连贯。如果变量值带有单位,就不能写成字符串。4、作用域全局变量 :root伪类能够看做是一个全局作用域,在外面申明的变量,他上面的所有选择器都能够拿到局部变量CSS变量的继承(就近准则)。同一个 CSS 变量,能够在多个选择器内申明。读取的时候,优先级最高的申明失效。这与 CSS 的"层叠"(cascade)规定是统一的。5、响应式布局CSS 是动静的,页面的任何变动,都会导致采纳的规定变动。利用这个特点,能够在响应式布局的media命令外面申明变量,使得不同的屏幕宽度有不同的变量值。6、兼容性解决对于不反对 CSS 变量的浏览器,能够采纳上面的写法,也能够应用@support命令进行检测。7、JavaScript 操作及与CSS变量的交互JavaScript 也能够检测浏览器是否反对 CSS 变量。JavaScript 能够操作 CSS 变量。JavaScript 能够将任意值存入样式表。上面是一个监听事件的例子,事件信息被存入 CSS 变量。对 CSS 无用的信息,也能够放入 CSS 变量,这意味着,能够把款式设置写在 CSS 变量中,让 JavaScript 读取。补充常识calc() 函数用于动静计算长度值。须要留神的是,运算符前后都须要保留一个空格,例如:width: calc(100% - 10px);任何长度值都能够应用calc()函数进行计算;calc()函数反对 "+", "-", "", "/" 运算;calc()函数应用规范的数学运算优先级规定;表达式中有“”和“/”时,其前后能够没有空格,但倡议留有空格。比如说“width:calc(50% + 10px)”,这样一来你就不必思考元素DIV的宽度值到底是多少,而把这个工作交由浏览器去计算。

May 7, 2023 · 1 min · jiezi

关于javascript:JSONstringify和JSONparse

咱们晓得,JSON.stringify() 和 JSON.parse() 是一对解决JSON数据的办法,前者是将JSON对象序列化为字符串,而后者是将JSON字符串解析为JSON对象。 然而你有较为深刻地去理解过它们吗?它们别离能够传入几个参数以及每个参数对应的作用是什么呢? 一、JSON.stringify()JSON.stringify() 办法能将一个 JavaScript 对象或值转换成一个 JSON 字符串,是用于调试的最常见函数。 //初始化一个 user 对象const user = { "name": "Mark Lee", "age":26}console.log(JSON.stringify(user));// 后果// "{"name":"Prateek Singh","age":26}"一般来说,开发人员应用 stringify 函数的场景较为广泛,就像下面做的那样。但我要通知你一些暗藏的机密,这些小机密会让你开发起来更加轻松。 JSON.stringify 根底语法JSON.stringify(value[, replacer [, space]])它能够传入三个参数,参数1 是须要字符串化的对象,参数2 是用于指定对象序列化过程中须要被解决的属性,参数3 是用于指定输入字符串的缩进格局。后两个参数是可选的,而咱们最罕用的就是只传一个参数。 第一个参数须要字符串化的对象,且该对象须是平安的JSON对象,而对于不平安的JSON对象都不能被失常序列化。 1、不平安的JSON对象何为不平安的JSON对象? undefined、function、symbol和蕴含循环的援用的对象都不合乎JSON构造规范,所以它们自身以及蕴含它们的对象都是不平安的JSON对象。 那么对于不平安的JSON对象,JSON.stringify()会如何解决它们呢? 1) undefined、function、symbol独自解决它们,间接返回undefined。 JSON.stringify(undefined); // undefinedJSON.stringify(function(){}); // undefinedJSON.stringify(Symbol()); // undefined蕴含它们的对象,主动将其疏忽。 JSON.stringify({a:1, b:undefined, c:function(){}, [Symbol()]:1}); // "{"a":1}"蕴含它们的数组,主动将其转成null JSON.stringify([1,undefined,function(){},Symbol()]); // "[1,null,null,null]"2) 蕴含循环援用的对象如果两个对象之间相互援用,造成一个有限循环,那么无论对其中的哪个对象进行JSON字符串化都会间接报错 var obj1 = {};var obj2 = { a: obj1};obj1.a = obj2;JSON.stringify(obj1); // Uncaught TypeErrorJSON.stringify(obj2); // Uncaught TypeError2、含有toJSON()办法的对象对该类对象进行JSON字符串化,会先调用toJSON()办法,而后用它的返回值来进行序列化,而不是将整个对象转换为字符串。 ...

May 7, 2023 · 2 min · jiezi

关于javascript:JS接入PAYPAL-Smart-Button-Vaulting

背景: 收银台集成Vault Payment Method API保留付款形式而不创立付款交易,该性能将极大的缩短复购用户的paypal登录流程,晋升复购用户的领取体验。一、页面里引入paypal script<script src="https://www.paypal.com/sdk/js?client-id={{YOUR_CLIENT_ID}}&components=buttons&currency=USD"></script>如果须要应用vaulting模式,须要在标签里埋入data-client-token属性,属性值就是中台返回的用户的client token,例如:<script src="https://www.paypal.com/sdk/js?client-id={{YOUR_CLIENT_ID}}&components=buttons&currency=USD" data-client-token="{{YOUR-CLIENT-TOKEN}}"></script>二、在代码里埋入paypal smart Bottun的占位元素<div id="paypal-button-container"></div>三、初始化 paypal smart button<script> paypal.Buttons({ onInit:function(data, actions){ // 初始化sdk的回调函数 }, onClick:function(){ //smart button按钮点击的回调函数,用于解决一下数据上报逻辑 }, createOrder: function(data, actions) { // 在paypal弹窗中执行领取操作后生单的回调 if(data.paymentSource == 'paypal'){ // paypal 类型的按钮能够实现vaulting性能,按一下逻辑执行向中台申请生单id返回给paypal return fetch('/yourserver.com/createOrder', { method: 'post', body: JSON.stringify({ source: data.paymentSource, //paypal / payLater/ venmo / etc. }), }).then(function(res) { return res.json(); }).then(function(orderData) { return orderData.id; }); }else{ // smart button模式执行以下逻辑:获取以后订单的金额amount传给paypal return actions.order.create({ 'purchase_units': [{ 'amount': { 'value': amount } }] }); } }, onApprove: (data, actions) => { // 用户在paypal生单受权领取胜利的回调,申请中台接口,把paypal返回的tokenId等参数传给中台实现领取 return fetch('/yourserver.com/order/' + data.orderID + '/capture/', { method: 'post' }); }, onCancel(data, actions) { // 在paypal 中勾销领取的回调 console.log(`Order Canceled - ID: ${data.orderID}`); }, onError(err) { // 在paypal中领取失败的回调 console.error(err); } }).render('#paypal-button-container');</script>四、paypal vaulting 模式展现一旦用户进行了绑定操作,下次购物就能够省去受权步骤间接领取胜利,省时省力,体验更好;然而出于平安思考,如果用户更换了浏览器,就须要再次进行绑定 ...

May 6, 2023 · 1 min · jiezi

关于javascript:JavaScript的设计模式

引言一.工厂模式工厂模式大抵能够分为三类:简略工厂模式、工厂办法模式、形象工厂模式 简略工厂模式简略工厂模式顾名思义就是简略 class GeGe { name = 'cxk'; age = 2.5; getName() { return this.name; } getAge() { return this.age + '岁'; } } const gege = new GeGe(); console.log(gege.getAge(), gege.getName());工厂办法模式形象工厂模式

May 6, 2023 · 1 min · jiezi

关于javascript:uniapp-仿-ios-计算器功能

前言:该我的项目是仿照ios计算器app实现,局部交互细节未实现。主体逻辑是依据本人教训实现,有问题之处欢送指出。Github 仓库地址 应用 uni-app 搭建我的项目后在 index.vue 编写 UI 动态页代码, 同级创立 utils.js 文件,寄存一些常量和工具函数。 // index.vue<template> <view class="content"> <view class="view"> <span :class="{lessen: viewValue.length >= 7}"> {{ viewValue }} </span> </view> <!-- 按钮 --> <view class="btns"> <view v-for="item in btns" :key='item.text' :style="item.style" :class="item.className" :data-text="item.text"></view> </view> </view></template><script>import { KEYS, symbolReg1, symbolReg2, symbolReg3 } from './utils';export default { data() { return { // 渲染值 viewValue: 0, btns: KEYS && KEYS.map(item => { let style = {} let className = 'default' // 雷同类型的增加 class if (symbolReg3.test(item) || item === KEYS[KEYS.length - 1]) { className = 'origin' } if (new RegExp(`${KEYS[0]}|(?=${KEYS[1]})|${KEYS[2]}`).test(item)) { className = 'gray' } // 独自辨别款式 if (item === KEYS[KEYS.length - 3]) { style.width = 'calc(144rpx * 2 + 100% / 4 / 4)' style.justifyContent = 'flex-start' style.padding = '0 50rpx' } if (item === KEYS[1]) { style.fontSize = '50rpx' } if (item === KEYS[0]) { style.fontSize = '50rpx' } return { text: item, style, className } }) } }}</script><style scoped lang="scss">.content { display: flex; flex-wrap: wrap; align-content: flex-end; background: #000000; min-height: 100vh; box-sizing: border-box; padding: 30rpx; font-family: PingFangSC-Regular, sans-serif; > view { width: 100%; color: #ffffff; } .view { text-align: right; font-size: 168rpx; line-height: 100px; > .lessen { font-size: 138rpx; } > span { display: inline-block; box-sizing: border-box; -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; user-select: text; overflow: hidden; border-radius: 20rpx; &::selection { background-color: #333; color: #fff; } } } .btns { display: flex; flex-wrap: wrap; justify-content: space-between; height: 870rpx; > view { width: 144rpx; height: 144rpx; border-radius: 144rpx; box-sizing: border-box; display: flex; align-items: center; justify-content: center; font-size: 60rpx; color: #ffffff; transition: all .3s; background: #333333; &.origin { background: #fea00c; &:active { background: #ffffff; color: #fea00c; } } &.gray { background: #a5a5a5; color: #000000; &:active { background: #eeeeee; } } &.default { &:active { background: #bbbbbb; } } &::after { content: attr(data-text); } } }}</style>// utils.jsexport const KEYS = ['AC', '+/-', '%', '÷', '7', '8', '9', '×', '4', '5', '6', '-', '1', '2', '3', '+', '0', '.', '=']// 乘除正则export const symbolReg1 = new RegExp(`^[${KEYS[4 - 1]}${KEYS[2 * 4 - 1]}]$`)// 加减正则export const symbolReg2 = new RegExp(`^[\\${KEYS[3 * 4 - 1]}${KEYS[4 * 4 - 1]}]$`)// 加减乘除正则export const symbolReg3 = new RegExp(`^[${KEYS[4 - 1]}${KEYS[2 * 4 - 1]}\\${KEYS[3 * 4 - 1]}${KEYS[4 * 4 - 1]}]$`)到这一步页面成果曾经进去了然而还没有点击事件。这里正则中是应用动静正则形式,防止 KEYS 常量中数据半角全角符号扭转而无奈匹配。 ...

May 6, 2023 · 8 min · jiezi

关于javascript:git远程仓库修改后git-pull失效解决方式

首先查看近程仓库地址 `git remote -v`增加新的近程仓库地址 `git remote add name newUrl`代码推送至新的仓库 `git push name`批改近程仓库地址 `git remote set-url origin name`批改后git pull 生效解决形式1、首先勾销本地仓库的近程地址配置 `git remote remove origin`2、增加新的近程仓库地址 `git remote add origin 新仓库地址`3、此时git还是认为这是两个独立仓库 须要拉取一下 git pull origin master --allow-unrelated-histories此时进行git pull操作会提醒three is no tracking information for the current branch解决形式:git branch --set-upstream-to origin/master(master为本人的分支名)4、如果抵触 解决 add commit 5、最初推送 git push -u origin master

May 6, 2023 · 1 min · jiezi

关于javascript:如何编写类型安全的CSS模块

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug. 在这篇文章中,作者探讨了如何在 CSS 模块中应用类型平安。因为 CSS 模块在运行时生成类名并在构建之间更改,因而很难以类型平安的形式应用它们。一种解决方案是应用 TypeScript 定义文件为每个 CSS 模块手动创立类型,但更新这些文件十分繁琐。文章提出了一个问题,即假如在 CSS 模块中增加或删除了一个类名。 上面是注释~ 应用TypeScript的益处之一是它显著缩小了特定谬误的产生,例如拼写错误;它甚至使拜访原型办法和执行重构更加容易。在编译时捕捉的谬误能够进步失常运行工夫,让客户更加称心,并缩小开发人员的紧急呼叫压力。 应用TypeScript,很容易为咱们的应用程序的业务逻辑和管制流程进行类型标注,但如果咱们也能使CSS类平安,那该多好呢?确保正确的CSS类名曾经就位能够确保所需的款式利用于给定的组件,从而避免因为排版谬误而导致款式错位。 在本文中,咱们将探讨CSS模块是什么,探讨它们的开发者体验缺点,并学习如何通过应用TypeScript自动化来解决这些问题。让咱们开始吧! 什么是CSS模块?CSS模块提供了一种在古代Web应用程序中编写模块化和作用域CSS款式的办法。这些款式特定于你的应用程序的特定组件或模块。你能够应用惯例CSS编写CSS模块。 在构建时,应用 Vite 或其余相似的工具,CSS 模块为 CSS 文件中定义的每个类生成惟一的类名。而后在 JavaScript 中应用生成的类名来援用 CSS,从而使 CSS 模块化和可重用,防止类名抵触或不必要的反复。 在撰写本文时,CSS类名不再是全局的,解决了许多像BEM这样的方法论旨在解决的问题,但无需手动致力。然而,在CSS模块中遵循BEM依然取决于用例而无益。 将 CSS 模块增加到你的我的项目中如果你想在下一个 TypeScript 应用程序中应用 CSS 模块,则有几个选项。 古代构建工具如 Vite 和 Snowpack 反对 CSS 模块化,但如果你应用的是 webpack,可能须要蕴含一些小的配置。 一旦构建设置实现,能够依照CSS模块约定增加带有 module.css 扩展名的CSS文件: // button.module.css.green { background-color: 'green';}.blue { background-color: 'blue';}.red { background-color: 'red';}为了利用这些款式并利用上述益处,咱们应该从 TypeScript 文件中导入 CSS 模块并绑定 HTML。请记住,上面的示例是用 React 编写的,但语法与其余 UI 库十分类似: ...

May 6, 2023 · 2 min · jiezi

关于javascript:JavaScript基础之对象

本文是我学习《你所不晓得的javaScript上卷》的读书笔记的整顿。更多具体内容,请微信搜寻“前端爱好者“, 戳我 查看 。 1. 对象对象(object)是 JavaScript 语言的外围概念,也是最重要的数据类型。 什么是对象?简略说,对象就是一组“键值对”(key-value)的汇合,是一种无序的复合数据汇合。 var obj = { foo: 'Hello', bar: 'World' }; 下面代码中,大括号就定义了一个对象,它被赋值给变量obj,所以变量obj就指向一个对象。 该对象外部蕴含两个键值对(又称为两个“成员”): 第一个键值对是foo: 'Hello',其中foo是“键名”(成员的名称),字符串Hello是“键值”(成员的值)。 键名与键值之间用冒号分隔。第二个键值对是bar: 'World',bar是键名,World是键值。 两个键值对之间用逗号分隔。1.1 创立新对象JavaScript 领有一系列预约义的对象。 从 JavaScript 1.2 之后,你能够通过对象初始化器(Object Initializer)创建对象。 你也能够创立一个构造函数并应用该函数和 new 操作符 初始化对象。 1.1.1 应用对象初始化器/对象的文字语法 var  myObj = { key: value // ... }; 1.1.2 应用构造函数 function Person(name, age, sex) {  this.name = name;  this.age = age;  this.sex = sex; } var rand = new Person("Rand McKinnon", 33, "M"); 1.1.3 应用Object.create办法 ...

May 5, 2023 · 8 min · jiezi

关于javascript:小程序公众号H5Wap版App版多端数据同步共享OctShop

OctShop商城零碎,包含了:小程序版,公众号版,H5/Wap版,App版,PC版可定制。所有版本的数据都是统一的,真正做到了每个版本的数据时实同步。每个版本的相应栏目内容也能够通过平台管理系统进行治理。如:各版本的轮播图片,横幅广告,自定义展现栏,举荐的商品与商家等。 一、每个版本的会员信息同步共用共享。 用户只须要在一个入口绑定手机,无论是小程序版,公众号版,H5/Wap版,App版,PC版都能够自在登录,并且会员用户信息能够实时同步,如:用户余额,积分,等级,收支流水,提现,充值,订单,评估等与用户相干的信息都是统一的。 二、每个版本的所有商品与店铺数据同步。 平台所有的商品与店铺数据都是同步共用共享的,比方:商家在后盾公布一个商品,只有通过平台的审核后,小程序版,公众号版,H5/Wap版,App版,PC版都可能立刻显示与订购下单。平台入驻的商家店铺也是一样,大大增加了店铺与商品的流量。 三、每个版本数据,界面,交互,性能体验均统一 除了每个版本的数据都是一样的,实时同步的,另外,小程序版,公众号版,H5/Wap版,App版的界面展现与性能的交互,用户体验也是高度放弃一致性的,这就能够防止用户在应用各个不同版本的客户端时,应用习惯的不同,大大增加了用户体验的舒适性。 四、每个版本的客户端都是一个宏大的我的项目 每个版本的客户端在立项时都是通过严格的规范制订与顶层设计,高标准要求与执行。每个性能都通过重复的斟酌与测试,确保了买家客户端各版本的高质量,良好的用户操作体验,比拟好看的界面展现等。

May 5, 2023 · 1 min · jiezi

关于javascript:在可编辑的div中-插入emoji

我的编辑器差不多长这个样鼠标放上去那个表情图案显示emoji 表情框 上面是代码 <!--表情按钮--><button v-for="(item,key) in emoji" class="emoji-item" :key="key" @click="insertEmoji($event,item)"> {{item.label}}</button><!--输入框--><div class="scrollbar" ref="textareaRef" id="text-area" contenteditable="plaintext-only"></div>这个button标签很重要 emoji:[ { index: 58, label: '', }, { index: 59, label: '', },]而后是插入表情的办法 var oDiv = document.getElementById('text-area');var range = window.getSelection().getRangeAt(0); // 获取光标地位var node = document.createElement('span'); // 创立节点对象node.innerHTML = item.label; // 设置节点内容为 emoji 表情range.insertNode(node); // 将节点插入到光标地位range.setStartAfter(node); // 将光标挪动到节点之后range.collapse(true); // 合并光标地位oDiv.focus(); // 让可编辑元素取得焦点其中对于放emoji表情的那个button标签,为什么说他很重要呢? 一开始我就是用的span标签来放emoji, 而后发现点击表情的时候 emoji 不会被插入到输入框外面,而是会插入到你点击的那个表情前面, 百思不得姐..而后就祭出了万能的chat.哆啦GPT.A梦, 这是她的答复 援用这是因为 button 元素和 span、div 元素在默认状况下是具备不同的行为的。button 元素是一个表单控件,它默认具备点击事件,并且在被点击时会阻止事件的流传和默认行为(提交表单或刷新页面),因而能够在点击事件处理函数中执行插入 emoji 表情的逻辑,而不会触发默认行为。而 span 和 div 元素默认不具备点击事件,并且在被点击时不会阻止事件的流传和默认行为。因而,如果在 span 或 div 元素中绑定了点击事件处理函数,并且在其中执行插入 emoji 表情的逻辑,那么就会触发默认行为,例如将 emoji 表情插入到点击的中央,或者选中文本等因为平时 根本都在应用div,span,下意识就用span 来装行内内容,折腾了许久.. 这次是真开眼了既然都明确了是默认事件的起因,所以如果你还要应用span或者其余元素的话也很简略了, 在下面办法最初加上 ...

May 5, 2023 · 1 min · jiezi

关于javascript:实践分享打造极具高扩展性的JavaScript-SDK

SDK(Software Developer Kit) 是应用 FeatureProbe 服务必不可少的工具之一。SDK能将用户的应用程序连贯到 FeatureProbe 服务,依据用户的配置获取开关的后果,还能将开关的拜访状况上报给 FeatureProbe,进而实现 A/B 试验的能力。 FeatureProbe 目前对外提供十余种支流开发语言的 SDK,包含用于服务端开发的 Java、Golang、Python、Rust等,以及用于客户端开发的 JavaScript、Android、iOS等。在之前的文章【用 Rust 开发跨平台 SDK 摸索和实际】中咱们曾介绍过咱们抉择应用Rust开发了跨平台语言的 Android SDK 和 iOS SDK,这样做的次要起因是: (1)能缩小人力老本和开发工夫。 (2)共享一套代码,便于前期保护。 在开发 JavaScript SDK 的过程中,咱们也同样采纳相似的思路。JavaScript是目前构建Web利用的次要语言,在此基础上产生了很多现代化的 JavaScript 前端框架,比方:React、Vue、Angular等。近几年在国内爆火的微信小程序框架也次要应用 JavaScript 语言进行开发的。如何制作一款能反对所有前端框架应用的通用 SDK,同时在此 SDK 的根底上,可能疾速地依据框架的语法个性进行下层封装,是 JavaScript SDK 的外围要求之一。 实现思路实现一个功能完善的 JavaScript SDK,可能在一般的 Web 前端工程中应用。在此基础上,依据框架语法个性,进一步封装其它语言的 SDK,不同语言的SDK别离治理和发版。 React SDK的实现React SDK 在实现时将 JavaScript SDK 作为依赖项装置到工程内,次要应用了 React 的 Context API 和 Context hooks 进行下层封装,不便开发者在React工程中的应用。 1、应用 React 的 createContext API 创立一个上下文对象,保留开关 FeatureProbe 实例和开关后果的汇合。2、应用 React 的 Context Hooks 封装若干个自定义 Hook,用于在任何组件内疾速应用 FeatureProbe 实例和拜访开关后果。 ...

May 5, 2023 · 2 min · jiezi

关于javascript:Windows10下CUDA90CUDNN705的完美安装教程

前言&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp为什么要在本地电脑装置 CUDA,CUDA 是什么的,用来做什么?我想,点击题目进来的小伙伴,应该都分明这些。不论你是用来做什么,或者跟我一样为了跑 Tensorflow 的 Object Detection (指标检测)。 &nbsp&nbsp&nbsp&nbsp&nbsp然而我为什么要用 CUDA9,这里版本要特地留神。因为我应用的是 Tensorflow-gpu 1.10.0,为了能运行胜利,最好和我的保持一致,那就开始我的踩坑流程吧。 环境windows10 的 64 位电脑cuda9.0.176cudnn7.0.5CUDA91.下载1.1. 地址: https://developer.nvidia.com/cuda-90-download-archive1.2. 下载流程 2.装置2.1. 关上 cuda_9.0.176_win10.exe刚关上时会有一个漫长的期待过程,而后才会呈现如下界面。 2.2. 抉择自定义装置&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp为什么抉择自定义,那是因为我开始全副默认间接装置失败。通过网上查问,有些是装置 CUDA 会装置一些本地曾经存在的工具,而后又与本地版本抵触等问题。抉择自定后会有四个选项,第一先把 NVIDIA GeForce Experience Core 敞开,而 CUDA 下的 Visial Studio Integration 也能够敞开,最初再点到 ”Driver Components“, 如下图上两个能够敞开,而 Display Driver 须要依据上面办法再抉择敞开与否。2.3. 查看本地显卡驱动版本2.3.1. 桌面右击 NIVDIA 控制面板2.3.2. 点击左下角 “零碎信息”, 点击 "显示" 2.3.3. 驱动版本信息,CUDA 外围等参数都能够查看了。 &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp如上图显示我的显卡驱动程序版本 391.25,大于 CUDA 的 Display Driver 385.54,所以抉择敞开,如果小于就要勾选。 2.4. 装置下一步 &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp后面的选项都设置结束后,须要设置 CUDA 的装置目录和另外两个的地位,别离是 Development (CUDA 目录,前面 CUDNN 须要用到,并且会呈现在环境变量中), Documentation, Samples,期间弹出装置其他软件默认点击即可,并且会有闪黑屏状况,不用放心,只须要期待装置完结。2.5. 查看是否装置胜利2.5.1. 查看零碎环境变量关上我的电脑属性,环境变量 -> 零碎变量,查看是否有如下四个变量,再关上 Path,查看是否有 CUDA 的 bin 目录配置 (第二张图)。 ...

May 5, 2023 · 1 min · jiezi

关于javascript:用-Tensorflowjs-做了一个动漫分类的功能二

前言&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp后面曾经通过采集拿到了图片,并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型,最初就能够实现在采集中对图片进行主动分类了。 &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp这种性能在利用场景里就比拟多了,比方图标素材站点,用户通过上传一个图标,零碎会主动匹配出类似的图标,还有二手平台,用户通过上传闲置物品图片,平台主动给出分类等,这些也都是后期对海量图片进行了标注训练而失去一个损失率极低的模型。上面就通过简答的代码实现一个小的动漫分类。 环境Node Http-Server Parcel Tensorflow 编码训练模型1.1. 创立我的项目,装置依赖包 npm install @tensorflow/tfjs --legacy-peer-depsnpm install @tensorflow/tfjs-node-gpu --legacy-peer-deps 1.2. 全局装置 Http-Server npm install i http-server 1.3. 下载 mobileNet 模型文件 (网上有下载) 1.4. 根目录下启动 Http 服务 (开启跨域),用于 mobileNet 和训练后果的模型可拜访 http-server --cors -p 8080 1.5. 创立训练执行脚本 run.js const tf = require('@tensorflow/tfjs-node-gpu');const getData = require('./data');const TRAIN_PATH = './动漫分类/train';const OUT_PUT = 'output';const MOBILENET_URL = 'http://127.0.0.1:8080/data/mobilenet/web_model/model.json';(async () => { const { ds, classes } = await getData(TRAIN_PATH, OUT_PUT); console.log(ds, classes); //引入他人训练好的模型 const mobilenet = await tf.loadLayersModel(MOBILENET_URL); //查看模型构造 mobilenet.summary(); const model = tf.sequential(); //截断模型,复用了86个层 for (let i = 0; i < 86; ++i) { const layer = mobilenet.layers[i]; layer.trainable = false; model.add(layer); } //降维,摊平数据 model.add(tf.layers.flatten()); //设置全连贯层 model.add(tf.layers.dense({ units: 10, activation: 'relu'//设置激活函数,用于解决非线性问题 })); model.add(tf.layers.dense({ units: classes.length, activation: 'softmax'//用于多分类问题 })); //设置损失函数,优化器 model.compile({ loss: 'sparseCategoricalCrossentropy', optimizer: tf.train.adam(), metrics:['acc'] }); //训练模型 await model.fitDataset(ds, { epochs: 20 }); //保留模型 await model.save(`file://${process.cwd()}/${OUT_PUT}`);})();1.6. 创立图片与 Tensor 转换库 data.js ...

May 4, 2023 · 3 min · jiezi

关于javascript:巧用阴影mask以及css变量来实现元素聚焦效果

巧用暗影、mask以及css变量来实现元素聚焦成果前言嘿,之前我如同有段时间没写博客了。其实最大的起因就是我变得有点懒了。不过,当初毕业快到了,我也不能始终偷懒上来啊。对我来说,抉择写代码作为职业方向是一件好玩的事件,而在此方向上,继续学习是最重要的事件之一。写博客就是一种十分好的形式来帮忙本人继续学习,并且能够当作本人的成长记录,回味无穷。 最近遇到了一个这样的需要,有一个音讯列表,心愿能够在某条音讯中实现聚焦,即除了应该聚焦的音讯外的音讯都会被一个黑蒙蒙的遮罩所遮住。 那么遇到这种不常见的需要,咱们首先就须要思考技术计划。 技术计划1.Mask遮罩我最开始想到的是通过应用CSS突变以及遮罩的形式来实现。 具体思路如下,首先利用IntersectionObserver监听指定元素,如果它进入视图中,就能够将其top、height属性以「CSS变量」的形式赋值给Mask元素,Mask即可通过CSS变量的形式进行突变计算,从而最终显示出聚焦成果。 整个HTML文档构造如下: <div class="box"> // 滚动列表盒子 <ul class="list"> // 列表盒子,利用after伪元素来实现遮罩 <li class="item">1</li> <li class="item">2</li> <li class="item">3</li> <li class="item">4</li> <li class="item">5</li> <li class="item">6</li> <li class="item">7</li> <li class="item">8</li> <li class="item">9</li> <li class="item" id="target">10 (target)</li> // 须要聚焦的元素 <li class="item">11</li> <li class="item">12</li> <li class="item">13</li> </ul> </div>JS代码的次要作用其实就是去监听指标元素的显示,从而切换遮罩显示: const intersectionObserver = new IntersectionObserver((entries) => { const entry = entries[0] if (!entry) return const Mask = document.querySelector('.list') if (entry.isIntersecting) { // 可视畛域 const rect = entry.boundingClientRect const { height } = rect Mask.style.setProperty('--height', height + 'px') Mask.style.setProperty('--top', entry.target.offsetTop + 'px') } else { // 不显示,则设置突变令其通明 Mask.style.setProperty('--height', entry.rootBounds.height + 'px') Mask.style.setProperty('--top', 0 + 'px') } }); // 开始监听 intersectionObserver.observe(document.querySelector('#target'));咱们利用mask,即mask中不通明的局部会使得背景图被遮住的个性来管制遮罩的地位。 ...

May 3, 2023 · 1 min · jiezi

关于javascript:JSONP的实现

1. 是什么JSONP全称(Json with Padding);由Bob Ippolito于2005年提出。JSONP反对绕过同源策略共享数据。因为同源策略,浏览器在发送Ajax申请时,只接管同域服务器响应的数据资源;JSONP是利用了 script 标签的 src 属性来实现跨域数据交互的,因为浏览器解析HTML代码时,原生具备src属性的标签,浏览器都赋予其HTTP申请的能力,而且不受跨域限度,应用src发送HTTP申请,服务器间接返回一段JS代码的函数调用,将服务器数据放在函数实参中,前端提前写好响应的函数筹备回调,接收数据,实现跨域数据交互; 二、实现const jsonp = ({ url, params, callbackName }) => { const generateUrl = () => { let dataSrc = '' for (let key in params) { if (params.hasOwnProperty(key)) { dataSrc += `${key}=${params[key]}&` } } dataSrc += `callback=${callbackName}` return `${url}?${dataSrc}` } return new Promise((resolve, reject) => { const scriptEle = document.createElement('script') scriptEle.src = generateUrl() document.body.appendChild(scriptEle) window[callbackName] = data => { resolve(data) document.removeChild(scriptEle) } })}三、安全性问题跨站申请伪造简略的 JSONP 部署容易受到跨站点申请伪造(CSRF 或 XSRF)攻打。因为 HTML<script>元素不恪守Web浏览器实现中的同源策略,因而歹意页面能够申请并获取属于另一个站点的 JSON 数据。这将容许在歹意页面的上下文中评估 JSON 编码的数据,如果用户以后登录到其余站点,可能会泄露明码或其余敏感数据。 ...

May 3, 2023 · 1 min · jiezi

关于javascript:用-Tensorflowjs-做了一个动漫分类的功能一

前言&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp浏览某乎网站时发现了一个分享各种图片的博主,于是我棘手就保留了一些。然而一张一张的保留切实太麻烦了,于是我就想要某虫的伎俩来解决。这样保留确实是很快,然而他不识图片内容,最近又看了 mobileNet 的预训练模型,想着能让程序本人对图片分类,以下就通过例子从内容采集到分类的过程。       内容和资源的采集,反手就是某虫了。在网络上,通过近几年的营销渲染,可能首选是用 Python 做脚本。而这次是用 PHP 的 QueryList 来做采集,上面也就是采集的编码过程和踩坑解决办法,最初再对采集图片进行标注和训练。 环境PHP7.4 QueryList4.0 QueryList-CurlMulti 编码&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp以下例子是基于 TP5.1,所以只须要装置下面两个依赖包。采集启动通过自定义命令实现,接下来别离以一般采集和多线程采集两种形式展现。 一般采集<?php/** * @Notes: 公众号:ZERO开发 * @Interface getCondition * @Return mixed * @Author: bqs * @Time: 2021/4/19 15:28 */namespace app\common\command;use think\console\Command;use think\console\Input;use think\console\Output;use think\console\input\Argument;use think\console\input\Option;use think\Db;use think\facade\Hook;use think\facade\Log;use QL\QueryList;class QueryListSpiderSingle extends Command{ protected function configure() { $this->setName('querylist:single') ->setDescription('采集'); } protected function execute(Input $input, Output $output) { ini_set('memory_limit', '512M'); $output->writeln("=========date:" . date('Y-m-d H:i:s') . "==============="); // 北桥苏奥特曼 //$slImgsUrl = "https://zhuanlan.zhihu.com/p/377571373"; $slImgsUrl = "https://zhuanlan.zhihu.com/p/344680014"; // 原生query_list $list = QueryList::get($slImgsUrl)->find('.RichText')->find('noscript')->find('img')->attrs('src'); $path = 'E:\2setsoft\1dev\phpstudy_pro\WWW\4test\tensorflowJs\js-ml-code\t7\动漫分类\train\奥特曼\\'; foreach($list as $key => $value) { $index = $key + 1 + 42; $filename = $index < 10 ? str_pad($index, 2, "0", STR_PAD_LEFT) : $index; $filend = pathinfo($value, PATHINFO_EXTENSION); $file = file_get_contents($value); file_put_contents($path . $filename . "." . $filend, $file); $output->writeln($index . "--" . $value . "已保留--"); } $output->writeln("============date:" .date("Y-m-d H:i:s") . "采集实现=============="); } }多线程采集<?php/** * @Notes: 文件形容 * @Interface getCondition * @Return mixed * @Author: bqs * @Time: 2021/4/19 15:28 */namespace app\common\command;use think\console\Command;use think\console\Input;use think\console\Output;use think\console\input\Argument;use think\console\input\Option;use think\Db;use think\facade\Hook;use think\facade\Log;use QL\QueryList;use QL\Ext\CurlMulti;class QueryListSpider extends Command{ protected function configure() { $this->setName('query:list') ->setDescription('采集'); } protected function execute(Input $input, Output $output) { ini_set('memory_limit', '512M'); $output->writeln("=========date:" . date('Y-m-d H:i:s') . "==============="); // 地址与目录映射 $dirMap = [ "假面骑士" => "https://zhuanlan.zhihu.com/p/376119915", "龙珠" => "https://zhuanlan.zhihu.com/p/340048917", "火影忍者" => ["https://zhuanlan.zhihu.com/p/352717188", "https://zhuanlan.zhihu.com/p/393213201", "https://zhuanlan.zhihu.com/p/358228745"], "海贼王" => ["https://zhuanlan.zhihu.com/p/357683518", "https://zhuanlan.zhihu.com/p/338160632"] ]; // 采集地址 $multiArr = []; $multiArr = array_reduce(array_values($dirMap), function ($res, $value) { $res = array_merge($res, (array)$value); return $res; }, []); // 采集映射 $multiMap = []; foreach($dirMap as $key => $value) { if (!is_array($value)) { $multiMap[$value] = $key; } else { $temp = array_fill_keys($value, $key); $multiMap = array_merge($multiMap, $temp); } } // 开始应用多线程采集 $ql = QueryList::use (CurlMulti::class); $ql->curlMulti($multiArr) ->success(function (QueryList $ql, CurlMulti $curl, $r) use ($multiMap) { $path = 'E:\2setsoft\1dev\phpstudy_pro\WWW\4test\tensorflowJs\js-ml-code\t7\动漫分类\train\\'; $queryUrl = $r['info']['url']; $className = $multiMap[$queryUrl] ?? ""; $targetDir = $path . $className; $path = $targetDir . '\\'; $endFileIndex = 0; $existFileList = $this->scanFile($targetDir); if ($existFileList) { // 取出所有数字文件名最大值 $endFileName = max($existFileList); $endFileIndex = explode(".", $endFileName)[0]; } $data = $ql->find('.RichText')->find('noscript')->find('img')->attrs('src'); foreach($data as $key => $value) { $index = $key + 1 + $endFileIndex; $filename = $index < 10 ? str_pad($index, 2, "0", STR_PAD_LEFT) : $index; $filend = pathinfo($value, PATHINFO_EXTENSION); $file = file_get_contents($value); file_put_contents($path . $filename . "." . $filend, $file); } }) // 每个工作失败回调 ->error(function ($errorInfo, CurlMulti $curl) { echo "Current url:{$errorInfo['info']['url']} \r\n"; print_r($errorInfo['error']); }) ->start([ // 最大并发数 'maxThread' => 10, // 谬误重试次数 'maxTry' => 5, ]); $output->writeln("============date:" . date("Y-m-d H:i:s") . "采集实现=============="); } // 扫描目录下所有文件 protected function scanFile($path) { $result = []; $files = scandir($path); foreach ($files as $file) { if ($file != '.' && $file != '..') { if (is_dir($path . '/' . $file)) { $this->scanFile($path . '/' . $file); } else { $result[] = basename($file); } } } return $result; }}问题解决&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp因为一般采集的申请应用 GuzzleHttp 客户端,而多线程采集是 CURL,所以运行时报 curl 状态码 60 谬误。 ...

May 3, 2023 · 3 min · jiezi

关于javascript:开课吧JavaScript深入简出系列教程2022最新交游落落俱星散

download:开课吧JavaScript深刻简出系列教程2022最新代计算机科学中,算法是一项十分重要的技能。它们通过指定特定问题的解决方案,从而使计算机可能无效地执行各种工作。简略来说,算法就是计算机程序的“魔法”。 一般来说,算法能够被视为一组有序的操作步骤,这些步骤能够帮忙计算机解决问题。例如,在搜索引擎中,咱们应用算法来确定哪些网页最合乎咱们的查问条件。在游戏中,咱们应用算法来决定计算机角色如何口头。在电子商务中,咱们应用算法来建设举荐零碎。 只管算法曾经成为计算机领域不可或缺的工具,然而设计和实现一个高效的算法并不容易。在大多数状况下,一个好的算法须要思考工夫和空间的复杂度,以及如何优化算法以便在不同的平台上运行。 因为计算机速度的疾速晋升,许多看起来很慢的算法也变得更加实用。然而,这些算法的理论体现取决于计算机的硬件和软件环境。因而,为了确保算法的效率和可靠性,程序员必须常常进行优化。 只管算法的概念在计算机科学中曾经存在了很长时间,然而随着技术的倒退,人们对算法的需要也越来越多。例如,在人工智能和机器学习畛域,算法被用于构建简单的模型和预测将来趋势。 总的来说,算法是计算机世界的魔法。它们使咱们可能解决各种问题并发明出弱小的计算机程序。然而,设计和实现一个好的算法须要深刻了解计算机科学基础知识,并且须要一直地进行优化以确保其高效性和可靠性。

May 2, 2023 · 1 min · jiezi

关于javascript:JavaScript-事件

事件流形容的是从页面接管事件的程序。比如说单击了某个按钮,然而单击事件不仅产生在按钮上,在单击按钮的同时,也单击了按钮的容器元素,甚至是 \<body\> 、\<html\> 、Document。 事件流传的程序不同导致存在两种事件流机制:事件冒泡和捕捉。 事件冒泡IE 提出的事件流被称作事件冒泡(event bubbling),即事件开始时由最具体的元素(DOM 层级最深的 node)接管,而后逐级向上流传,直至 document: 事件捕捉Netscape Communicator(网景)提出的事件流被称作事件捕捉(event capturing)。与冒泡相同,捕获在事件达到预约指标(即 DOM 层级最深的 node)之前捕捉,document 对象首先被触发事件,而后沿 DOM 树逐级向下流传,直至理论指标: DOM 事件流晚期浏览器兼容性的问题导致了 Netscape 只应用事件捕捉,IE 只应用事件冒泡,起初 W3C 标准了这些行为,保留了两种机制。 DOM2 Events 标准规定了事件流分为3个阶段:事件捕捉、达到指标和事件冒泡。事件捕捉最先产生,其次是指标元素接管到事件,最初阶段是冒泡。 事件流的抉择默认状况下所有事件处理程序(响应某个事件的函数)都是在冒泡阶段注册的,这在大多数状况下更有意义。当然也能够通过 addEventListener 办法应用捕捉事件流。 addEventListener 语法: addEventListener(type, listener);addEventListener(type, listener, options);addEventListener(type, listener, useCapture);第3个参数: options capture 布尔值oncepassivesignaluseCapture 布尔值capture 和 useCapture 决定了事件程序,也就是事件流。当布尔值为 true 时,示意应用事件捕捉机制,当为 false 时,则应用事件冒泡机制。该属性默认为 false。

May 2, 2023 · 1 min · jiezi

关于javascript:javaScript基础之-原型

本文是我学习《你所不晓得的javaScript上卷》的读书笔记的整顿。更多具体内容,请微信搜寻“前端爱好者“, 戳我 查看 。 原型1. [[Prototype]]JavaScript 中的对象有一个非凡的 [[Prototype]] 内置属性: 对于其余对象的援用。 简直所有的对象在创立时 [[Prototype]] 属性都会被赋予一个非空的值。 1.1 [[Prototype]] 援用有什么用当你试图援用对象的属性时会触发 [[Get]] 操作。 对于默认的 [[Get]] 操作来说,第一步是查看对象自身是否有这个属性,如果有的话就应用它。 然而如果 属性 不在 对象自身 中,就须要应用对象的 [[Prototype]] 链了。 var anotherObject = { a:2 }; // 创立一个关联到 anotherObject 的对象 var myObject = Object.create( anotherObject ); myObject.a; // 2 myObject 对象的 [[Prototype]] 关联到了 anotherObject。显然 myObject.a 并不存在, 然而尽管如此,属性拜访依然胜利地(在 anotherObject 中)找到了值 2。 然而,如果 anotherObject 中也找不到 a 并且 [[Prototype]] 链不为空的话,就会持续查找上来。 这个过程会继续到找到匹配的属性名或者查找残缺条 [[Prototype]] 链。 for..in - 同样会查找对象的整条原型链 ...

April 29, 2023 · 6 min · jiezi

关于javascript:手撕代码系列三

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。手撕代码系列(三)手写匹配括号 isValid/** * 匹配括号 isValid * @param {String} symbolStr 符号字符串 * @return {Boolean} * * @logic * 1.定义一个栈数组(stack) * 2.定义字典(obj) * 3.遍历字符串 * 4.判断字符串中的每个字符与其对应的符号是否呈现在字典(obj)中(如果是无效的,前者与后者是绝对应的) * 5.最初判断,如果栈数组(stack)的长度为 0, 则证实是无效的。 */const isValid = symbolStr => { let stack = []; let obj = { '(': ')', '[': ']', '{': '}', }; for (let i = 0; i < symbolStr.length; i++) { let ele = symbolStr[i]; // Object.prototype.hasOwnProperty.call(obj, ele):办法是一个罕用的,平安检测对象是否含有某个属性的办法,应用此办法可防止 hasOwnProperty 属性被净化或被重写的危险。 if (Object.prototype.hasOwnProperty.call(obj, ele)) { stack.push(ele); } else { if (ele != obj[stack.pop()]) return false; } } return !stack.length;};// test:console.log("isValid('(){}') ------>", isValid('(){'));// isValid('(){}') ------> true// isValid('(){') ------> false手写大驼峰转下划线 camelCasetoLineCase/** * 大驼峰转下换线 camelCasetoLineCase * @param {String} str 字符串 * @return 下划线格局字符串 */const camelCasetoLineCase = str => { // /([A-Z])/g: 全局匹配大写字母 A-Z // $1: 对应正则捕捉到的内容。具体可看下方 demo // _$1: 将捕捉的内容采纳下换线的模式并改成小写格局 return str.replace(/([A-Z])/g, '_$1').toLowerCase();};// test:console.log("camelCasetoLineCase('helloWorld') ------>", camelCasetoLineCase('helloWorld')); // camelCasetoLineCase('helloWorld') ------> hello_world// $1 Demo:var str = 'Doe, John';// 阐明:$1,$2上就是按程序对应小括号外面的小正则 捕捉到的内容// 把 "Doe, John" 转换为 "John Doe" 的模式let res = str.replace(/(\w+)\s*, \s*(\w+)/, '$2 $1');console.log('res ------>', res); // res ------> John Doe手写下划线转大驼峰 lineCasetocamelCase/** * 下划线转大驼峰 lineCasetocamelCase * @param {String} str 须要转换的字符串 * @return camelCase 格局字符串 */const lineCasetocamelCase = str => { // \_:将下一个字符标记捕捉到的字符。例如:\n 匹配换行符,\\ 匹配 \,\( 匹配 ( // \w: 全局匹配字母、数字、下划线。等价于 [A-Za-z0-9_] return str.replace(/\_(\w)/g, (sourceLetter, letter) => { console.log('sourceLetter ------>', sourceLetter, letter); // _w, w return letter.toUpperCase(); });};// test:console.log("linetoHump('hello_world') ------>", linetoHump('hello_world')); // linetoHump('hello_world') ------> helloWorld手写反转字符串 reverseStr/** * 反转字符串 reverseStr * @param {String} str 须要反转的字符串 * @return 反转后的字符串 */const reverseStr = str => { let strArr = str.split(''); let left = 0; let right = strArr.length; while (left <= right) { [strArr[left], strArr[right]] = [strArr[right], strArr[left]]; left++; right--; } return strArr.join('');};// test:console.log("reverseStr('helloworld') ------>", reverseStr('helloworld')); // reverseStr('helloworld') ------> dlrowolleh深度优先遍历 DFS(Depth First Search)/** * 深度优先搜寻: DFS(Depth First Search) * 深度优先搜寻:也就是一条路走到黑,而后再往回走,看看是否还有其余门路 * 分类:二叉树的前、中、后序遍历 * 前序遍历:根节点 -> 左子树 -> 右子树 * 中序遍历:左子树 -> 根节点 -> 右子树 * 后序遍历:左子树 -> 右子树 -> 根节点 */class Node { constructor(val) { this.key = val; this.left = null; this.right = null; }}let root = null;let arr = [];// 前序遍历:根节点 -> 左节点 -> 右节点const preOrder = node => { if (node === null) return; arr.push(node.key); preOrder(node.left); preOrder(node.right); return arr;};// 中序遍历:左节点 -> 根节点 -> 右节点const inOrder = node => { if (node === null) return; inOrder(node.left); arr.push(node.key); inOrder(node.right); return arr;};// 后续遍历:左节点 -> 右节点 -> 根节点const postOrder = node => { if (node === null) return; postOrder(node.left); postOrder(node.right); arr.push(node.key); return arr;};// test:root = new Node(1);root.left = new Node(2);root.right = new Node(3);root.right.right = new Node(6);root.left.left = new Node(4);root.left.right = new Node(5);/** * Binary Tree: 1 2 3 4 5 6 */// console.log(preOrder(root)); // [ 1, 2, 4, 5, 3, 6 ]// console.log(inOrder(root)); // [ 4, 2, 5, 1, 3, 6 ]// console.log(postOrder(root)); // [ 4, 5, 2, 6, 3, 1 ]特殊字符形容:问题标注 Q:(question)答案标注 R:(result)注意事项规范:A:(attention matters)详情形容标注:D:(detail info)总结标注:S:(summary)剖析标注:Ana:(analysis)提醒标注:T:(tips) ...

April 29, 2023 · 3 min · jiezi

关于javascript:Tensorflowjs-对视频-直播人脸检测和特征点收集

前言&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp这里要介绍的是 Tensorflow.js 官网提供的两个人脸检测模型,别离是 face-detection 和 face-landmarks-detection。他们岂但能够对视频中的世间进行精确定位,而且还能对以后设施 (手机 / 电脑摄像头) 采集的直播流实时监测人脸。所以这些的利用场景就很常见了,比方在线美颜,实时增加互动虚构挂件等等。        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp尽管这两个模型实现的性能相似,然而也还是有区别滴。face-landmarks-detection 相比 face-detection 对人脸的检测有更多的特色点,而特色点更多可用来做相似建模匹配的重合度就越高,以下会通过官网的例子打印出脸部的特色点数据。 实操1.下载源码。 独自提出 demos 里 upload_video。&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp这里要阐明一下,因为集体习惯,我这里还是通过 parcel 形式打包。官网举荐是 yarn,而且有文档流程介绍,能够按着下面运行。而我的办法齐全不按套路出牌,其实独自提出 demo 里我的项目运行也是不正确,npm 装置报错连连,那我就对我遇到的几个谬误做一一还原吧。2.1. npm install 抛出各种依赖包版本抵触,npm ERR! code ERESOLVE npm ERR,如下。2.1.1. 起因:       &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp因为自己前端程度无限,通过查阅,是 npm 版本起因。npm 从 v7 开始,默认装置 peerDependencies。在少数状况下,导致版本抵触,从而终端装置过程,在装置前能够查问一下 npm -v,小于 v7 就不必看上面办法了。 2.1.2. 解决办法:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp在命令前面增加--legacy-peer-deps, 加了这个就能够绕过 peerDependency 主动装置,通知 NPM 疏忽我的项目中引入的各个模块之间的雷同模块,但不同版本的问题,保障各个引入的依赖之间对本身所应用的不同版本模块共存,最初的依赖就装置胜利了,最初就执行 parcel index 打包。 2.2. parcel 时,抛出 face-detection 模型不存在,如下。 2.2.1. 起因:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp这里就是我运行我的项目时的办法不对,因为运行时须要在里面进行装置打包会生成模型文件,而 demos 里的模型引入其实是引入后面打包好的文件,咱们能够看到 package.json 里。 ...

April 28, 2023 · 1 min · jiezi

关于javascript:开课吧JavaScript深入简出系列教程2022最新可怜春半不还家

download:开课吧JavaScript深刻简出系列教程2022最新人工智能(AI)是一种计算机技术,它利用大量数据和算法来模仿人类思维和行为。在古代社会中,AI已成为许多重要畛域的关键字之一,如医疗、金融、交通和制作等。 AI的最大劣势是其高度自动化的个性。通过 AI 技术,企业能够将工作流程自动化,从而进步生产效率和品质。此外,AI还能够帮忙企业收集和剖析大量数据,以便更好地理解客户需要和市场趋势。 另一个重要的关键字是AI的能力,即学习和适应性。通过机器学习和深度学习技术,AI零碎能够主动从数据中学习,并不断改进其性能。这些技术使得AI零碎能够以前所未有的速度和准确度来执行各种工作,包含图像识别、语音辨认、自然语言解决和机器翻译等。 AI还具备高度可定制性的特点。因为不同的企业和行业须要不同的AI解决方案,因而,AI零碎必须具备高度灵活性和可定制性。AI零碎能够依据特定的需要进行调整和优化,以便更好地适应不同的业务场景。 AI的另一个关键字是其潜在危险。只管 AI 技术的倒退为企业带来了微小的商业机会,但也存在一些潜在的危险和挑战。例如,AI零碎可能会产生谬误后果,这可能会对企业的决策和业务产生负面影响。此外,AI零碎还可能蒙受攻打,从而导致数据泄露或其余平安问题。 总之,AI技术曾经成为古代社会中许多畛域的重要组成部分。它具备高度自动化、学习能力、可定制性和潜在危险等关键字。随着AI技术一直倒退和改良,它将持续推动企业和社会的提高和倒退。

April 28, 2023 · 1 min · jiezi

关于javascript:用JavaScript检测用户是否在线

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。有时候,咱们须要晓得以后网络的状态来做一些事件,以晋升用户体验,这节课,咱们来看一下,如何应用 JavaScript 来检测用户是否在线。 检测连贯状态咱们能够利用navigator.onLine API来检测连贯状态,它返回一个布尔值来示意用户是否在线。 留神:请留神各浏览器的实现形式不同,因而后果可能不同。window.addEventListener('load', () => { const status = navigator.onLine;});这种形式,咱们不晓得加载后网络状态是否发生变化,这并不现实。 咱们能够订阅 offline 和 online 事件,来监听这些具体的变动: window.addEventListener('offline', (e) => { console.log('offline');});window.addEventListener('online', (e) => { console.log('online');});事例咱们通过一个背景色的变动来演示以后的网络状态: <div class="status"> <div class="offline-msg">You're offline </div> <div class="online-msg">You're connected </div></div>对应的 css: .status { background: #efefef; display: flex; justify-content: center; align-items: center; min-height: 100vh; div { padding: 1rem 2rem; font-size: 3rem; border-radius: 1rem; color: white; font-family: Roboto, 'Helvetica Neue', Arial, sans-serif; } .online-msg { background: green; display: block; } .offline-msg { background: red; display: none; }}默认状况下,显示在线信息。而后咱们增加一个条件,如果状态元素有一个 offline 类,咱们就切换这两个div。 ...

April 28, 2023 · 1 min · jiezi

关于javascript:程序员成长开源项目4000star的一点感受

大家好,我是哆啦好梦,electron-egg框架开发者。 明天实现了 官网 的搭建。掐指一算,往年指标实现了2/3了,哈哈。 成果如下: 回归正题,这篇文章是对electron-egg我的项目的一个总结,聊一聊它的倒退历程。 先说感触这个我的项目从最后的一个练手demo,倒退到现在的问题,感觉挺神奇的。 初始犹记得最后接触electron技术时,发现市面上比拟火的框架 electron-vue 和 electron-react-boilerplate 都是与前端技术深度绑定的,对于我这种服务端开发来说并不敌对。大多数后端开发者或者高级前端尽管能懂一些,但要真正利用起来,还是要学习一番的。 想法因而我在想,能不能开发一个相似前后端拆散的框架(UI与业务离开),这样开发者就能够抉择vue\react\html等任何前端技术,业务层也与UI隔离,让它们各司其职。这便是electron-egg框架最开始的想法。 摸索回顾这两年的开发思路,仅供大家参考。 第一年:摸着石头过河我自身并不做桌面相干开发工作。但没有需要,不晓得应用场景,怎么写框架?那就是:没有需要,发明需要也要上! 于是开始整顿剖析桌面软件的利用场景和性能,汇总社区用户的需要。以用户为核心,解决他们的问题。这就框架1.0版本。 它尽管并不欠缺,但的确解决了开发者的问题,这便是它的价值所在。 第二年:提炼1.0版本的electron-egg解决了开发者的理论问题,更像是一个综合的库或组件。框架应该是能提供代码工程化的骨架。 期间参考过node.js的框架egg.js/koa.js/express.js,php语言的框架yii/laravel,go语言框架beego/goframe,前端vue/layui等。 学习它们提供了哪些性能,又是怎么实现的。于是通过重构,实现了框架外围包ee-core,并提供内部调用的api。 此时electron-egg算是实现了从0-1的过程,算得上一个轻量级的桌面软件开发框架了,后续还布局有模块化,多任务,第三方可嵌入等等。 往年:标准化随着用户增多,是时候建设一个官方网站,长期经营了。 另外框架在开发中大型项目上还很多不足之处,模块化、多任务、高性能将是往年的重点。 成长学的货色越多,越能感觉到本人常识的匮乏。从后端技术到前端技术,从编程语言到框架实现,从产品到我的项目经营。 总之一句话:变秃了,也变强了(真让人伤心)。

April 27, 2023 · 1 min · jiezi

关于javascript:Tensorflowjs-视频图片多目标检测

前言&nbsp&nbsp&nbsp&nbsp&nbsp&nbspTensorflow.js 官网提供了很多罕用模型库,涵盖了平时开发中大部分场景的模型。例如,后面提到的图片辨认,除此之外还有人体姿势辨认,指标物体辨认,语音文字等辨认。其中一些可能是 Python 转换而来,但都是开发人员用海量数据或资源训练的,集体感觉准确度能满足大部分性能开发要求。这里要介绍的是指标物体辨认模型 ——CooSSD。 &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp指标检测在机器视觉中曾经很常见了,就是模型能够对图片或者视频中的物体进行辨认,并预测其最大概率的名称和展现概率值。以下就先以 Github 上 Coo-SSD 图片指标检测为例,最初再弄一个视频的指标实时辨认。 demo 运行&nbsp&nbsp&nbsp&nbsp&nbsp&nbsptensorflow.js 提供的例子是通过 yarn,因为我本地环境起因,就以 npm 和 parcel 运行其成果。先本地创立我的项目文件夹,而后再别离创立 index.html, script.js, package.json 和增加几张图片。 依赖包装置 package.json 配置,装置 tfjs-backend-cpu, tfjs-backend-webgl 和模型 { "name": "tfjs-coco-ssd-demo", "version": "1.0.0", "description": "", "main": "index.js", "dependencies": { "@tensorflow-models/coco-ssd": "^2.2.2", "@tensorflow/tfjs-backend-cpu": "^3.3.0", "@tensorflow/tfjs-backend-webgl": "^3.3.0", "@tensorflow/tfjs-converter": "^3.3.0", "@tensorflow/tfjs-core": "^3.3.0", "stats.js": "^0.17.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "browserslist": [ "last 1 Chrome version" ]}命令切换到我的项目目录,运行 npm install ...

April 27, 2023 · 3 min · jiezi

关于javascript:JSBICalculator兼容IE11的高精度大数值四则计算JS库组件

JSBI-Calculator JSBI-Calculator是一个IE11兼容的计算器JS库组件,用于实现高精度(至少18位小数)大数值四则运算,基于由谷歌Chrome实验室出品的JSBI封装的BigDecimal。 该我的项目反哺GoogleChromeLabs/jsbi作出了不凡奉献。 我的项目地址:https://github.com/Leslie-Wong-H/jsbi-calculator装置> npm install jsbi-calculator示例 用法ES6模块:import JBC from "jsbi-calculator";const { calculator } = JBC;const expressionOne = "((10 * (24 / ((9 + 3) * (-2)))) + 17) + 5";const resultOne = calculator(expressionOne);console.log(resultOne);// -> '12'const max = String(Number.MAX_SAFE_INTEGER);console.log(max);// -> '9007199254740991'const expressionTwo = `${max} + 2`;const resultTwo = calculator(expressionTwo);console.log(resultTwo);// -> '9007199254740993'Node CommonJS模块:const JBC = require("jsbi-calculator");const { calculator } = JBC;const expressionOne = "((10 * (24 / ((9 + 3) * (-2)))) + 17) + 5";const resultOne = calculator(expressionOne);console.log(resultOne);// -> '12'const max = String(Number.MAX_SAFE_INTEGER);console.log(max);// -> '9007199254740991'const expressionTwo = `${max} + 2`;const resultTwo = calculator(expressionTwo);console.log(resultTwo);// -> '9007199254740993'浏览器:<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Jsbi-calculator Test</title> <script src="https://cdn.jsdelivr.net/npm/jsbi-calculator/dist/jsbi-calculator-umd.js"></script> </head> <body></body> <script type="text/javascript"> const expressionOne = "((10 * (24 / ((9 + 3) * (-2)))) + 17) + 5"; const resultOne = JBC.calculator(expressionOne); console.log(resultOne); // -> '12' const userAgent = navigator.userAgent; const isIE11 = userAgent.indexOf("Trident") > -1 && userAgent.indexOf("rv:11.0") > -1; let max; // MAX_SAFE_INTEGER not available in IE11 max = isIE11 ? "9007199254740991" : String(Number.MAX_SAFE_INTEGER); console.log(max); // -> '9007199254740991' const expressionTwo = max + " + 2"; const resultTwo = JBC.calculator(expressionTwo); console.log(resultTwo); // -> '9007199254740993' </script></html>留神上面表格中的运算操作是有波及到的。请留神,正数须要以-结尾且须要用括号括起来,例如(-11),负数不能以+号结尾。 ...

April 27, 2023 · 2 min · jiezi

关于javascript:算法-最长回文子串

思路:遍历字符串,对于字符串的每个字符,维持两个游标(left,right),找到游标对应字符相等时就同速度向两边扩散。 对于 奇数长度子串,left = right 对于偶数成都子串,left = right - 1 /** * @param {string} s * @return {string} */var longestPalindrome = function(s) { let res = ''; for(let i = 0; i< s.length; i++){ // 奇数 let left = i, right = i; while(left >= 0 && right < s.length && s[left]==s[right]) { left--; right++; } if(res.length < right - left -1){ res = s.substring(left + 1, right); } // 偶数 left = i, right = i+1; while(left >= 0 && right < s.length && s[left]==s[right]) { left--; right++; } if(res.length < right - left -1){ res = s.substring(left + 1, right); } } return res;};为了看起来更不便能够简略的封装一下 ...

April 26, 2023 · 1 min · jiezi

关于javascript:TinyCLI-有什么优势

2023 年 3 月华为云开源的我的项目 OpenTiny ———— 企业级设计体系中蕴含了一个前端脚手架工具,TinyCLI。目前市面上脚手架工具有很多,那么这个 TinyCLI 是什么,有什么劣势呢? Tiny CLI是什么?Tiny CLI是Web前端开发命令行工具,通过高拓展性,用于提供业务从本地开发、 构建到上线的全流程撑持,包含两种类型的工具: Toolkit:脚手架套件 套件是特定业务的标准化开发解决方案,一条命令即可实现我的项目的初始化;套件命令笼罩从我的项目初始化,到代码公布上线等流程。 Plugin:命令行插件 插件专一于某个繁多的性能,解决工作中零散、 反复的工作。任意目录执行,开箱即用。 产品个性Tiny CLI为您提供前端工程化的外围基座,使您更高效地工作和生产。 插件体系 丰盛的效率插件、流程插件、脚手架套件等, 笼罩从开发->构建->公布的所有生命周期。 自动化装置与降级 只需一次装置Tiny CLI,后续工具主程序更新可在线主动实现,无需用户手动更新。 开发套件和效率工具插件无需手动装置和降级,程序自行判断以后环境是否已装置或存在最新版本,降级过程中版本升级日志清晰可见。 增强版工作流机制 相似npm scripts的工作机制,但性能更加弱小,反对同步和异步两种工作执行形式。 工作命令反对windows/linux/mac多个平台, 无需额定判断,零碎主动解决。 高效易用 针对不同业务场景,提供了一站式的我的项目开发脚手架, 满足不同场景诉求。 简略、统一的命令行接口,易于开发人员应用。 急速装置npm包,应用Tiny CLI装置依赖包速度更快。 装置你的Tiny CLI一行命令即可疾速装置,开始您的Tiny CLI之旅吧。 $ npm i @opentiny/cli npminstall@3 -g 对于OpenTiny开源我的项目更多摸索欢送增加小助手微信:opentiny-official,一起交换前端技术,一起玩开源。 OpenTiny 官网:opentiny.design/ OpenTiny 代码仓库:github.com/opentiny/ TinyVue 组件库:github.com/opentiny/ti… (欢送 Star) TinyNG 组件库:github.com/opentiny/ng (欢送 Star) TinyCLI 工具: github.com/opentiny/ti… (欢送 Star)

April 26, 2023 · 1 min · jiezi

关于javascript:浏览器前端4行js实现自动读取IC卡号

BS架构软件集成IC卡读卡器,在前端只须要4行js代码即可实现主动读取IC卡卡号,在web上应用IC卡读卡器其实就是这么简略.首先装置友我IC卡读卡器web插件,这个web插件装置后之后goole浏览器,火狐,IE等浏览器, 而后插上IC卡读卡器YW-607HC,而后开始敲js代码了.引入相应的js后,开始寻卡代码: rfidreader.Repeat=1; rfidreader.HaltAfterSuccess=1; rfidreader.RequestTypeACardNo(1, 0);//1代表10位10进制格局而后再回调函数中承受卡号: rfidreader.onResult(function(resultdata){ switch(resultdata.FunctionID) { case 0: if(resultdata.Result>0) { console.log(resultdata.strData);//打印出卡号 } break; }});除了格式化的代码,只须要4行js代码就实现了主动读取IC卡号.

April 26, 2023 · 1 min · jiezi

关于javascript:浏览器中web应用程序如何绑定复合IC卡呢

浏览器中web应用程序如何绑定复合IC卡呢, 对于应用javascript的工程师而言,非常简单,只须要几行代码即可实现。当然在写代码之前, 须要装置友我NFC读写器web插件, 而后插上NFC读写器YW-607HC。引入必要的js后,咱们就能够开始写代码了.对于M1和15693的复合卡, 咱们能够先主动读取M1卡的卡号, 当M1卡的卡号通过回调函数传输到js后,咱们再读取15693的卡号。在页面load时,咱们退出如下代码: yoworfid.Repeat=1;yoworfid.HaltAfterSuccess=1; //读到M1卡号启动休眠,保障M1卡来到读卡器YW-607HC前只是读一次。yoworfid.RequestTypeACardNo(1, 0);//1代表10位10进制格局这样只有卡凑近读写器YW-607HC,卡号就能主动输入到js,js通过回调函数承受:yoworfid.onResult(function(resultdata){ switch(resultdata.FunctionID){ case 0: if(resultdata.Result>0) { console.log(resultdata.strData);//打印出M1卡的卡号 //读到M1卡号,开始读取15693的卡号 yoworfid.Repeat=0; //只须要读一次就能够 yoworfid.HaltAfterSuccess=1; yoworfid.Request15693CardUID();//开始读取15693卡号 } case 2: if(resultdata.Result>0) { console.log(resultdata.strData);//打印出15693卡的卡号 } break; }}); 通过以上几行代码,就能够读取M1和15693复合卡的卡号。

April 26, 2023 · 1 min · jiezi

关于javascript:MiniGPT4开源了

上个月GPT-4公布时,我曾写过一篇文章分享过无关GPT-4的几个要害信息。 过后的分享就提到了GPT-4的一个重要个性,那就是多模态能力。 比方发布会上演示的,输出一幅图(手套掉下去会怎么样?)。 GPT-4能够了解并输入给到:它会掉到木板上,并且球会被弹飞。 再比方给GPT-4一张长相奇怪的充电器图片,问为什么这很可笑? GPT-4答复道,VGA 线充 iPhone。 用户甚至还能够间接画一个网站草图拍照丢给GPT-4,它就能够立马帮忙生成代码。 然而工夫过来了这么久,GPT-4像这样的识图性能也迟迟没有凋谢。 就在大家都在期待这个性能凋谢的时候,一个名为MiniGPT-4的开源我的项目轻轻做了这件事件。 https://github.com/Vision-CAIR/MiniGPT-4 没错,就是为了加强视觉语言了解。 MiniGPT-4背地团队来自KAUST(沙特阿卜杜拉国王科技大学),是几位博士开发的。 我的项目除了是开源的之外,而且还提供了网页版的demo,用户能够间接进去体验。 MiniGPT-4也是基于一些开源大模型来训练失去的。 团队把图像编码器与开源语言模型Vicuna(小羊驼)整合起来,并且解冻了两者的大部分参数,只须要训练很少一部分。 训练分为两个阶段。 传统预训练阶段,在4张A100上应用500万图文对,10个小时内就能够实现,此时训练进去的Vicuna已可能了解图像,但生成能力无限。 而后在第二个调优阶段再用一些小的高质量数据集进行训练。这时候的计算效率很高,单卡A100只须要7分钟。 并且团队正在筹备一个更轻量级的版本,部署起来只须要23GB显存,这也就意味着将来能够在一些生产级的显卡中或者就能够进行本地训练了。 这里也给大家看几个例子。 比方丢一张食物的照片进去来取得菜谱。 或者给出一张商品的照片来让其帮忙写一篇文案。 当然也能够像之前GPT-4发布会上演示的那样,画出一个网页,让其帮忙生成代码。 能够说,GPT-4发布会上演示过的性能,MiniGPT-4根本也都有。 这一点能够说十分amazing了! 可能因为目前应用的人比拟多,在MiniGPT-4网页demo上试用时会遇到排队的状况,须要在队列中期待。 然而用户也能够自行本地部署服务,过程并不简单。 首先是下载我的项目&筹备环境: git clone https://github.com/Vision-CAIR/MiniGPT-4.gitcd MiniGPT-4conda env create -f environment.ymlconda activate minigpt4而后下载预训练模型: 最初在本地启动Demo: python demo.py --cfg-path eval_configs/minigpt4_eval.yaml通过这个我的项目咱们也再一次看出大模型在视觉畛域的可行性,将来在图像、音频、视频等方面的利用前景应该也是十分不错的,咱们能够期待一下。 好了,明天的分享就到这里了,感激大家的收看,咱们下期见。 注:本文在GitHub开源仓库「编程之路」 https://github.com/rd2coding/Road2Coding 中曾经收录,外面有我整顿的6大编程方向(岗位)的自学路线+知识点大梳理、面试考点、我的简历、几本硬核pdf笔记,以及程序员生存和感悟,欢送star。

April 26, 2023 · 1 min · jiezi

关于javascript:vmodel原理用于监听window变量

window.power2 = {isShow:''};Object.defineProperty(window.power2, 'isShow', { get: function() { return this._isShow;}, set: function (val) { this._isShow = val; console.log('?????', val, window.power2.isShow);}});window.power2.isShow=false;

April 25, 2023 · 1 min · jiezi

关于javascript:数据化大屏自适应

个别UI给到的数据化大屏设计稿是电脑屏幕的全屏分辨率(即宽高16:7的占比),所以为了适应浏览器可视化窗口的比例,用transform: scale()实现。留神:固定了宽高比,所以窗口比例有余时,高低或左右会呈现空白区(可外层套个容器,给与大屏主色调相近的背景色)。 JS写法: // 设计稿宽高const designDraftWidth = 1920; //设计稿的宽度const designDraftHeight = 1080; //设计稿的高度//数据大屏自适应函数const screenAdapt = () => { // 获取可视化窗口宽高与屏幕大小宽高比 const wScale = window.innerWidth / designDraftWidth; let hScale = window.innerHeight / designDraftHeight; // 判断宽高比例,选较大的 let currentScale = wScale > hScale ? hScale : wScale; // 给须要自适应的大屏增加款式 document.querySelector("#div").style = `width:${designDraftWidth}px;height:${designDraftHeight}px;transform:scale(${currentScale}) translate(-50%, -50%);position: absolute;left: 50%;top: 50%;-ms-transform-origin: 0 0;transform-origin: 0 0;overflow: hidden;background-size: 100% 100%;transition: 0.8s;`}// 初始化screenAdapt();// 监听屏幕变动window.addEventListener('resize',screenAdapt);React写法 import React from "react";// 设计稿宽高const designDraftWidth = 1920; //设计稿的宽度const designDraftHeight = 1080; //设计稿的高度const Screen = (props) => { const [scale, setScale] = useState(0);// 宽高比 //数据大屏自适应函数 const screenAdapt = () => { // 获取可视化窗口宽高与屏幕大小宽高比 const wScale = window.innerWidth / designDraftWidth; let hScale = window.innerHeight / designDraftHeight; let currentScale = wScale > hScale ? hScale : wScale; setScale(currentScale); } // 初始化 useEffect(() => { screenAdapt(); window.onresize = () => screenAdapt(); //退出大屏后自适应隐没 return () => (window.onresize = null); }, []) return ( <div class="page"> <div class="screenPage" style={{ transform: `scale(${scale}) translate(-50%, -50%)`, width: designDraftWidth, height: designDraftHeight }} > </div> </div> )}export default Screen;/* CSS局部 */.page { background:#000; .screenPage { position: absolute; left: 50%; top: 50%; transform-origin: 0 0; overflow: hidden; background-size: 100% 100%; transition: 0.8s; }}

April 25, 2023 · 1 min · jiezi

关于javascript:5个常见的useState错误

尽管useState是一个简略易用的工具,但仍有许多开发人员在应用它时犯了谬误。在代码审查中,我常常看到即便是有教训的开发人员也会犯这些谬误。 在本文中,我将通过简略实用的示例向您展现如何防止这些谬误。 谬误地获取上一个值在应用setState时,能够将上一个状态作为回调的参数进行拜访。不应用它可能会导致意外的状态更新。咱们将通过一个典型的计数器示例来阐明这个谬误。 import { useCallback, useState } from "react";export default function App() { const [counter, setCounter] = useState(0); const handleIncrement = useCallback(() => { setCounter(counter + 1); }, [counter]); const handleDelayedIncrement = useCallback(() => { // 这里的counter +1 就是一个问题当setTimeout进行回调的时候 counter值可能曾经变动了 setTimeout(() => setCounter(counter + 1), 1000); }, [counter]); return ( <div> <h1>{`Counter is ${counter}`}</h1> {/* This handler works just fine */} <button onClick={handleIncrement}>Instant increment</button> {/* Multi-clicking that handler causes unexpected states updates */} <button onClick={handleDelayedIncrement}>Delayed increment</button> </div> );}当初让咱们在设置状态时应用回调函数。请留神,这也将帮忙咱们从useCallback中删除不必要的依赖项。请记住这个解决方案!这个问题在面试中常常被问到。 ...

April 25, 2023 · 4 min · jiezi

关于javascript:当你写图片的-alt-时你是否犯了这五个错误

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。次要探讨了编写代替文本(alt text)时的五个常见谬误。代替文本用于为视觉受限的用户提供图像的文字描述。以下是五个须要防止的谬误: 简短的形容:形容应该简洁明了,防止应用过长的句子。个别状况下,125个字符就足够了。疏忽功能性图片:如果图片具备功能性,如按钮或链接,形容应明确图片的性能,而非仅形容图片外观。形容图片中的文字:如果图片中蕴含文字,代替文本应蕴含这些文字内容,以便视觉受限的用户可能获取相干信息。以图片结尾:防止在形容中应用"image of" ,"picture of" 或 "graphic of"等词语,因为屏幕阅读器会主动告诉用户有图片。5.齐全疏忽代替文本:为每张图片提供代替文本至关重要,哪怕形容很简略。这有助于进步网站的可拜访性。总之,为了使网站更具可拜访性,咱们应该防止上述五个谬误,为视觉受限的用户提供更好的在线体验。正确应用代替文本有助于改善网站的无障碍性能,让更多人可能顺利地拜访和应用网站内容。 注释开始~ 然而大多数人不晓得如何编写良好的代替文本、我也是其中之一。 我在高中建网站时第一次理解到代替文本。然而我的正式课程是在我加入Udacity数字营销纳米学位课程时开始的,这也是我第一次接触营销。 在这个模块中,我学习了如何构建易于导航的网站构造、题目标签、面包屑和元形容——所有好的货色。咱们还学习了如何编写代替文本及其重要性。 有时候,简略就是杀手当你询问他们时,大多数专家的倡议也归结为:形容你所看到的。尽管这是无效的倡议,看起来很简略,但实际上并非如此。 以Udacity的例子为例:这是适当的代替文本吗? 如果你闭上眼睛,有人向你朗诵“吃苹果心脏病”这句话,这是否有助于你了解图像中的内容? 这个例子怎么样? 答案是相对不行。 我过来只是形容我看到的两周前,我看到了汤米·沃克(Tommy Walker),一位前Shopify高级内容营销师和编辑,对一篇文章的alt文本应用进行了批评。 请留神,alt文本没有传播审核后果。具备讥刺象征的是,这篇文章在为可拜访性辩护。但它使观点更清晰。第一次,我意识到我始终以来都在谬误地编写alt文本。 这让我很好奇,所以我开始进行钻研: 我浏览了许多UX和SEO博客我与那些畛域的从业者交谈过,而且我与一些低视力社区的成员聊天了这是我学到的并且当初利用于我写的文章的内容: 1. 一些图片应该应用空的alt属性首先,廓清一下: alt 属性是HTML语法alt文本是指在alt属性引号中蕴含的形容所有图像都须要一个 alt 属性,但并非所有图像都须要alt文本。这是两个不同的事件,所以不要混同它们。 那么,如何晓得图像是否须要一个空的 alt 属性?装饰性/信息性/活动性办法。 装饰性图片(DECORATIVE IMAGES)装饰性图片的惟一价值在于美学。如果 alt 被移除,网页依然可能完满地表白意思。 一些例子是没有文本的网站横幅和其余设计元素。对于这种类型的图像,咱们应该省略形容,但始终包含一个空的 alt 属性。 <!-- Sample decorative image --><img alt="" src="decorative-banner.png" />信息图像(INFORMATIVE IMAGES)信息图像为文章中出现的信息减少了额定的背景。一些例子包含图表、图示、投票后果和产品截图。在形容它们时要留神。随着浏览的进行,咱们将学会如何形容它们。 <!-- Sample informative image --><img alt="A small, black, compact digital camera." src="product-photo.png" />流动图片(ACTIVE IMAGES)流动图片用于执行诸如注册、下载、收听、上传等操作。 它们次要是链接和按钮。在为这些类型的图像编写 alt 时,防止应用“Click here”等术语。 ...

April 25, 2023 · 1 min · jiezi

关于javascript:Git-最强葵花宝典

更多内容,见 Git 葵花宝典账户配置配置全局账户,对所有 Git 仓库无效git config --global user.name 'Your Name'git config --global user.email 'Your Email'配置部分账户,只对以后 Git 仓库无效git config --local user.name 'Your Name'git config --local user.email 'Your Email'查看全局配置git config --global --list查看部分配置git config --local --list本地基本操作初始化本地库git init查看状态git status增加暂存区 git add将当前目录及其子目录下所有变更增加到暂存区git add .将本地库所有变更增加到暂存区git add -A指定文件增加暂存区git add file1 file2 ...提交本地库 git commit提交所有变更git commit# orgit commit -m '日志信息' -a提交当前目录及其子目录的变更git commit -m '日志信息' .提交指定文件git commit -m '日志信息' fileName比拟差别 git diff比拟工作区和暂存区的所有差别,只能查看旧文件的变更(包含批改和删除),不能查看新文件(因为新文件还为被 git 追踪)git diff比拟指定文件工作区和暂存区的差别git diff fileName比拟暂存区和 HEAD 的所有差别git diff --cached比拟指定文件暂存区和 HEAD 的差别git diff --cached fileName比拟两个版本的差别以前者为基准看后者的变动HEAD 示意最初一次 commit 对应的版本,HEAD~1 往前一个版本git diff 版本号1 版本号2git diff HEAD~1 HEADgit diff HEAD~2 HEAD比拟两个分支指定文件的差别git diff 分支1 分支2 fileName查看日志信息 git log查看简要日志信息git reflog查看具体日志信息git log查看极简日志信息git log --oneline查看最近 n 次的版本信息git log -n查看所有分支的版本历史git log --all以图形模式展现版本历史git log --graph查看波及到指定文件的 commit 记录git log fileName查看指定文件每一行批改对应的 commit 记录和作者git blame fileName分支命令创立分支基于以后分支创立分支git branch 新分支基于指定分支创立分支git branch 新分支 已有分支基于某个 commit 创立分支git branch 新分支 commitID基于以后分支创立分支并切换到新分支git checkout -b 新分支基于近程分支创立新分支git checkout -b 新分支 别名/近程分支名git checkout -b test_2023 origin/test_2023查看本地分支git branch -v删除分支平安删除本地分支git branch -d 分支强制删除本地分支git branch -D 分支切换分支git checkout 分支名合并分支合并本地分支merge 和 rebase的区别有待学习实际 ...

April 24, 2023 · 2 min · jiezi

关于javascript:JavaScript对象

为感激大家的反对,特发福利红包(支F宝口令红包),点击返回支付:Gitee对象分类内置对象:指由 ECMAScript 标准定义的对象,如 Object、Array、Date、Math 等,它们在 JavaScript 运行环境中主动创立,开发者能够间接应用,不须要额定定义或引入原生对象:指由 ECMAScript 标准定义的根本数据类型对象,如 String、Number、Boolean、Symbol、BigInt,这些对象是基于相应的原始值创立的,开发者也能够自行创立宿主对象:指由宿主环境(如浏览器、Node.js 等)提供的对象,如浏览器中的 window、document、XMLHttpRequest 等,这些对象能够间接在对应的宿主环境中应用自定义对象:指由开发者本人创立的对象,能够通过构造函数或对象字面量等形式定义,开发者能够自在地增加和批改对象的属性和办法,实现本人的业务需要须要留神的是,内置对象和原生对象在 JavaScript 运行环境中都是默认可用的,而宿主对象则取决于具体的宿主环境,自定义对象则是开发者依据本人 的需要创立的。因而,在应用这些对象时,须要依据具体情况进行应用和解决 对象阐明原始类型对象:JavaScript 有 6 种原始类型,包含数字、字符串、布尔值、null、undefined 和 Symbol。对于这些原始类型,JavaScript 提供了对应的构造函数 Number、String、Boolean 和 Symbol,能够应用它们来创立原始类型对象。 Number 对象:示意数字类型的数据,罕用办法有:toFixed()、toExponential()、toPrecision() 等。String 对象:示意字符串类型的数据,罕用办法有:charAt()、concat()、indexOf()、match()、replace()、slice()、split()、substring()、toLowerCase()、toUpperCase() 等。Boolean 对象:示意布尔类型的数据,次要用于比拟操作,例如 true 和 false。Null 对象:示意一个空值对象援用,实际上只有一个值 null。Undefined 对象:示意未定义的值,通常在变量未声明或者没有赋值时应用。Symbol 对象:是 ECMAScript 6 中新增的一种数据类型,示意举世无双的值。次要用于创建对象的公有属性、防止属性名抵触等场景。罕用办法有:Symbol()、Symbol.for()、Symbol.keyFor() 等援用类型对象:JavaScript 中除了原始类型以外,所有的值都是对象,这些对象被称为援用类型对象。它们能够存储任意类型的数据,并且能够动静地增加、批改和删除属性。常见的援用类型包含 Object、Array、Function、Date、RegExp、Map、Set 等。 Object 对象:是所有援用类型的根底对象,具备属性和办法,次要用于存储和操作数据,包含数组、函数、日期等。Function 对象:用于示意函数类型的数据,能够接管参数并执行代码,罕用办法有:apply()、call()、bind() 等。Array 对象:是一种非凡的对象,用于示意数组类型的数据。数组是一种有序的、可变长度的汇合,能够存储任何类型的数据。罕用办法有:push()、pop()、shift()、unshift()、slice()、splice()、sort()、reverse()、concat()、join()、indexOf()、lastIndexOf() 等ArrayBuffer 对象:是一种用于示意二进制数据的对象,用于在内存中存储二进制数据。它提供了一个固定大小的缓冲区,能够存储任意类型的数据。罕用办法有:byteLength 等Date 对象:用于示意日期和工夫类型的数据,罕用办法有:getDate()、getDay()、getMonth()、getFullYear()、getHours()、getMinutes()、getSeconds()、getTime() 等。RegExp 对象:用于示意正则表达式类型的数据,罕用办法有:test()、exec() 等。Math 对象:用于进行数学运算的对象,罕用办法有:abs()、ceil()、floor()、max()、min()、round()、random()、sqrt() 等JSON 对象:用于序列化和反序列化 JSON 数据的对象。罕用办法有:JSON.stringify()、JSON.parse() 等Map 对象:用于示意键值对的汇合,能够应用任何类型的值作为键或值,罕用办法有:set()、get()、has()、delete() 等。Set 对象:用于示意惟一值的汇合,罕用办法有:add()、has()、delete()、clear() 等Promise 对象:用于示意异步操作的后果,能够在异步操作实现时获取后果。它能够解决异步代码,防止回调函数的层层嵌套。罕用办法有:then()、catch()、finally() 等Proxy 对象:用于代理另一个对象,并能够在其上定义自定义行为。它提供了一个拦截器,能够拦挡对象的所有操作,并提供了一些罕用的办法和附加的属性。罕用办法有:get()、set()、has()、deleteProperty()、apply() 等Error 对象:是 JavaScript 中用于示意谬误的对象,有多个内置的子类,如 SyntaxError、TypeError、RangeError 等。罕用属性有:name、message 等,罕用办法有:throw、try...catch 等

April 24, 2023 · 1 min · jiezi

关于javascript:JavaScript规定了几种语言类型

为感激大家的反对,特发福利红包(支F宝口令红包),点击返回支付:GiteeString、Number、Boolean、Null、Undefined、Object、Symbol(ES6)、BigInt(ES10) 根本类型 拜访:按值拜访存储:栈内存(Stack)援用类型 拜访:按援用拜访存储:堆内存(Heap)typeof:用来检测一个变量是不是根本的数据类型instanceof: 用来判断某个构造函数的 prototype 属性所指向的对象是否存在于另外一个要检测对象的原型链上。简略说就是判断一个援用类型的变量具体是不是某种类型的对象function a() { console.log(1)}let b = '1'console.log( a instanceof Function) // trueconsole.log( b instanceof String) // falseconsole.log( typeof(b) === String) // falseconsole.log( typeof(b) === 'string') // true变量申明 申明变量的形式有三种:var、let、const(es6新增let和const关键词来申明变量)var var能够进行变量晋升(预解析),只晋升变量申明,不晋升变量赋值var能够进行变量的反复定义(后定义的值会笼罩原先定义的值)var定义的变量,只有在function当中定义内部无法访问,其余比方在for,if,while外部定义的都能够在内部进行拜访var定义的变量的作用域是window,能够用"window.变量名"来进行调用(个别都会省略简写)let let不能进行变量的晋升,不能进行变量的反复定义,也不能定义其余(var,const)形式曾经定义过得变量let定义变量会有长期死区(在let变量未定义之前的区域都称作长期死区,即在这些区域当中不可能拜访到let所申明的变量)let定义的变量会造成一个块级作用域,在for,if,while外部定义变量在内部无奈进行拜访.相似函数外部的变量,这也是造成闭包的一种形式let定义的变量作用域属于global,所以不能用"window.变量名"来调用;而global不会裸露在全局当中,所以也无奈通过"global.变量名"来调用const const个别是用来定义常量(1,2,a,b…),一旦定义,不能批改const申明变量必须赋值,否则间接报错开发中,咱们约定俗成的将const定义的变量名全副大写const 如果定义的是对象、数组、函数、援用数据类型。能够扭转其中的存储的数据const定义的变量作用域也属于global,也会有长期死区,也会造成块级作用域使内部无法访问const不能进行变量的晋升,不能进行变量的反复定义,也不能定义其余(var,let)形式曾经定义过得变量在函数外部不定义间接进行赋值的变量(隐式申明),作用域属于全局,当函数执行之后在内部能够拜访失去函数申明不论是在文档的何处地位都将被晋升到顶部,并且函数定义也被晋升

April 24, 2023 · 1 min · jiezi

关于javascript:javascript判断数据类型的方式以及优缺点

为感激大家的反对,特发福利红包(支F宝口令红包),点击返回支付:Gitee根本类型String、Number、Boolean援用类型Null、Undefined、Objecttypeof最容易想到的是typeof,返回一个示意数据类型的字符串,返回后果包含: number boolean string object undefined function等,typeof能够对根本类型做出精确的判断,在对于援用类型的返回,基本上都是object。 // 根本类型var a = 1var b = "1"var c = falsevar d = undefinedconsole.log(typeof a) // numberconsole.log(typeof b) // stringconsole.log(typeof c) // booleanconsole.log(typeof d) // undefined// 检测办法var e = function(){}console.log(typeof e) // function// 检测null、数组、日期、正则、对象,后果全为object var f = []var g = nullvar h = new Date()var i = new RegExp()var j = {}console.log(typeof f) // objectconsole.log(typeof g) // objectconsole.log(typeof h) // objectconsole.log(typeof i) // objectconsole.log(typeof j) // objectinstanceof用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false; 注:instanceof检测的是原型 ...

April 24, 2023 · 2 min · jiezi

关于javascript:js小数运算精度丢失问题解决方案-JavaScript精度丢失问题详解

为感激大家的反对,特发福利红包(支F宝口令红包),点击返回支付:GiteeJavaScript中的数值计算会存在精度失落问题,这是因为JavaScript应用IEEE 754规范的浮点数表示法来示意数字,这种示意办法无奈准确示意所有数字,特地是波及到小数的时候。除javascript外,java、python等都有相似问题,因为浮点数IEEE754是被广泛应用的规范 示例console.log(0.1 + 0.2) // 0.30000000000000004console.log(0.2 + 0.4) // 0.6000000000000001console.log(19.9 * 100) // 1989.9999999999998本源整数:因为数据太大,最大数2^53小数:因为小数在转换成二进制时呈现了有效循环解决方案对于整数,前端呈现问题的几率可能比拟低,只有不超过2^53就不会失落精度对于小数,前端呈现问题的几率还是很多的,先把小数变成整数(乘倍数),再放大回原来倍数(除倍数)实现思路判断两个数的类型和值是否正确,如果不正确则返回null或抛出谬误。判断两个数的小数位数,取其中较大的小数位数,将两个数都扩充相应倍数,转换成整数。进行数值运算,失去后果。ChatGPT提供的办法function calculate(num1, num2, operator) { // 判断类型和值是否正确 if (typeof num1 !== 'number' || typeof num2 !== 'number' || isNaN(num1) || isNaN(num2)) { return null; } // 判断运算符是否正确 if (operator !== '+' && operator !== '-' && operator !== '*' && operator !== '/') { return null; } // 正则验证 if (!/^-?\d+(\.\d+)?$/.test(num1) || !/^-?\d+(\.\d+)?$/.test(num2)) { return NaN; } // 将两个数扩充相应倍数 const multiplier = Math.pow(10, Math.max(getDecimalDigits(num1), getDecimalDigits(num2))); const int1 = Math.round(num1 * multiplier); const int2 = Math.round(num2 * multiplier); // 进行数值运算 let result; switch (operator) { case "+": result = (int1 + int2) / multiplier; break; case "-": result = (int1 - int2) / multiplier; break; case "*": result = (int1 * int2) / Math.pow(multiplier, 2); break; case "/": result = (int1 / int2) * (multiplier / Math.pow(10, getDecimalDigits(num2))); break; default: result = NaN; } return result;}function getDecimalDigits(num) { if (Number.isInteger(num)) { return 0; } return num.toString().split(".")[1].length;}console.log(calculate(0.1, 0.2, '+')) // 0.3console.log(calculate(0.2, 0.4, '+')) // 0.6console.log(calculate(19.9, 100, '*')) // 1990

April 24, 2023 · 1 min · jiezi

关于javascript:3分钟搞定ES6-模块化

ES6 模块ES6 应用 export 和 import 导出和导入模块。 导出模块一个模块就是一个独立的 JS 文件,该文件内的变量内部无奈获取。若心愿能让内部获取模块内的变量,则要用 export 关键字裸露变量。 // 别离裸露(命名行内导出)export const age = 66export let name = 'Bruce'export function sayHello() { console.log('hello from m1.js')}// 对立裸露(命名子句导出)let book = '红宝书'let price = 129let bookInfo = { author: 'Matt Frisbie', translator: '李松峰',}// 能够应用 as 关键字重命名,改名后原来的名字就不能用了export { book, price, bookInfo as bookMessage }// 默认裸露(默认导出)export default { color: 'red', edition: 4,}一个模块只能有一个默认导出,反复的默认导出会出错。 // SyntaxErrorconst obj = { age: 44 }export default objexport default { name: 'Modules'}默认裸露和对立裸露能够组合到一起。 ...

April 23, 2023 · 2 min · jiezi

关于javascript:经典链式调用-PersonDansleep2eatdinner

实现: // Person('Li')/* 输入:Hi! This is Hank!*/// Person('Dan').sleep(3).eat('dinner')/* 输入:Hi! This is Hank!// 期待10秒..Wake up after 10Eat dinner~*/// Person('Jerry').eat('dinner~').eat('supper~')/* 输入:Hi This is Hank!Eat dinner~Eat supper~*/Person('Smith').sleepFirst(2).eat('supper')/* 期待5秒,输入Wake up after 5Hi This is Hank!Eat supper*/function Person(name) { return new CreatePerson(name)}class CreatePerson { constructor(name){ this.tasks = [] // 外围,应用队列(数组)来存储要执行的函数 this.tasks.push(()=> console.log(`Hi! This is ${name}`)) this.runTask() } runTask() { // 要害!利用宏工作将事件提早执行 // 如果遇到 sleepFirst,能够先将 sleepFirst 压入工作队列,而后按程序执行 setTimeout(() => this.exector()) } exector() { if(this.tasks.length === 0) return // 递归进口 const task = this.tasks.shift() // 取出工作 if(typeof task === "number") { setTimeout(() => { console.log(`Wake up after ${task}`) this.exector() // 递归本身 }, 2000) } if (typeof task === 'function') { task() this.exector() // 递归本身 } return this } // 保护各种工作,用工作队列存储 eat(food) { this.tasks.push(() => console.log(`Eat ${food}~`)) // 惯例操作,塞进工作队列 return this } sleep(time) { this.tasks.push(time) // 惯例操作,塞进工作队列 return this } sleepFirst(time) { console.log(1); this.tasks.unshift(time) // 执行:塞进第一项! return this }}

April 23, 2023 · 1 min · jiezi

关于javascript:线上多域名实战

本文博主给大家分享线上多域名实战,当线上主域名不可用的状况下,启用备用域名实现网站高可用保障。 网站的高可用性始终是网站运维的重中之重。一旦网站宕机,不仅会造成微小的经济损失,也会重大影响用户体验。备份域名就是一种实现网站高可用的重要伎俩。通过备份域名,能够在主域名不可拜访时疾速切换域名,保障网站失常运行。一、前情回顾博主上个星期,线上我的项目忽然呈现了大量用户无奈关上我的项目网站,技术支持分割技术人员(也就是博主我)在用户电脑上复现了这一状况。 通过博主排查,发现在客户电脑拜访主域名时,会呈现连贯超时,通过 curl 进一步剖析连贯详情,举例如下: C:\Users\16697>curl -v www.wayn.com* Uses proxy env variable http_proxy == 'http://11.22.11.22:4780'* Trying 11.22.11.22:4780...发现线上主域名在用户电脑上返回的 CDN 节点 11.22.11.22 存在拜访不通的状况。博主便跟运维沟通 CDN 节点不通的问题,运维回复是 CDN 节点不通是无奈防止的,要看 CDN 厂商对于用户的笼罩状况,倡议线上我的项目应用多域名,并且每个域名应用不同的 CDN 厂商,最大限度防止主备域名都不可用。 OK,失去的运维的意见,咱们开始着手做多域名实现计划。 二、购买备用域名实现域名高可用解决方案,首先须要筹备一到两条与主域名性能和模式类似的备份域名。如下 主域名www.wayn.com备用域名一bak1.wayn.com备用域名二bak2.wayn.com购买备份域名后,须要留神一下两点: 须要在域名服务商那设置DNS记录,将主域名和备份域名指向同一个IP地址。同时也须要为两个域名设置雷同的CDN减速和平安证书,保障用户拜访体验统一。将备份域名的网站配置(nginx配置文件)与主域名保持一致。确保应用备份域名也能够拜访咱们的网站。三、主备域名切换实战这里咱们介绍一下通过 JavaScript 代码来实现网站的主备域名如何进行切换。 JavaScript 实现域名切换的流程如下: 在页面启动时,首先发动对主域名的申请,判断其是否可能失常响应。如果启动时主域名不可拜访,就会拜访备份域名。针对每个备用域名每隔一秒发送三次申请,如果都能拜访胜利则认为备用域名可用。代码如下: // ES6 的模块引入形式import fetch from 'node-fetch'const domain = 'https://www.wayn111.com'const bakDomains = ['http://bak1.wayn.com', 'http://baidu.com']masterDomainCheck()// 主域名检测,如果不可用会查看备用域名是否可用async function masterDomainCheck() { try { await fetch(domain) console.log('主域名启用胜利') } catch (e) { // console.log(e) try { await getBakDomain() console.log('备用域名可用') } catch (e) { console.log('备用域名也不可用') } }}// 拜访备用域名,返回其中可用的一个域名async function getBakDomain() { const apiPromiseList = [] for (let i = 0; i < bakDomains.length; i++) { apiPromiseList.push( new Promise((resolve, reject) => { bakDomainCheck(bakDomains[i], 3, resolve, reject) }) ) } return await Promise.any([...apiPromiseList])}// 域名检测逻辑async function bakDomainCheck(url, count, resolve, reject) { console.log(count) if (count > 0) { try { await fetch(url) bakDomainCheck(url, --count, resolve, reject) } catch (e) { console.log('e') reject(e) } } else { console.log(`bak domain:${url} access success`) resolve({ url, count }) }}以上代码通过博主实测,大家感兴趣能够将代码拷贝在本地跑一遍。 ...

April 22, 2023 · 2 min · jiezi

关于javascript:3分钟搞懂JavaScript-和-ECMAScript

JavaScript 和 ECMAScriptECMAScript 是 JavaScript 语言的国际标准,JavaScript 是 ECMAScript 的一种实现(Adobe ActionScript 和 JScript 同样实现了 ECMAScript)。 ECMAScript 是欧洲计算机制造商协会 ECMA(European Computer Manufacturers Association)公布的浏览器脚本语言规范。它是 262 号标准文件,又叫 ECMA-262。 ECMAScript 定义了语言在语法、类型、语句、关键字、保留字、操作符、全局对象的标准。 JavaScript 并不仅限于 ECMAScript。在浏览器中,JavaScript 包含 ECMAScript、文档对象模型 DOM、浏览器对象模型 BOM。 日常工作中认为 JavaScript 和 ECMAScript 是同义词,也懒得做辨别了。 ES5 和 ES6这次要是 ECMAScript 版本命名形式的扭转。 一开始 ECMAScript 应用版本号进行命名,ECMAScript 1.0 称为 ES1,ECMAScript 2.0 称为 ES2。 从 ES6 开始,规范委员会决定于每年 6 月份公布新版本,并且以年份进行命名。2015 年 6 月公布了 ECMAScript 2015(ES2015),若依照版本号即为 ES6。 当初 ES6 泛指 ECMAScript 5.1 之后的 ECMAScript 规范。ES6 是个分水岭,新增了一大批个性。 ...

April 22, 2023 · 1 min · jiezi

关于javascript:1-分钟给-Siri-升个级从智Z变身-ChatSiri

原文链接:https://forum.laf.run/d/79/17家喻户晓,Siri 是一个智 Z!那么如果能接入大火的 chatGPT,是不是就会从智 Z 变成人工智能?! 家喻户晓,Laf 是一个集函数、数据库、存储为一体的云开发平台,能够随时随地公布上线代码!那么如果能应用 Laf 来实现将 Siri 接入 ChatGPT,是不是只须要写一个云函数就完事,而无需关怀部署、运维等所有与业务无关的糟心事?! 话不多说马上开始! 接入步骤创立并公布云函数首先须要注册登录 Laf 海内节点,而后新建云函数,我这里命名为 siri。 替换下方代码: import cloud from '@lafjs/cloud'export async function main(ctx: FunctionContext) { const { ChatGPTAPI } = await import('chatgpt') const data = ctx.body // 这里须要把 api 对象放入 cloud.shared 不然无奈追踪上下文 let api = cloud.shared.get('api') if (!api) { api = new ChatGPTAPI({ apiKey: cloud.env.CHAT_GPT_API_KEY }) cloud.shared.set('api', api) } let res // 这里前端如果传过来 parentMessageId 则代表须要追踪上下文 if (!data.parentMessageId) { res = await api.sendMessage(data.message) } else { res = await api.sendMessage(data.message, { parentMessageId: data.parentMessageId }) } return res}新建环境变量,把你的 ChatGPT 的 key 填进去: ...

April 20, 2023 · 1 min · jiezi

关于javascript:JavaScript-全预解析

●预解析 其实就是聊聊 js 代码的编译和执行●js 是一个解释型语言,就是在代码执行之前,先对代码进行通读和解释,而后在执行代码●也就是说,咱们的 js 代码在运行的时候,会经验两个环节 解释代码 和 执行代码●JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function结尾的语句块提前进行解决●处理过程:当变量和函数的申明处在作用域比拟靠后的地位的时候,变量和函数的申明会被晋升到作用域的结尾。 解释代码和执行代码●因为是在所有代码执行之前进行解释,所以叫做 预解析(预解释)●须要解释的内容有两个○var 关键字■在内存中先申明有一个变量名■会把 var 关键字申明的变量进行提前阐明, 然而不进行赋值○申明式函数■在内存中先申明有一个变量名是函数名,并且这个名字代表的内容是一个函数■也就是会把函数名进行提前申明, 并且赋值为一个函数 解析var关键字 // 1. 解析 var 关键字console.log(num)var num = 100console.log(num)代码剖析: 预解析 var num通知浏览器, 我定义了一个叫做 num 的变量, 然而没有赋值代码执行第 1 行代码, 在控制台打印 num 变量的值因为预解析的时候, 曾经申明过 num 变量, 只是没有赋值num 变量是存在的打印进去的是 undefined第 2 行代码, num = 100给曾经定义好的 num 变量赋值为 100 这个数据第 3 行代码, 在控制台打印 num 变量的值因为第 2 行代码的执行, num 曾经被赋值为 100 了此时打印进去的内容是 100解析赋值式函数●赋值式函数会依照 var 关键字的规定进行预解析 fn()var fn = function() { console.log('fn 函数') }fn()○代码剖析:预解析var fn通知浏览器我定义了一个叫做 fn 的变量, 然而没有赋值代码执行第 1 行代码, fn()拿到 fn 变量存储的值当做一个函数来调用一下因为 fn 只是申明了变量, 并没有赋值, 所以 fn 是一个 undefined咱们做的事件是, 把 undefined 当做一个函数来调用报错: fn is not a function解析申明式函数 ...

April 20, 2023 · 2 min · jiezi

关于javascript:Set集合

Set是值的汇合,且汇合内的元素只会呈现一次。 Set的根本API如下new Set ---创立汇合 const set = new Set(); //创立一个名为set的汇合console.log(set);add---增加元素 //在set汇合中插入1,2,3 2不会被反复增加set.add(1).add(2).add(2).add(3);console.log(set); //{ 1, 2, 3 }delete---删除元素 //从汇合set中删除元素3set.delete(3);console.log(set); //{ 1, 2 }has---元素是否在汇合中 //判断1是否存在汇合set中console.log(set.has(1)); //truesize---汇合大小 //size属性返回汇合元素个数(汇合大小)console.log(set.size); //2for of---遍历汇合 //遍历汇合setfor (const item of set) { console.log(item); //1 2}Set应用场景数组去重 const A = [1, 2, 2, 3, 3, 4];console.log(new Set([...A])); //{1,2,3,4}汇合并集 const A = new Set([1, 2, 3]);const B = new Set([2, 3, 4]);const union = new Set([...A, ...B]); //并集{1,2,3,4}交加 const intersection = new Set([...A].filter((x) => B.has(x)));//交加{2,3}差集 ...

April 19, 2023 · 1 min · jiezi

关于javascript:GET和POST请求区别

首先看一下菜鸟教程中对于GET和POST申请的比拟 对于HTTP最后是浏览器与服务器之间的通信协定,GET用于读取资源,POST用于提交表单起初被裁减到接口格局的定义,GET和POST 作为接口的申请形式,格局如下 { method:{GET/POST} url:"" header:{} body:{} }协定外围包含method,url,header,body组成。其中method就是形容具体的申请形式,能够是GET或POST或者其余,协定自身并没有要求GET申请的参数肯定要放query,POST申请的参数肯定要放body,也就是说,从接口定义的角度去看,纯正只是一个申请形式的差别,协定自身并没有对两者做过多的限度,齐全能够把该申请的参数放到body或把POST申请的参数放到query,当然过分的放开会减少我的项目开发的沟通老本,升高开发效率。对于下面的问题工程师提出了一系列的解决方案,其中RESULTFUL接口标准应用面最为宽泛。 GET申请有下限,POST传输无下限?这种说法是比拟全面的,GET申请参数个别约定俗称的放在URL的query中,而又因为URL的长度有下限,因而得出这个论断,而对于URL的长度,HTTP协定自身也没有对GET或者POST做过多的限度,只是浏览器和服务端别离做了不必水平的限度而已,浏览器IE限度在2048个字符,Chrome限度在2M... GET申请:http://xxx/xx?a=1&b=2POST申请:http://xxx/xxbody:{ "a": 1, "b": 2}为何要这个限度呢?服务端解析一个字符串时,须要分配内存,而URL必须作为一个整体去对待,没有方法分块解决,所以必须调配一块足够大的内存空间来存储URL。如果URL过长或者并发量过高,就很容易挤爆服务器的内存。为了解决这个性能问题,所以各端对URL长度做了不同水平的限度,这个此案时GET申请数据有下限的起因。 POST比GET更平安?网上常常能够看到POST比GET申请更为平安,其实是谬误的,正如后面所说,在HTTP协定上,GET和POST实质上只是申请形式的不同,协定并没有做过多的限度,只是从标准上,约定俗成的更偏向于把GET申请的参数放到query中,把POST申请的参数放到body上,这样相当于GET申请的参数间接放到了URL上,如果两头带有明码信息,直观上显得并不那么平安,但从网络安全而言,query和body上的参数都是明文的,HTTP自身就是不平安的协定,申请在任何一个网络节点被劫持,内容都是通明的,况且GET和POST只是申请形式的不同,自身并不对平安起到任何作用,真正要做到平安须要双端加密,如HTTPS双端加密后,即便在任何网络节点截取到了包,也截取不到内容,这样才是实质上的平安。

April 19, 2023 · 1 min · jiezi

关于javascript:vue对CSV文件进行表格预览

1.CSV文件阐明逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也能够不是逗号),其文件以纯文本模式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。倡议应用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是办法之一。2.CSV数据格式转换上面是一个理论 CSV 文件中的局部内容,让大家对他有一个理性的意识。咱们选的是 Sjojo_Rescan 的 CSV 文件 (Sjojo 是 ASW- 亚洲扫图风的成员之一)。文件名, 文件大小 (以字节为单位),CRC 校验值,sj_mino1001.jpg,715282,4FB55FE8,sj_mino1002.jpg,471289,93203C5C,sj_mino1003.jpg,451929,C4E80467, 通常 CSV 文件结尾是不留空的,以行为单位,每行中记录一张图片的多项数据,每项数据用逗号来分隔(规范英文逗号)。一般说来集图用的.CSV 文件的格局是这样的:文件名, 文件大小 (以字节为单位),CRC 校验值, 正文 (可省略)sj_mino1001.jpg,715282,4FB55FE8, 默认状况下,咱们认为csv的第一行数据是表头,所以,咱们预期是将下面这段内容转为:想展现成如下表格成果: 文件名文件大小CRC 值正文 (已省略)sj_mino1001.jpg7152824FB55FE8 sj_mino1002.jpg47128993203C5C sj_mino1003.jpg451929C4E80467 <script>const str = `文件名, 文件大小 (以字节为单位),CRC 校验值,sj_mino1001.jpg,715282,4FB55FE8,sj_mino1002.jpg,471289,93203C5C,sj_mino1003.jpg,451929,C4E80467,`const formatCSVToTable = (str) => { const result = []; const jsonObj = str.split("\n"); let arrHeader = []; for (const i in jsonObj) { if (typeof jsonObj[i] === 'string' && jsonObj[i].length > 0) { const row = `${jsonObj[i]}`; if (row.trim().length > 0) { const kv = jsonObj[i].split(','); if (i == 0) { // 获取column表头 arrHeader = kv; } else { const obj = {}; for (let index = 0; index < arrHeader.length; index++) { // 组装表格数据 const name = String(arrHeader[index]); if (!arrHeader[index]) continue if (!obj[name]) { try { if (kv[index]) { obj[name] = String(kv[index]); } else { obj[name] = ''; } } catch (err) { obj[name] = ''; } } } result.push(obj); } } } } return result }formatCSVToTable(str)</script>输入如下: ...

April 19, 2023 · 1 min · jiezi

关于javascript:羡慕-C-的-switch-表达式不JS-也可以有

对于 C/Java 语系的语言,都有 switch 语法。switch 语法用于多分支是一个规范的用法,但这个分支语法的各分支之间存在穿透性,所以须要 break 来切断逻辑,这也成为 switch 语法中最重要的一个替在缺点起源。此外,因为 switch 语句中各 case 的代码是在同一个作用域中,也会对代码造成一些不便。 C# 8.0 引入了 switch 表达式。C# 的 switch 表达式有着十分丰盛的语法元素,能够和模式匹配和解构等语法元素协同工作 —— 这些都不在这里细说,然而对传统的 switch 语句 进行了一些改良: 通过箭头 (=>) 标记解决了 case 和语句之间的一对一关系,不须要 break,不再穿透;作为表达式,能够而且必须返回值;也产生了新的束缚: switch 表达式肯定要详尽(逻辑肯定会走进某一个 case,能够通过弃元模式兜底),否则可能会在运行时引发异样。在 C# 8.0 公布的同年,Java 12 也公布并引入了 switch 表达式预览。Java 的 switch 表达式实现比较简单,就是 switch 语句到 switch 表达式的间接转换,仅反对等值匹配。直到 2023 年 3 月 Java 20 公布,switch 表达式才开始反对模式匹配。相比之下,Kotlin 的 when 表达式走在了后面。 在这个问题上 JavaScript 仿佛走在了前面,不过在语言提供 switch 表达式之前,咱们能够尝试本人造个轮子。 思路当然是参考策略模式。假如有一个列表,这个列表里的每个元素都蕴含了两个因素:第一个用于判断是否命中,第二个是个函数,失去一个计算结果。而后写一个循环遍历列表的每个元素,一旦某个元素命中,就执行元素携带的函数取得后果,中断循环,返回后果。如果列表的最初一个元素必然命中,那么这个列表就是“详尽”的。 那么这个 when 函数可能会这样写(switch 是关键字,所以应用 when 来作为函数名): ...

April 19, 2023 · 3 min · jiezi

关于javascript:3分钟入门Blob-对象的了解与创建

Blob 对象Blob,英文全称 binary large object,是指二进制类型大对象。 Blob 对象示意不可变的、相似文件对象的原始数据。即它是相似文件对象的二进制数据,能够像操作 File 对象一样操作 Blob 对象。但话又说回来,File 其实是继承自 Blob。 创立 Blob 对象Blob 构造函数new Blob(blobData[, options]) blobData 参数:必须是一个数组,数组每个元素连接起来形成 Blob 对象的数据。可选参数 options:一个对象,为 Blob 对象配置属性。罕用的是 type 属性,指明多媒体 MIME 类型,默认值为 ""。const blob = new Blob(['hello'], { type: 'text/html'})const blob2 = new Blob(['hello'], { type: 'application/pdf'})// 栗子:var data1 = "a";var data2 = "b";var data3 = "<div style='color:red;'>This is a blob</div>";var data4 = { "name": "abc" };var blob1 = new Blob([data1]);var blob2 = new Blob([data1, data2]);var blob3 = new Blob([data3]);var blob4 = new Blob([JSON.stringify(data4)]);var blob5 = new Blob([data4]);var blob6 = new Blob([data3, data4]);console.log(blob1); // Blob {size: 1, type: ""}console.log(blob2); // Blob {size: 2, type: ""}console.log(blob3); // Blob {size: 44, type: ""}console.log(blob4); // Blob {size: 14, type: ""}console.log(blob5); // Blob {size: 15, type: ""}console.log(blob6); // Blob {size: 59, type: ""}Blob 对象的 size 属性代表大小,单位是字节。 ...

April 18, 2023 · 1 min · jiezi

关于javascript:组件卸载时-DOM-树的自动清理机制是怎样的

本文对应的 react 版本是 18.2.0 通过上两讲: 把握 React 组件树遍历技巧useEffect 返回的函数是怎么执行的咱们曾经晓得了 react 是如何找到 passive effect 返回的函数 那么找到这个函数后,怎么执行这个函数呢 咱们先来看上面这段代码: function A() { useEffect(() => { return () => { console.log("执行销毁函数 A"); }; }, []); useEffect(() => { return () => { console.log("执行销毁函数 A1"); }; }, []); return <>文本A</>;}一个组件中有两个 passive effect 返回的函数,react 是怎么安顿执行的程序呢? 一个组件中的 passive effect 是用链表的模式存储的 每个 effect 对象都有 destroy 和 next 属性 destroy 保留的是 passive effect 返回的函数next 保留的是下一个 effect 对象最顶层的 effect 是函数组件中写在最下面的 useEffect,通过 next 指向下一个 effect,以此类推,最初一个 effect 的 next 指向最顶层的 effect ...

April 18, 2023 · 3 min · jiezi

关于javascript:jQuery中出现xeasingthiseasing-is-not-a-function的解决办法

x.easing[this.easing] is not a functionQ: 应用jQuery的fadeIn和fadeOut呈现以下报错,是因为jQuery版本过高导致,有以下两种解决方案。 1、升高jQuery版本至1.9.0以前的版本,上面是jQuery的CDN下载地址和Script脚本行 1) CDN链接:https://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js 2) Script脚本: <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js" integrity="sha512-J9QfbPuFlqGD2CYVCa6zn8/7PEgZnGpM5qtFOBZgwujjDnG5w5Fjx46YzqvIh/ORstcj7luStvvIHkisQi5SKw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>2.应用animate办法实现 .toast{opacity:0}function toast(text = '') { $('.toast').text(text).animate({opacity: 1}, 500) $('.toast').delay(1000).animate({opacity: 0}, 1000)}

April 18, 2023 · 1 min · jiezi

关于javascript:互联网制造业图扑数字孪生智慧工厂车间生产线

前言随着信息技术、自动化技术和人工智能等技术的疾速倒退和利用,智能制作已成为寰球制造业倒退的支流趋势。智能制作是将智能化、自动化、数字化和网络化等技术手段使用到制作过程中,使生产过程具备高度智能化、自动化和数字化的特点,进而进步生产效率,降低生产老本,优化产品质量,推动环保和可继续倒退,使企业的外围竞争力和市场位置失去进一步晋升。 利用工业互联网技术,能够将生产过程中的设施、传感器、产品和人员之间的实时连贯和数据交互,从而达到对生产过程的全方位监控和优化的目标,帮助管理者及时地发现并解决生产过程中呈现的问题,从而晋升生产的安全性和可靠性。 成果展现本文将依靠图扑自研 HT for Web 产品,打造轻量化智慧工厂管理系统。借助传感器、物联网、大数据和云计算等先进技术,将工厂散布及各个生产过程的数据、信息、状态等实时出现在可视化大屏幕上,实现对生产数据的实时监测和剖析,让企业管理者对生产状况有更好的理解,从而晋升生产效率和品质,降低生产老本和能源消耗,推动企业的可继续倒退。 另外利用图扑软件 Web 3D 技术,将智能工厂的工业互联网平台架构和全生命周期的生态平台架构,以三维可视化的形式构建进去,与传统的二维平面图相比,能够更加直观、全面、成果更好、交互性更强,将不同对象之间的空间关系和相互作用体现得更好。 系统分析工厂散布思考到市场需求、原材料起源、人工成本、交通物流等多方面的影响,该场景采取网络式分布模式,将工厂散布在多个城市,联合三维地图,造成构建一幅残缺的企业散布地图。可通过点击交互事件,直观理解各个工厂的生产状况。通过互联网技术和物流配送等模式,实现生产流程的大幅优化,达到降低成本、提高效率的指标。   同时通过集成工厂的生产数据和经营数据,采纳图表、表格、仪表盘等模式,将工厂的仓库总位、质检后果、产线状况、订单量等要害数据指标,以一种视觉化的形式进行展示,帮忙管理者和生产人员迅速把握工厂的实时生产状态和经营状况。实现对生产过程的精密治理和实时干涉,及优化生产打算和资源实时调度。 智慧工厂该场景通过 3D 建模和虚构仿真技术,将理论生产线的设施、工艺和工作流程等对象,进行数字化建模,创立生产线的数字孪生模型。通过在生产线上装置的传感器和监控设施,实时采集生产线的运行数据,包含设施状态、工艺参数、产品质量等信息。将实时采集的生产线数据传输到数字孪生模型中,利用大数据处理与剖析技术,能够对生产线的运行状况进行实时监测与数据分析,不便生产管理人员进行实时决策与调度。 工艺视图 使用图扑软件自主研发的 2D、3D 图形渲染引擎勾画精准数据模型,多维动静展现智慧工厂生产工艺流程,让用户更加直观地理解在生产过程中的每一道工序、每一步操作,以及各个工序之间的关联和依赖关系。同时反对与其余信息系统(如ERP、MES 等)进行集成,实现生产过程的数字化治理和智能化管制,达到生产过程的高效、准确、灵便治理。 ①物料柜 作为整个生产工艺的第一步,因为它是多层、多格的构造,所以它次要用于寄存不同类型和规格的物料,例如零部件、工具、耗材等。具备整洁有序、疾速取料、实时监控、节俭空间和提高效率等长处。 ② CNC 机床 又被称作数控机床,次要用于加工和制作各种零部件和产品,通过事后编写好的程序,由计算机控制机床和其余设施的静止工况,以实现简单的工件加工和制作工作。 ③清洗机 通过低压水或喷雾喷嘴将清洗液喷射到工件外表,借用水流的冲击力和溶解力去除污垢,是一种次要用于荡涤、洗净或去除工件外表污垢、油脂、涂层等杂质的设施,广泛应用于汽车制作、航空航天、电子制作、金属加工、化工等畛域。 ④超声波清洗机 利用超声波振动产生渺小涡流和涡旋,在液体中产生高频的冲击波,从而达到对工件外表荡涤的目标。广泛应用于各种行业,如汽车制作、航空航天、电子制作、光学、医疗器械等。 ⑤抛光机 通过旋转或振动的形式,将研磨、抛光资料与工件外表进行摩擦,从而实现对工件外表的研磨和抛光。可用于改善工件外表的光洁度、光亮度和平整度,晋升产品的外观品质和性能。 ⑥称重机 通过负载传感器、称重传感器或其余测力传感器等,将物体的品质或分量转换成电信号,并通过电子称重仪表或计算机等设施进行数据处理和显示,从而实现对物体的分量信息的精确测量,达到计量、计价、质检、管制和治理等目标。 ⑦刻字机 也称为激光刻字机,通过在资料外表进行激光刻蚀,将文字或图案刻印在资料上,实现个性化、定制化或批量化的刻字需要。 ⑧出料 作为整个生产制作环节的最初一步,已实现的工件在这里进行质量检验,以确保产品合乎预约的质量标准和标准。质检合格的工件将进行后续包装和入库,不合格的工件则会进行报废解决。 图扑可视化解决方案反对跨平台,挪动终端均可轻松关上场景,实现触屏设施的单指旋转、双指缩放、三指平移等操作,用户不用再为跨平台交互模式而懊恼。 能效视图 基于实时数据采集和解决技术,将能源消耗数据和生产效率指标以可视化的形式出现进去(红色-高能效设施,蓝色-低能效设施),有助于企业对各种设施的能效转化状况进行直观的理解。 通过辨认能效异常情况,剖析设施的能效数据,帮助企业评估现有设施的能效状态,进而评估出设施的效率状况。同时依据理论状况制订优化计划,晋升企业的生产效率。 数据看板 通过从多个数据源实时获取数据,选用图扑 HT 丰盛的图表、列表、指标等可视化组件进行直观展现,反对多维度对数据进行切片和切段剖析,帮忙企业实时理解业务经营状况、辨认趋势和问题,并反对数据驱动的决策制定。 图扑 HT 可视化反对编辑器的自定义格调、布局和菜单工具条等内容。可将 2D 和 3D 场景在编辑器上相互嵌套叠加、旋转和缩放,高度组件化无缝交融,承载十万以上级别的 2D、3D 及 UI 的表格树通用组件图元量,满足海量物联网设施和数据场景需要。 ...

April 17, 2023 · 1 min · jiezi

关于javascript:大文件上传

话不多说,间接援用大文件上传(React + axios)

April 17, 2023 · 1 min · jiezi

关于javascript:HHDESK便捷功能介绍二

1 暗藏菜单栏和状态栏点击文件选项,能够依据本身习惯,抉择是否勾选导航及状态栏。 能够在导航条中实现操作选项;若须要显示,按原办法勾上即可。 2 菜单页面拆散右键点击标签,抉择“拆散”独自的页面更加不便操作,能够随便缩放,尤其不便图片浏览与批改。 3 快捷查问零碎及版本点击帮忙——零碎 能够很不便的查看零碎、版本等各项内容。

April 17, 2023 · 1 min · jiezi

关于javascript:js如何将树形结构数组对象变为二维数组

将树形构造的数组对象转换为二维数组能够应用递归和深度优先遍历的办法。以下是一个示例的 JavaScript 代码,展现了如何将树形构造数组对象转换为二维数组: // 树形构造数组对象const treeArray = [ { id: 1, name: '父节点1', children: [ { id: 2, name: '子节点1-1', children: [ { id: 3, name: '子节点1-1-1', children: [] }, { id: 4, name: '子节点1-1-2', children: [] } ] }, { id: 5, name: '子节点1-2', children: [ { id: 6, name: '子节点1-2-1', children: [] } ] } ] }];// 将树形构造数组对象转换为二维数组function tree2Array(treeArray) { const result = []; function flatten(node, level) { result.push({ id: node.id, name: node.name, level: level }); if (node.children && node.children.length > 0) { node.children.forEach(child => { flatten(child, level + 1); }); } } treeArray.forEach(node => { flatten(node, 0); }); return result;}// 调用函数进行转换const cArray = tree2Array(treeArray);console.log(cArray);treeArray 是一个树形构造的数组对象,蕴含了节点的 id、name 和 children 属性。 ...

April 17, 2023 · 1 min · jiezi

关于javascript:关注点分离与React-Hooks

React是毋庸置疑的最受欢迎的前端JavaScript框架/用户界面库之一。但这并不意味着它是最好的,或者每个人都喜爱它。 React的一些技术起因让人们不喜爱它,令人诧异的是,其中一个最大的特点也是其中之一——JSX。它是规范JavaScript的扩大,容许您在React组件中应用相似HTML的语法。 React中如此易于辨认、显著有助于进步代码可读性和编写代码的繁难性的一部分如何变成毛病?这归纳于关注点拆散。 Separation of concerns在咱们深刻探讨之前,我想解释一下“关注点拆散”到底是什么,免得脱漏任何奥妙之处。 拆散关注点意味着在不同的概念/内容之间放弃清晰的界线。在编程中,JSX 是疏忽这个规定的一个显著例子。当初咱们不再把形容组件构造的“模板”和它的逻辑放在不同的 HTML 文件和 JS 文件中,而是将它们(如果你应用 CSS-in-JS,可能还有更多)混合在一起,造成了一些人认为是完满的谐和,而另一些人则认为是无序的凌乱。 Personal preference好的,那么将“视图”和“逻辑”混合在一起会毁坏关注点拆散。但这真的很蹩脚吗?这是不是意味着你总是要将组件的视图和逻辑离开? 不,不是的。首先,不足关注点拆散并不一定是一件好事。这是一个开发人员或团队的集体偏好和其余指南的问题。您不用将逻辑和视图离开。然而,如果您这样做,依然不意味着每个局部都须要一个独自的文件。完满的例子是Vue单文件组件(SFC),或者只是在其中蕴含<script>和<style>标签的纯HTML文件。 React hooks拆散关注点是一件事,而React hooks是另一件事。 React Hook 曾经存在了相当长的一段时间了(自稳固版本公布以来曾经有将近两年的工夫),因而它们应该曾经被很多人熟知,并且曾经被其余许多博客和开发人员齐全讲透了。然而让咱们再次简要概述一下。 React hooks容许开发者在函数组件中增加状态和应用其余非凡的React性能,而不是以前须要基于类的组件。它们内置了10个钩子(v17.0.1),每个钩子解决不同的React性能,其中只有4个是罕用的(useState(), useEffect(),useContext()和useRef()),你也能够天然地创立本人的钩子。而正是这最初一点信息最令咱们感兴趣。 Custom hooks只管大家很相熟React hooks,但对于如何创立本人的hooks可能比拟生疏。 内置Hooks曾经足够构建坚硬的React组件,如果还不够的话,在宏大的React生态系统中简直必定会有某种开源库,能够将你所需的确切性能“hookify”。那么,如果不必要,为什么还要学习更多对于自定义钩子的常识呢? Creating a hook并不是非要去自定义钩子的,但它们必定能够使你的工作更轻松 - 特地是如果你喜爱关注点的拆散。 首先 - 如何创立自定义钩子?自定义钩子只是应用其余钩子的函数。就是这么简略。它还应该遵循“[Hooks规定]()”,如果您正在应用ESLint和适当的[官网配置](),这能够很容易地实现,但这就是它。 诚实说,你甚至不用做这些事件 - 应用其余钩子并不是必须的(但相当广泛),如果你的代码品质很好,自定义钩子名称以 use 结尾,并且你依照预期应用钩子(在 React 组件的最高档次上),那么你应该没问题。 Examples这是一个非常简单的挂钩,每秒运行提供的回调函数(因为我想不到更好的办法 ): const useTick = (callback) => { const handle = setInterval(() => { callback(); }, 1000); return () => { clearInterval(handle); };};这是如何应用他们的办法 const Component = () => { const stopTick = useTick(() => { console.log("Tick"); }); return <button onClick={stopTick}>Stop ticking</button>;};如果有一个钩子依赖于另一个钩子,那么这里有一个钩子,通过在后盾应用useState()来强制更新您的组件,而不会产生显著的状态变动。 ...

April 16, 2023 · 1 min · jiezi

关于javascript:3分钟搞定获取-URL-查询参数值

3分钟搞定:获取 URL 查问参数值在前端开发工作中,利用 URL 进行参数传递是一项非常常见的办法。在页面跳转时,通过 URL 携带某些信息,如状态、id、辨别页面起源的字段值等。因而,学习理解如何获取 URL 查问参数值是很重要的。 js 代码手撸利用 JavaScript 代码手撸一个函数,对 URL 查问参数进行解析。这是形式灵便度高,能够进行更多个性化的操作。 const getSearchParams = (url) => { // 获取查问参数前的 ? 对应的索引地位 const searchIndex = url.indexOf('?') // 截取出查问参数字符串,并依据 & 将其宰割成一个个 name=bruce 模式字符串组成的数组 const searchParamsArray = url.slice(searchIndex + 1).split('&') // 遍历数组,组成查问参数对象 return searchParamsArray.reduce((pre, cur) => { const [key, value] = cur.split('=') return { ...pre, // 须要应用 decodeURIComponent 对参数进行解码 [key]: decodeURIComponent(value), } }, {})}// { name: 'bruce', type: 'blog' }getSearchParams('https://www.example.com?name=bruce&type=blog')利用 URLSearchParamsconst searchParams = new URLSearchParams('name=bruce&type=blog')searchParams.get('name') // 'bruce'searchParams.get('type') // 'blog'searchParams.has('type') // true要把所有查问参数转换为对象,须要搭配应用 entries() 和 Object.fromEntries() 办法。 ...

April 16, 2023 · 1 min · jiezi

关于javascript:js中在循环中使用正则表达式遇到的小坑

1、根本数据类型和援用数据类型ECMAScript包含两个不同类型的值:根本数据类型和援用数据类型。\根本数据类型:Number、String、Boolen、Undefined、Null、Symbol、Bigint。\援用数据类型:也就是对象类型Object type,比方:对象(Object)、数组(Array)、函数(Function)、日期(Date)、正则表达式(RegExp)。 so正则表达式属于援用数据类型。 2、我的项目中在循环中应用正则\应用正则匹配111 const regular = /111/g; // 匹配111 console.log(regular.test('111')); // true 匹配胜利 console.log(regular.test('111,111')); // true 匹配胜利循环中应用正则的异样写法 const regular = /111/g; // 匹配111 const list = [ '111', '111', '111,111', '111,111', '111', '111', '111,111', '111,111', '111', '111', '111,111', '111,111', ]; list.forEach((element, index) => { // 异样写法 console.log('log_________' + regular.test(element)); }); 打印还存在false。\起因:/111/g 这种写法看起来像string,但究竟还是正则,正则属于援用型数据类型。援用型数据类型 传统意义中 须要咱们"深拷贝"或者开拓新内存 new Object() 能力使其 内存指向独立进去,而不是让内存指向始终指向初始定义时的源头。 循环中应用正则的正确写法 const regular = /111/g; // 匹配111 const list = [ '111', '111', '111,111', '111,111', '111', '111', '111,111', '111,111', '111', '111', '111,111', '111,111', ]; list.forEach((element, index) => { // 正确写法 new RegExp的内存指向在循环过程中每次都独自开拓一个新的“对象”,不会和前几次的循环regular.test(xxx)扭转后果而混同 // console.log('log_________' + /111/g.test(element)); // 这样写当然也行 console.log('log_________' + new RegExp(regular).test(element)); }); ...

April 16, 2023 · 1 min · jiezi

关于javascript:一文说尽CORS

CORS的英文全称是"Cross-Origin Resource Sharing"。代表“跨域资源共享”,是一种用于在Web浏览器和Web服务器之间共享跨域资源的机制。跨域资源是指来自不同域的网页上的资源,如字体,图像,脚本和样式表等。CORS容许网站服务器提供一组规定,以确定哪些网站能够拜访其资源。 1.什么是跨域申请跨域申请是指从一个Web页面收回的申请,而且其指标资源与以后页面不同源。同源是指协定、域名和端口号都雷同,而不仅仅是域名雷同。如果应用的协定、端口或域名有一个不同,它们就被视为不同源,默认不能够进行跨域拜访。 2.预检(Preflight)申请顾名思义,预检申请用来查看理论申请是否平安可行,确保接下来的理论申请不会引起平安问题。浏览器会在发送预检申请之后期待响应,只有当服务器容许时,才会发送理论申请。 2.1 什么状况下会触发预检申请预检申请的反义词是简略申请,咱们能够看下简略申请的判断规范若申请满足所有下述条件,则该申请是简略申请: 申请办法应用下列办法之一: GETHEADPOST容许手动设置的标头字段为: AcceptAccept-LanguageContent-LanguageContent-Type(须要留神额定的限度)Range(只容许简略的范畴标头值 如 bytes=256- 或 bytes=127-255)Content-Type 标头的值仅限于下列三者之一: text/plainmultipart/form-dataapplication/x-www-form-urlencodedXMLHttpRequest.upload 对象属性上没有注册任何事件监听器也就是说,没有调用 xhr.upload.addEventListener(),以监听上传申请。 申请中没有应用 ReadableStream 对象。 如果不满足上述任何一个条件,都会触发预检申请 2.2 预检申请的CORS解决在CORS中,预检申请的目标是用于查看跨域申请是否平安、可行。预检申请是在正式的跨域申请之前发动的一次探测,用于告知服务器,理论发送的跨域申请是否非法。因而,对于预检申请的解决,须要服务器端进行相应的配置。预检申请的解决步骤如下: 浏览器会先发送一个OPTIONS申请(预检申请),蕴含了理论发送的跨域申请所须要的一些头信息,比方申请办法、申请头等。服务器收到后,会依据申请头中的信息进行判断,判断跨域申请是否平安可行。如果跨域申请非法,服务器会返回带有特定CORS响应头的响应,告知浏览器理论发送的跨域申请是非法的。浏览器接管到服务器的响应后,会查看响应头中的"CORS"信息。如果CORS响应头非法,则浏览器会发送理论的跨域申请,否则会抛出跨域谬误,申请无奈胜利。2.3 非预检申请的CORS解决对于非预检申请,CORS会依照以下规定进行解决: 如果响应头中没有蕴含"Access-Control-Allow-Origin",或者它的值不蕴含以后域名,则浏览器会抛出一个跨域谬误,申请无奈胜利。如果响应头中蕴含"Access-Control-Expose-Headers",则该响应头中列出的头信息能够被前端JavaScript拜访。否则,这些头信息将被浏览器拦挡,无奈被前端JavaScript拜访。须要留神的是,尽管非预检申请不须要发送OPTIONS申请,但依然须要服务器返回非法的CORS响应头信息。3.跨域无关的响应头 上面列出了和跨域无关的响应头: Access-Control-Allow-Origin:哪些源能够拜访该资源。"*"示意所有的源都能够拜访该资源。Access-Control-Allow-Credentials:是否容许发送Cookie。Access-Control-Expose-Headers:哪些响应头能够被前端JavaScript拜访。默认状况下,不容许拜访Access-Control-Allow-Methods:哪些HTTP申请办法容许跨域拜访。默认状况下,只容许GET、HEAD、POST办法。Access-Control-Allow-Headers:容许的申请头信息。默认状况下,只容许常见的申请头,Accept、Accept-Language、Content-Language、Content-Type。Access-Control-Max-Age:预检申请的有效期,单位为秒。有效期内,浏览器无需再次发送预检申请。4.跨域和cookie如果须要在跨域申请中携带 Cookie,服务器须要设置响应头"Access-Control-Allow-Credentials"为true同时前端须要设置申请头"withCredentials"为true,否则无奈携带 Cookie。 4.1 携带cookie时的限度在跨域申请中携带Cookie时,浏览器会先发送OPTIONS预检申请,以查看是否容许跨域申请。与不携带Cookie的状况相比,携带Cookie时"Access-Control-Allow-Origin"字段的限度更加严格: 字段不能为通配符*,否则浏览器会疏忽"Access-Control-Allow-Credentials"字段的值,不会发送Cookie。字段的值必须与申请头中"Origin"字段的值完全相同。

April 15, 2023 · 1 min · jiezi

关于javascript:小程序内参数和扫码参数统一

写小程序的时候都会遇到扫码参数和小程序内跳转参数要离开解决的问题,但实际上参数和解决的形式都是一样的,这里封装一种办法,将扫码参数间接放到options上面,这样就不须要离开独立解决,缩小冗余代码减少代码可读性和扩展性。 // 写在 app.js App构造函数之前// 微信小程序const originalPage = Page Page = function (app) { let onload = app.onLoad app.onLoad = function(options) { if (options.q) { let query = initParm(decodeURIComponent(options.q)) for(let item in query) { options[item] = query[item] } } onload.call(this, options) } return originalPage(app)}// 支付宝小程序const originalPage = Page Page = function (app) { let onload = app.onLoad app.onLoad = function(options) { const qrCode = getApp().globalData.query ? getApp().globalData.query.qrCode : undefined if (qrCode) { let query = initParm(qrCode) for(let item in query) { options[item] = query[item] } } onload.call(this, options) } return originalPage(app)}// 工具函数function initParm(parm) { let queryStr = parm.split("?")[1] let queryObj = {} let result = '' if(queryStr) { if(queryStr.indexOf('&') >= 0) { let query = queryStr.split('&') for(let i = 0; i < query.length; i++) { result = query[i].split('=') queryObj[result[0]] = result[1] } } else { result = queryStr.split('=') queryObj[result[0]] = result[1] } } return queryObj}

April 15, 2023 · 1 min · jiezi

关于javascript:JavaScript-条件分支语句

● 咱们的 js 代码都是程序执行的(从上到下) ● 个别状况下程序是按自上而下的程序顺次执行或者在不思考优先级的前提下从左向右顺次执行,咱们称之为程序执行 // 1. 自上而下let x = 10;let y = 2;console.log(a + b);// 2. 从左向右console.log(a); console.log(b);// 优先级破环了失常的执行程序console.log(3 + 2 * 4)● 条件管制(逻辑分支)就是依据咱们设定好的条件来控制程序执行的形式,JavaScript 提供了3种条件管制的语法反对: ○ if条件分支构造 ○ switch条件分支构造 ○ 三元运算符 if 条件分支构造(重点)● 能够依据条件决定是否执行否一段代码 ● 或者在多段代码之间抉择一段代码执行 ● 留神: 条件分支语句不能反复执行 ● if 语句多用于范畴性的条件判断 if 语句—单分支● 通过一个 if 语句来决定代码是否执行 ● 语法: ○ if (条件) { 要执行的代码段 } ● 通过 () 外面的条件是否成立来决定 {} 外面的代码是否执行 ● 如果 () 外面的条件为真,也就是true,才会执行大括号外面的代码段 // 条件为 true 的时候执行 {} 外面的代码if (true) { console.log('因为条件是 true,我会执行')}// 条件为 false 的时候不执行 {} 外面的代码if (false) { console.log('因为条件是 false,我不会执行')}● 示例 : ...

April 14, 2023 · 5 min · jiezi

关于javascript:Threejs教程鼠标操作三维场景

举荐:将NSDT场景编辑器退出你3D工具链其余工具系列:NSDT简石数字孪生为了应用鼠标操作三维场景,能够借助three.js泛滥控件之一OrbitControls.js,能够在下载的three.js-master文件中找到(three.js-master\examples\js\controls)。 而后和引入three.js文件一样在html文件中引入控件OrbitControls.js。本节课的目标不是为了深刻解说OrbitControls.js,次要目标一方面向大家展现下threejs的性能,另一方面前面课程学习过程中常常会通过鼠标旋转、缩放模型进行代码调试。 代码实现OrbitControls.js控件反对鼠标左中右键操作和键盘方向键操作,具体代码如下,应用上面的代码替换1.1节中renderer.render(scene,camera);即可。 function render() { renderer.render(scene,camera);//执行渲染操作}render();var controls = new THREE.OrbitControls(camera,renderer.domElement);//创立控件对象controls.addEventListener('change', render);//监听鼠标、键盘事件OrbitControls.js控件提供了一个构造函数THREE.OrbitControls(),把一个相机对象作为参数的时候,执行代码new THREE.OrbitControls(camera,renderer.domElement),浏览器会自动检测鼠标键盘的变动, 并依据鼠标和键盘的变动更新相机对象的参数,比方你拖动鼠标左键,浏览器会检测到鼠标事件,把鼠标平移的间隔依照肯定算法转化为相机的的旋转角度,你能够分割生存中相机拍照,即便风物没有变动,你的相机拍摄角度产生了变动,天然渲染器渲染出的后果就变动了,通过定义监听事件controls.addEventListener('change', render),如果你间断操作鼠标,相机的参数不停的变动,同时会不停的调用渲染函数render()进行渲染,这样threejs就会应用相机新的地位或角度数据进行渲染。 执行构造函数THREE.OrbitControls()浏览器会同时干两件事,一是给浏览器定义了一个鼠标、键盘事件,自动检测鼠标键盘的变动,如果变动了就会自动更新相机的数据, 执行该构造函数同时会返回一个对象,能够给该对象增加一个监听事件,只有鼠标或键盘产生了变动,就会触发渲染函数。 对于监听函数addEventListener介绍能够关注文章《HTML5事件》。 场景操作缩放:滚动—鼠标中键旋转:拖动—鼠标左键平移:拖动—鼠标右键requestAnimationFrame()应用状况如果threejs代码中通过requestAnimationFrame()实现渲染器渲染办法render()的周期性调用,当通过OrbitControls操作扭转相机状态的时候,没必要在通过controls.addEventListener('change', render)监听鼠标事件调用渲染函数,因为requestAnimationFrame()就会不停的调用渲染函数。 function render() { renderer.render(scene,camera);//执行渲染操作 // mesh.rotateY(0.01);//每次绕y轴旋转0.01弧度 requestAnimationFrame(render);//申请再次执行渲染函数render}render();var controls = new THREE.OrbitControls(camera,renderer.domElement);//创立控件对象// 曾经通过requestAnimationFrame(render);周期性执行render函数,没必要再通过监听鼠标事件执行render函数// controls.addEventListener('change', render)留神开发中不要同时应用requestAnimationFrame()或controls.addEventListener('change', render)调用同一个函数,这样会抵触。 3D建模学习工作室

April 14, 2023 · 1 min · jiezi

关于javascript:5个asyncawait最佳实践

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn/#/home能够退出网站底部技术群,一起找bug. 这篇文章介绍了应用 async/await 编写异步代码的 5 个最佳实际。文章中的第一个倡议是在所有异步代码中应用 async/await。这样做的益处有以下几点:首先,它使代码库放弃一致性。通过在所有异步代码中应用 async/await,你能够保持一致的代码编写和组织形式。此外,async/await 有助于进步代码可读性和易于保护。这是因为应用 async/await 能够使代码看起来更像同步代码,从而使其更容易了解和批改。总之,应用 async/await 是编写高效、易于保护的异步代码的要害。 上面是注释: 在这篇博客文章中,咱们将探讨async/await - 一种在各种编程语言中编写异步代码的弱小工具。 但首先,让咱们定义async/await。简略来说,async/await是一种编写异步代码的形式,它看起来和行为像同步代码。它容许咱们暂停函数的执行,期待 promise 解决,而后从来到的中央持续。 疾速示例: async function getData() { const response = await fetch('https://example.com/data'); const data = await response.json(); return data;}留神 fetch 和 response.json 的调用被包裹在 await 语句中。这使得函数在继续执行下一行之前暂停并期待 Promise 解决。 为什么 async/await 很重要异步编程在当今高并发应用程序的世界中是必不可少的。无论是构建 Web 应用程序、挪动应用程序还是后端服务,都有可能须要在某个时候应用 async/await。 改良的性能和可扩展性async/await容许咱们编写非阻塞代码,这意味着应用程序能够解决更多并发申请,而不会遇到性能瓶颈。 加强用户体验async/await 能够帮忙咱们创立更具响应性和交互性的应用程序,从而带来更好的用户体验。 更好的代码构造和可读性async/await 使编写洁净有组织的代码更加容易,这在应用程序规模和复杂性减少时尤为重要。 进步生产力通过简化异步编程,async/await 能够帮忙咱们在更短的工夫内实现更多的工作。 Tips1: 对于所有异步代码,请应用 async/await应用async/await解决所有异步代码是个好主见,起因有几个。首先,它能够促成代码库的一致性。通过应用async/await解决所有异步代码,咱们将领有一种统一的编写和组织代码的形式。这使得其余开发人员更容易了解和保护你的代码库。 async/await还能够应用 try/catch 块轻松捕捉和处理错误。在解决 Promise 时,这尤其有用,因为如果没有适当的错误处理,Promise 可能很难调试。 ...

April 14, 2023 · 2 min · jiezi

关于javascript:掌握-React-组件树遍历技巧

本文对应的 react 版本是 18.2.0 上面的 dom 构造react 外部是如何遍历的 const App = () => { return ( <div> <button>+1</button> <A count={0} /> </div> );};const A = (props) => { useEffect(() => { console.log(props.count); }, [props.count]); return <div>{props.count}</div>;};react 外部遍历外围逻辑:在 render 时调用 commitPassiveUnmountOnFiber 函数commitPassiveUnmountOnFiber 解决不同的 WorkTag,并调用 recursivelyTraversePassiveUnmountEffectsrecursivelyTraversePassiveUnmountEffects 依据以后 Fiber 的子节点有没有 passive effect(useEffect,useLayoutEffect)来决定是否遍历以后 Fiber 的子节点 如果子节点有 passive effect,则优先遍历子节点 (深度优先),直到找到最终的叶子节点,退出以后循环而后进入兄弟节点,开始遍历兄弟节点的子节点 具体从哪个兄弟节点开始遍历,react 抉择的是离退出循环的那个叶子节点的父节点,查看有没有子节点,以此循环遍历直到最初找到所有有 passive effect 的节点代码简化: commitPassiveUnmountOnFiber(root.current);function commitPassiveUnmountOnFiber(finishedWork) { // 省略了解决不同的 WorkTag recursivelyTraversePassiveUnmountEffects(finishedWork);}function recursivelyTraversePassiveUnmountEffects(parentFiber) { // 省略了其余解决 if (parentFiber.subtreeFlags & PassiveMask) { let child = parentFiber.child; while (child !== null) { commitPassiveUnmountOnFiber(child); child = child.sibling; } }}所以对于这段 dom 的遍历逻辑是:首先从根组件开始 FiberRootNode,取到 current ...

April 13, 2023 · 1 min · jiezi

关于javascript:好奇心驱使下试验了-chatGPT-的-js-代码的能力

手边的我的项目中有个函数,次要实现图片分片裁剪性能。能够优化一下。也想看看 chatGPT 的代码理解能力,优化能力,实现能力,用例能力。于是有了这篇文章。试验后果总结:chatGPT 的确弱小,提供的答案能够借鉴,但不能齐全依赖,须要你自行判断是否正确当你须要一个纯函数时,能够思考应用。发问时问题形容越清晰明确,失去的答案越合乎预期问答如下:问:const getSliceArr = (): SliceType[] => { /** 累计裁剪高度 代表下次裁剪的初始地位 */ let sliceSum: number = 0 /** 分片计数 */ let count = 0 /** 最终输入数组 */ let sliceArr: SliceType[] = [] // 当裁剪累计值大于等于图片宽度 跳出循环 while (sliceSum < imgHeight) { // 残余高度 const residuals = imgHeight - sliceSum // 当残余高度有余单片高度时,间接裁剪到开端 if (residuals < sliceHeight) { sliceArr.push({ from: sliceSum, to: residuals }) sliceSum += residuals } // 裁剪第一片 须要思考到首屏分片的高度 if (count === 0) { if (sliceSum >= imgHeight) { return sliceArr; } sliceArr.push({ from: 0, to: firstScreenHeight }) sliceSum += firstScreenHeight } else { if (sliceSum >= imgHeight) { return sliceArr; } // 一般切片计算 sliceArr.push({ from: sliceSum, to: sliceHeight }) sliceSum += sliceHeight } count++ } return sliceArr }解释一下这段代码答:这是一段 TypeScript 代码,实现的性能是将一张图片依照指定的高度进行分片裁剪,返回一个蕴含每个分片裁剪起始地位和完结地位的数组 sliceArr。函数中应用了一个 while 循环来计算分片裁剪的数量以及分片初始地位。首先定义了三个变量:裁剪累计值 sliceSum,分片计数 count 和最终输入数组 sliceArr。接下来在循环体内,通过计算残余高度和单片高度的大小关系,决定是否须要将以后片裁剪到开端。同时,在第一片时须要思考首屏显示高度,因而须要特判解决。除此之外,前面的一般切片计算则间接依照给定的 sliceHeight 进行裁剪。当裁剪累计值大于等于图片高度时,循环完结,返回最终的 sliceArr 数组。能够看到: ...

April 13, 2023 · 3 min · jiezi

关于javascript:你并不太老转向人工智能

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn/#/home能够退出网站底部技术群,一起找bug. Latent.space的文章“不老”是一个很乏味的探讨对于咱们如何对待年龄的话题。作者指出,人们广泛将年龄视为固定的概念,但实际上年龄只是一个数值,与身材和思维的状态并没有间接的关系。因而,咱们应该尝试去打消对年龄的刻板印象和歧视,解脱对本人或别人年龄的过分关注,以及对本人或别人的将来做出不必要的限度。 作者通过援用许多乏味的钻研,包含长命村的案例,证实了人们能够在不同年龄段放弃健壮的身材和灵便的思维。此外,他还谈到了像教训、智慧和生存经验这样的因素,这些因素不肯定与年龄相干,却是咱们所应该关注的。因而,咱们须要尝试对待年龄问题的不同角度,并学会从年龄的解放中解脱进去。 总的来说,这篇文章十分值得一读。它提供了一种新的思考年龄的形式,让咱们可能更好地意识本人和别人。咱们应该尝试去打消对年龄的刻板印象和歧视,解脱对本人或别人年龄的过分关注,以及对本人或别人的将来做出不必要的限度。 注释开始~~~ 最近,一位开发者敌人说:“如果我当初20岁,我会放下所有,投身于人工智能。”但他曾经破费了十多年的工夫来建设专业知识、人脉和名誉,成为了他所在畛域的顶尖人物。因而,他当初抉择留在原地。 另一个年长的大学敌人是一家当初已公开上市的科技初创公司的高管。他善于他所做的事件,领有完满的简历,他的职业生涯的其余部分能够轻松地推断出令人羡慕的职位。然而,他正在转向,因为正如他通知我的那样,“生命很短暂”,他不想在完结时想“如果呢?” 最近几天,我与技术和非技术背景的敌人进行了许多相似的对话。只管我心愿这封通信可能关注具体的技术倒退和令人振奋的SOTA停顿,但我认为值得花一期的工夫来探讨含糊的职业转型主题,因为这是一个我凑巧独具评论资格的话题。 在我三十多岁时转变我记得我第一次职业转型时的恐惧感,那时我曾经30岁了。我曾经在金融行业工作了6-7年,这是我从16岁起就想要的职业,环游世界,审讯CEO,并在寰球顶尖对冲基金之一帮忙治理10亿美元。表面上我很厉害,但我深知这并不令人满意,也不是我的终极目标。让一些捐献和养老金变得更加丰富,与从无到有发明出一些货色相比,显得微不足道。我决定从金融转向软件工程(和开发者关系)。其余的就是历史了。 6-7年后,我再次转变了我的职业。我认为从软件工程师到人工智能的转变简直与从金融到软件工程师的转变一样,只是在表面上类似,同时须要大量的新常识和实践经验能力变得相当有生产力。我的转变策略与上次雷同;尽可能在早晨和周末学习6个月,以取得信念,这是一个长久的趣味: 在我可能获得有意义的停顿的中央,而后切断分割/烧掉桥梁/全力以赴并在公开场合学习它。但这只是适宜我集体的办法;你的状况可能会有所不同。我置信如果你违心,你能够找到如何做到这一点;我写作的对象是那些心愿取得足够自信的人,让他们真正决定迈出这一步。我认为在技术职业决策中存在很多外在的年龄歧视和沉没老本舛误。因而,这里是一个疾速的理由列表,阐明为什么你不会太老来转行。 你应该进入人工智能畛域的起因人工智能的宽泛后劲/增长速度 杰夫·贝佐斯在30岁时驰名地放弃了金融行业,开始开办亚马逊。他这样做是因为1994年互联网使用量每年增长了2300%。通用技术的推广设想一下,如果你在2000年或2010年才开始接触科技,并得出结论认为曾经“太晚了”,无奈进入互联网业务。自1月份以来的3个月中,ChatGPT在工作中的使用量增长了1000%。上升时间比你设想的要短。 传统的非博士学位机器学习门路是加入 Andrew Ng 在 Coursera 上的课程,学习三个月后意识到你仍须要多年的自学和实践经验能力做出乏味的事件。然而咱们正在变得更加善于简化通往尖端生成式人工智能的门路。Jeremy Howard的fast.ai课程于2016年开始,通过7周的课程让开发者进入人工智能畛域。到了2022年,他曾经通过十个90分钟的课程率领人们从新实现了稳固扩散。Suhail Doshi在2022年6月加入了这门课程,并在11月份推出了Playground.ai。这在肯定水平上是由Transformer架构驱动的,该架构于2017年推出,但自那当前简直占据了AI的每个畛域,提供了一个弱小/灵便的基线,使得先前架构的常识变得可选。因而,没有几十年的钻研须要追赶;只须要追赶过来的5年即可。一些读者询问了波及的数学问题。对于AI是否“只是矩阵乘法”的争执很多,如果你违心,你能够在大学线性代数和微积分的一个学期内学习它,但我的次要答案是你不用这样做;古代框架如pytorch能够帮忙你实现任何须要的反向流传和矩阵操作。当然,走捷径并不能让你与传统的博士生相等,他们可能推动技术的最前沿。然而,即便是看一下顶级钻研人员的职业生涯,也能让你理解到要达到最高程度须要多长时间。Yi Tay在谷歌奉献了/领导了许多最近的LLM停顿,但你可能会诧异地发现他自从取得博士学位以来只有大概3.3年的教训。Ashish Vaswani在发表Transformer论文时曾经取得博士学位3年了,而Alec Radford在OpenAI发表GPT和GPT-2论文时曾经从本科毕业2年了。这样的职业轨迹在物理学、数学、医学等更成熟的畛域不会产生,因为它们的“foom”年代曾经过来了几个世纪。人工智能的“foom”显然正在产生。这一切都是说; 这依然是一个十分年老的畛域,20年后没有人可能会在意你感觉“晚”。除了成为业余的机器学习研究员之外,还有许多奉献畛域。 提醒和能力钻研:Riley Goodside的职业生涯在2022年暴发,从Grindr的数据科学家变成了世界上第一位员工提醒工程师,通过推特GPT-3技巧,发现并遍及“提醒注入”作为LLM平安问题的次要关注点。许多人曾经意识到,在社交媒体上找到GPT-3和-4的乏味用例很好,这是学术界进行正式能力钻研的一个普通人的推论。软件工程:最近,Whisper.cpp和LLaMA.cpp启发了许多人对在设施上运行大型模型的将来,但我很诧异听到Georgi Gerganov在Changelog上的采访,并理解到他在2022年9月自称为“非AI信徒”,仅仅是为了好玩而将Whisper移植到C++。LLaMA.cpp自身的倒退速度比Stable Diffusion更快,而Stable Diffusion自身是有史以来增长最快的开源我的项目之一。只管没有进行模型训练,但Georgi的软件专业知识使这些根底模型更加易于拜访。Harrison Chase的Langchain通过构建第一个开发人员敌对的提醒工程框架,将提醒和预训练LLM模型的软件改良相结合,博得了大量关注。从Guardrails到Nat.dev的一系列LLM工具也有助于将这些模型从论文转化为生产。ChatGPT自身是GPT 3提供的UX翻新。5个模型系列,这对前端/UI开发人员来说是个好消息。产品化:谈到稳固扩散,Emad Mostaque直到2019年都是对冲基金经理,仿佛除了为他的儿子“自闭症文献综述和神经递质生物分子路径剖析”之外,没有任何先前的人工智能专业知识。但他在2020年参加EleutherAI社区后意识到,像稳固扩散这样的货色是可能的,找到了海德堡大学CompVis小组的Patrick和Robin,并投入了大概60万美元来培训和交付2022年第二个最重要的人工智能版本。没有人想要穿插审讯谁做了什么,但一位前对冲基金经理通过发现机会并将财务(和组织)杠杆利用于时机已到的想法中,能够减少很多价值。 更宽泛地说,纳特·弗里德曼始终在大声疾呼,多年的钻研积攒的能力过剩没有在足够多的初创公司中失去施行,而像戴夫·罗根莫瑟这样违心早早跳上这趟列车的创始人,在两年内将Jasper从0增长到7500万美元的年收入,将取得不成比例的回报。更宽泛地说,现有企业和各个垂直市场的初创企业都在采纳人工智能,这表明将来是“人工智能浸透所有”的趋势。因而,了解根底模型更可能是达到目标(利用它们)而不是目标自身(训练它们或探讨平安和感知能力)。兴许,更好的想法是将本人和潜在的将来方向看作是“学习如何在曾经感兴趣或精通的畛域中利用人工智能”,而不是“转向人工智能”。 我的最初一个与年龄相干的呐喊是通用的 - 挑战本人对大脑有益处。神经可塑性通常被认为在25岁后进行,但这是有争议的。更为统一的意见是,继续学习有助于建设认知储备,有助于延缓像痴呆症和阿尔茨海默病这样的神经退行性疾病。这位72岁的国会议员正在这样做,你的借口是什么? 原文:https://www.latent.space/p/not-old 代码部署后可能存在的BUG没法实时晓得,预先为了解决这些BUG,花了大量的工夫进行log 调试,这边顺便给大家举荐一个好用的BUG监控工具 Fundebug。 交换有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

April 13, 2023 · 1 min · jiezi

关于javascript:带你揭开神秘的Javascript-AST面纱之Babel-AST-四件套的使用方法

作者:京东批发 周亮堂 写在后面这里咱们初步提到了一些根底概念和利用: 分析器形象语法树 ASTAST 在 JS 中的用处AST 的利用实际有了初步的意识,还有惯例的代码革新利用实际,当初咱们来具体说说应用 AST, 如何进行代码革新? Babel AST 四件套的应用办法其实在解析 AST 这个工具上,有很多能够应用,上文咱们曾经提到过了。对于 JS 的 AST 大家曾经造成了对立的标准命名,惟一不同的可能是,不同工具提供的具体水平不一样,有的可能会额定提供额定办法或者属性。 所以,在抉择工具上,大家依照各自喜爱抉择即可,这里咱们抉择了babel这个老朋友。 初识 Babel我置信在这个前端框架频出的时代,应该都晓得babel的存在。 如果你还没听说过babel,那么咱们通过它的相干文档,持续深刻学习一下。 因为,它在任何框架外面,咱们都能看到它的影子。 Babel JS 官网Babel JS Github作为应用最宽泛的 JS 编译器,他能够用于将采纳 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便可能运行在以后和旧版本的浏览器或其余环境中。 而它可能做到向下兼容或者代码转换,就是基于代码解析和革新。接下来,咱们来说说:如何应用@babel/core外面的外围四件套:@babel/parser、@babel/traverse、@babel/types及@babel/generator。 1. @babel/parser@babel/parser 外围代码解析器,通过它进行词法剖析及语法分析过程,最终转换为咱们提到的 AST 模式。 假如咱们须要读取React中index.tsx文件中代码内容,咱们能够应用如下代码: const { parse } = require("@babel/parser")// 读取文件内容const fileBuffer = fs.readFileSync('./code/app/index.tsx', 'utf8');// 转换字节 Bufferconst fileCode = fileBuffer.toString();// 解析内容转换为 AST 对象const codeAST = parse(fileCode, { // parse in strict mode and allow module declarations sourceType: "module", plugins: [ // enable jsx and typescript syntax "jsx", "typescript", ],});当然我不仅仅只读取React代码,咱们甚至能够读取Vue语法。它也有对应的语法分析器,比方:@vue/compiler-dom。 ...

April 12, 2023 · 4 min · jiezi

关于javascript:写给小白的地理信息的表示法GeoJSON

简介GeoJSON 是一种应用 JSON 来编码各种天文数据结构的格局,是一种轻量级的数据交换格局,能够用来示意几何对象、属性数据、空间参考零碎等信息 由两种对象组成:Geometry(几何对象)和 Feature(空间行状) 几何对象用来形容天文空间中的点、线、面等几何形态空间行状用来形容一个有界的实体,包含几何对象和其余属性信息几何对象类型有: 点:Point多点:MultiPoint线:LineString多线:MultiLineString面:Polygon多面:MultiPolygon几何汇合:GeometryCollection空间行状类型有: 空间行状:Feature空间形态汇合:FeatureCollection举例几何对象和空间行状能够互相嵌套 const GeoJSON = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "Point", coordinates: [121.4737, 31.2304] }, properties: { id: 1 }, }, { type: "Feature", geometry: { type: "Point", coordinates: [121.4837, 31.2504] }, properties: { id: 2 }, }, ],};空间行状FeatureCollectionFeatureCollection 是 Feature 对象的汇合,用来示意一组 Feature 对象 由 type 和 features 两个属性组成: type 属性的值为 FeatureCollectionfeatures 属性的值为 Feature 对象的数组const FeatureCollectionJSON = { type: "FeatureCollection", features: [feature],};FeatureFeature 对象用来示意几何对象的属性信息 ...

April 11, 2023 · 3 min · jiezi

关于javascript:重磅更新云鲨RASP新增PythonPHP两种语言探针新增订阅日报

2022年12.13日, 云鲨RASP公布重磅更新, 全新版本正式上线! 更多语言、 更强防护、 更全场景, 等您来应用!What's new? 新增Python、PHP两种语言探针 新增平安日报订阅性能 新增企业信息管理及账户治理性能 文档核心上线探针装置帮忙视频 01新增Python、PHP两种语言探针在全新版本中重磅上线两种新语言探针,为利用平安提供更多可能~ 反对PHP 5.3-5.6,7.0-7.4版本反对Python3.5—3.9 每种语言都装备了插桩教程和实操视频,点击上方“插桩视频参见文档”即可跳转。 02新增订阅平安日报订阅性能 在告诉设置中一键启动“邮件告诉”,即会开启订阅日报性能,每日接管您的利用平安数据 03新增企业信息管理及账户治理性能 点击“集体核心——账号信息“补充企业信息后,即可减少10个收费节点,机不可失哦~ 04帮忙文档减少插桩视频 点击官网”帮忙文档——插桩教程“即可查看 云鲨RASP 基于运行时情境感知技术的新一代利用威逼免疫平台 悬镜云鲨RASP自适应威逼免疫平台作为悬镜第三代DevSecOps智适应威逼管理体系中经营环节的继续检测响应平台,通过专利级AI检测引擎、利用破绽攻打免疫算法、运行时平安切面调度算法及纵深流量学习算法等关键技术,将主动防御能力“注入”到业务利用中,借助弱小的利用上下文情景剖析能力,可捕获并进攻各种绕过流量检测的攻击方式,提供兼具业务透视和性能解耦的内生被动平安免疫能力,为业务利用出厂默认平安免疫迎来变革倒退。 官网网址:https://rasp.xmirror.cn/

April 11, 2023 · 1 min · jiezi

关于javascript:JavaScript构造函数内容讲解

JavaScript 是世界上最风行的脚本语言。 JavaScript 是属于 web 的语言,它实用于 PC、笔记本电脑、平板电脑和移动电话。 JavaScript 被设计为向 HTML 页面减少交互性。 许多 HTML 开发者都不是程序员,然而 JavaScript 却领有非常简单的语法。简直每个人都有能力将小的 JavaScript 片段增加到网页中。上面给大家分享下JavaScript教程全套视频合集:构造函数内容解说。面向对象首先,咱们要明确,面向对象不是语法,是一个思维,是一种 编程模式。面向: 面(脸),向(朝着)面向过程: 脸朝着过程 =》 关注着过程的编程模式面向对象: 脸朝着对象 =》 关注着对象的编程模式实现一个成果在面向过程的时候,咱们要关注每一个元素,每一个元素之间的关系,程序,。。。在面向过程的时候,咱们要关注的就是找到一个对象来帮我做这个事件,我期待后果例子 : 我要吃面条面向过程用多少面粉用多少水怎么和面怎么切面条做开水煮面吃面面向对象找到一个面馆叫一碗面等着吃面向对象就是对面向过程的封装咱们以前的编程思维是,每一个性能,都依照需要一步一步的逐渐实现咱们当前的编程思维是,每一个性能,都先发明一个 面馆,这个 面馆 能帮咱们作出一个 面(实现这个性能的对象),而后用 面馆 发明出一个 面,咱们只有等到后果就好了插个小音讯,也不便想学习入行成为程序员的同学,在文章下方留言即可试听课程外加支付千锋HTML5、UI交互设计、PHP、Java+云数据、大数据开发、VR/AR/Unity游戏开发、Python人工智能、Linux云计算、全栈软件测试、网络安全等全副的视频学习教程。创建对象的形式因为面向对象就是一个找到对象的过程所以咱们先要理解如何创立一个对象调用零碎内置的构造函数创建对象js 给咱们内置了一个 Object 构造函数这个构造函数就是用来发明对象的当 构造函数 和 new 关键字连用的时候,就能够为咱们发明出一个对象因为 js 是一个动静的语言,那么咱们就能够动静的向对象中增加成员了// 就能失去一个空对象var o1 = new Object()// 失常操作对象o1.name = 'Jack'o1.age = 18o1.gender = '男'字面量的形式创立一个对象间接应用字面量的模式,也就是间接写 {}能够在写的时候就增加好成员,也能够动静的增加// 字面量形式创建对象var o1 = {name: 'Jack',age: 18,gender: '男'}// 再来一个var o2 = {}o2.name = 'Rose'o2.age = 20o2.gender = '女'应用工厂函数的形式创建对象先书写一个工厂函数这个工厂函数外面能够发明出一个对象,并且给对象增加一些属性,还能把对象返回应用这个工厂函数发明对象// 1. 先创立一个工厂函数function createObj() {// 手动创立一个对象var obj = new Object()// 手动的向对象中增加成员obj.name = 'Jack'obj.age = 18obj.gender = '男'// 手动返回一个对象return obj}// 2. 应用这个工厂函数创建对象var o1 = createObj()var o2 = createObj()应用自定义构造函数创建对象工厂函数须要经验三个步骤手动创建对象手动增加成员手动返回对象构造函数会比工厂函数简略一下主动创建对象手动增加成员主动返回对象先书写一个构造函数在构造函数外向对象增加一些成员应用这个构造函数发明一个对象(和 new 连用)构造函数能够创建对象,并且创立一个带有属性和办法的对象面向对象就是要想方法找到一个有属性和办法的对象面向对象就是咱们本人制作 构造函数 的过程// 1. 先发明一个构造函数function Person(name, gender) {this.age = 18this.name = namethis.gender = gender}// 2. 应用构造函数创建对象var p1 = new Person('Jack', 'man')var p2 = new Person('Rose', 'woman')构造函数详解咱们理解了对象的创立形式咱们的面向对象就是要么能间接失去一个对象要么就弄出一个能发明对象的货色,咱们本人发明对象咱们的构造函数就能发明对象,所以接下来咱们就具体聊聊 构造函数构造函数的根本应用和一般函数一样,只不过 调用的时候要和 new 连用,不然就是一个一般函数调用function Person() {}var o1 = new Person() // 能失去一个空对象var o2 = Person() // 什么也得不到,这个就是一般函数调用留神: 不写 new 的时候就是一般函数调用,没有发明对象的能力首字母大写function person() {}var o1 = new person() // 能失去一个对象function Person() {}var o2 = new Person() // 能失去一个对象留神: 首字母不大写,只有和 new 连用,就有发明对象的能力当调用的时候如果不须要传递参数能够不写 (),倡议都写上function Person() {}var o1 = new Person() // 能失去一个空对象var o2 = new Person // 能失去一个空对象留神: 如果不须要传递参数,那么能够不写 (),如果传递参数就必须写构造函数外部的 this,因为和 new 连用的关系,是指向以后实例对象的function Person() {console.log(this)}var o1 = new Person() // 本次调用的时候,this => o1var o2 = new Person() // 本次调用的时候,this => o2留神: 每次 new 的时候,函数外部的 this 都是指向以后这次的实例化对象因为构造函数会主动返回一个对象,所以构造函数外部不要写 return你如果 return 一个根本数据类型,那么写了没有意义如果你 return 一个援用数据类型,那么构造函数自身的意义就没有了应用构造函数创立一个对象咱们在应用构造函数的时候,能够通过一些代码和内容来向以后的对象中增加一些内容function Person() {this.name = 'Jack'this.age = 18}var o1 = new Person()var o2 = new Person()咱们失去的两个对象外面都有本人的成员 name 和 age咱们在写构造函数的时候,是不是也能够增加一些办法进去呢?function Person() {this.name = 'Jack'this.age = 18this.sayHi = function () {console.log('hello constructor')}}var o1 = new Person()var o2 = new Person()显然是能够的,咱们的到的两个对象中都有 sayHi 这个函数也都能够失常调用然而这样好不好呢?毛病在哪里?function Person() {this.name = 'Jack'this.age = 18this.sayHi = function () {console.log('hello constructor')}}// 第一次 new 的时候, Person 这个函数要执行一遍// 执行一遍就会发明一个新的函数,并且把函数地址赋值给 this.sayHivar o1 = new Person()// 第二次 new 的时候, Person 这个函数要执行一遍// 执行一遍就会发明一个新的函数,并且把函数地址赋值给 this.sayHivar o2 = new Person()这样的话,那么咱们两个对象内的 sayHi 函数就是一个代码一摸一样,性能一摸一样然而是两个空间函数,占用两个内存空间也就是说 o1.sayHi 是一个地址,o2.sayHi 是一个地址所以咱们执行 console.log(o1 === o2.sayHi) 的到的后果是 false毛病: 一摸一样的函数呈现了两次,占用了两个空间地址 ...

April 11, 2023 · 2 min · jiezi