-
-
0deepseek视频教程、AI绘画、人工智能、ChatGpt、运营变现、数字人、文案+图片+视频 链接: https://pan.baidu.com/s/1psdYsqyaLGqWxrzP4xKskg?pwd=i5p1 提取码: i5p1
-
01. "全面解析DeepSeek:AI学习资料大全,助你快速掌握智能创作技巧" 2. "AI时代必备技能:DeepSeek学习资源全集,从入门到精通的实战指南" 3. "DeepSeek教程大汇总:AI学习资料百科,视频+文档+实战案例分析" 4. "AI学习者的福音:DeepSeek资料全集,多领域应用的智能创作指南" 5. "DeepSeek学习资料宝库:AI技能提升的全方位资源,视频教程大合集" 6. "AI学习资源全集:DeepSeek引领的智能时代教程,技巧与应用实例" 7. &quo
-
0在日常生活中,我们总会听到类似这样的声音:我今年都33了,还能学前端吗? 很多人都有或者有过这样的疑问,只不过只有小部分人把疑问变成了设想,又把设想变成了现实。 到底怎么学 学习方式很多,自学,培训机构,找个人带自己学习; 自学路比较长,因为不知道哪方面适合自己学,哪些技术过时了,哪些技术正在用,哪些面试会问; 培训机构,一对多教学,针对大多数人,如果多数人会了,你不会,那可能是你的问题,比较全的且多的教
-
1首先无论是前端还是后端,只要做得足够深,都能够做得非常出彩。但如果从学前端还是学后端更容易找工作的角度来说,我的建议是前端。 难易度 前端和后端的发展前景都非常好,对于零基础人员来说,前端相对简单一些。在一个公司内,前端和后端的工资没有绝对的高低,最主要还是看个人的能力,能力越强拿到的工资就越多。这一行还是更加注重个人技术实力。 入门难度 第一,对于非科班同学,前端的入门难度比后端低,对计算机基础(数
-
0keep-alive.png 💻1、keep-alive是什么? keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,避免被重新渲染!可以理解成防弹衣🧥; 包含在keep-alive里面的组件,所有路径匹配到的视图都会被缓存。 <keep-alive> <router-view> <!-- 所有路径匹配到的视图组件都会被缓存! --> </router-view></keep-alive> 🖱️2、keep-alive和普通组件有什么不同? 渲染方式不同,keep-alive它是一个抽象组件,不会去渲染实体节点,是通过手写一个render函数,rend
-
0学前端难不难 考取驾照的时候,是不是经常科目二、科目三,又挂了,考个驾照有的人考了三年互联网上,有一种恐惧叫“驾校教练带来的恐惧”。学车不易,每个初次坐上驾驶位置的新手都难免对方向盘产生陌生和不安全感,于是,难免会有状况百出的时候。这时,坐在一旁的那位车技娴熟的驾校教练总是看不过去,扔来一句又一句“金句”,让你更是如坐针毡。广东某高校大四学生林漫跟着教练学车时,心里总是非常忐忑,“我的教练挺毒舌的
-
0考取驾照的时候,是不是经常科目二、科目三,又挂了,考个驾照有的人考了三年互联网上,有一种恐惧叫“驾校教练带来的恐惧”。学车不易,每个初次坐上驾驶位置的新手都难免对方向盘产生陌生和不安全感,于是,难免会有状况百出的时候。这时,坐在一旁的那位车技娴熟的驾校教练总是看不过去,扔来一句又一句“金句”,让你更是如坐针毡。广东某高校大四学生林漫跟着教练学车时,心里总是非常忐忑,“我的教练挺毒舌的,他常常会说‘
-
0浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器“对话”。 浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model)尚无正式标准。 由于现代浏览器已经(几乎)实现了 JavaScript 交互性方面的相同方法和属性,因此常被认为是 BOM 的方法和属性。 Window 对象 所有浏览器都支持 window 对象。它表示浏览器窗口。 所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。 全局变量是 window 对象的属性。 全局函数是 window 对象的方法。 甚至 HTML D
-
0Boolean(逻辑)对象用于将非逻辑值转换为逻辑值(true 或者 false)。 实例 检查逻辑对象是 true 还是 false。 <html><body><script type="text/javascript">var b1=new Boolean( 0)var b2=new Boolean(1)var b3=new Boolean("")var b4=new Boolean(null)var b5=new Boolean(NaN)var b6=new Boolean("false")document.write("0 是逻辑的 "+ b1 +"<br />")document.write("1 是逻辑的 "+ b2 +"<br />")document.write("空字符串是逻辑的 "+ b3 + "<br />"
-
0创建日期 Date 对象用于处理日期和时间。 可以通过 new 关键词来定义 Date 对象。以下代码定义了名为 myDate 的 Date 对象: 有四种方式初始化日期: new Date();new Date(value);new Date(dateString);new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]); 上面的参数大多数都是可选的,在不指定的情况下,默认参数是0。 实例化一个日期的一些例子: var today = new Date()var d1 = new Date("October 13, 1975 11:13:00")var d2 = new Date(79,5,24)var d3 = new Date(79,5,24,11,33,0) 设置
-
0因为useState使用的是es6的解构赋值 数组和对象解构赋值的区别: 数组的元素是按次序排列的,数组解构时变量的取值由数组元素的位置决定,变量名可以任意命名。 数组的元素是按次序排列的,数组解构时变量的取值由元素的位置决定,变量名可以任意命名。 对象的属性则没有次序,解构时变量名必须与属性同名才能取到正确的值 因此使用数组会更灵活,可以任意命名state和修改state的方法
-
0在react中,使用虚拟dom替代真实dom,而diff算法则是实现最小化页面重绘的体现。在diff算法中有三大策略,分别是树策略(tree diff),组件策略(component diff)以及元素策略(element diff)。 策略一(tree diff): Web UI中DOM节点跨层级的移动操作特别少,可以忽略不计。 策略二(component diff): 拥有相同类的两个组件 生成相似的树形结构, 拥有不同类的两个组件 生成不同的树形结构。 策略三(element diff): 对于同一层级的一组子节点,通过唯一id区分
-
01)背景 react在进行组件渲染时,从setState开始到渲染完成整个过程是同步的(“一气呵成”)。如果需要渲染的组件比较庞大,js执行会占据主线程时间较长,会导致页面响应度变差,使得react在动画、手势等应用中效果比较差。 页面卡顿:Stack reconciler的工作流程很像函数的调用过程。父组件里调子组件,可以类比为函数的递归;对于特别庞大的vDOM树来说,reconciliation过程会很长(x00ms),超过16ms,在这期间,主线程是被js占用的,因此任何交互、布局、
-
01)React 16.x的三大新特性 Time Slicing, Suspense,hooks Time Slicing(解决CPU速度问题)使得在执行任务的期间可以随时暂停,跑去干别的事情,这个特性使得react能在性能极其差的机器跑时,仍然保持有良好的性能 Suspense (解决网络IO问题)和lazy配合,实现异步加载组件。 能暂停当前组件的渲染, 当完成某件事以后再继续渲染,解决从react出生到现在都存在的「异步副作用」的问题,而且解决得非 的优雅,使用的是「异步但是同步的写法」,我个人认为,这
-
01)对于正常的项目优化,一般都涉及到几个方面,开发过程中、上线之后的首屏、运行过程的状态 来聊聊上线之后的首屏及运行状态: 首屏优化一般涉及到几个指标FP、FCP、FMP;要有一个良好的体验是尽可能的把FCP提前,需要做一些工程化的处理,去优化资源的加载 方式及分包策略,资源的减少是最有效的加快首屏打开的方式; 对于CSR的应用,FCP的过程一般是首先加载js与css资源,js在本地执行完成,然后加载数据回来,做内容初始化渲染,这中间
-
0糟糕的注释新手倾向于使用注释来解释“代码中发生了什么”。就像这样:// 这里的代码会先做这件事(……)然后做那件事(……) // ……谁知道还有什么…… very; complex; code;但在好的代码中,这种“解释性”注释的数量应该是最少的。严格地说,就算没有它们,代码也应该很容易理解。关于这一点有一个很棒的原则:“如果代码不够清晰以至于需要一个注释,那么或许它应该被重写。”配方:分解函数有时候,用一个函数来代替一个代码片段是
-
0代码结构 语句用分号分隔: alert('Hello'); alert('World'); 通常,换行符也被视为分隔符,因此下面的例子也能正常运行: alert('Hello')alert('World') 这就是所谓的「自动分号插入」。但有时它不起作用,例如: alert("There will be an error after this message")[1, 2].forEach(alert) 大多数代码风格指南都认为我们应该在每个语句后面都加上分号。 在代码块 {...} 后以及有代码块的语法结构(例如循环)后不需要加分号: function f() { // 函数声明后
-
0我们知道,在数学中有很多用于比较大小的运算符。 在 JavaScript 中,它们的编写方式如下: 大于 / 小于:a > b,a < b。 大于等于 / 小于等于:a >= b,a <= b。 检查两个值的相等:a == b,请注意双等号 == 表示相等性检查,而单等号 a = b 表示赋值。 检查两个值不相等:不相等在数学中的符号是 ≠,但在 JavaScript 中写成 a != b。 在本文中,我们将进一步了解不同类型的比较,JavaScript 是如何进行比较的,包括一些重要的特殊性。 在文末给出了一些
-
0长久以来,JavaScript 不断向前发展且并未带来任何兼容性问题。新的特性被加入,旧的功能也没有改变。这么做有利于兼容旧代码,但缺点是 JavaScript 创造者的任何错误或不完善的决定也将永远被保留在 JavaScript 语言中。这种情况一直持续到 2009 年 ECMAScript 5 (ES5) 的出现。ES5 规范增加了新的语言特性并且修改了一些已经存在的特性。为了保证旧的功能能够使用,大部分的修改是默认不生效的。你需要一个特殊的指令 —— "use strict" 来明确地激活
-
0const curry = function(fn) { const arity = fn.length; // 获取参数个数 return function $curry(...args) { if (args.length === arity) { return fn.apply(this, args); } else { return function(...args2) { return $curry.apply(this, args.concat(args2)); } } } } const test = function(a, b, c) { return a + b + c; } const curriedTest = curry(test); const result = curriedTest(1)(2)(3); console.log('result:', result); // 6 const result2 = curriedTest(1)(2, 3); console.log('result2:', result2); // 6
-
0const sum = (num) => { if (!sum.result) sum.result = 0 sum.result += num return sum}const a = sum(1)(2)(10).resultconsole.log(a)
-
0function test() { test.count = test.count ? test.count+1 : 1 if (test.count % 2 === 0) { console.log(2) } else { console.log(1) }}test()
-
0function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } function getColor() { let result = new Array(6) let i = 0 let hexMap = ['a', 'b', 'c', 'd', 'e', 'f'] while (i < 6) { let data = getRandomInt(0, 16) result[i] = data > 10 ? hexMap[data % 10] : data i++ } return `#${result.join('')}` }
-
0方法一function handler(arr = []) { const result = []; for (let i = 0, len = arr.length; i < len - 1; i++) { for (let j = i + 1; j < len; j++) { if(arr[j] > arr[i]) { result[i] = arr[j]; break; } result[i] = -1; } } result[arr.length - 1] = -1; return result;}console.log(handler([2,6,3,8,10,9]));方法二function rightMax(arr) { let len = arr.length if (len === 0) { return [] } if (len === 1) { return [-1] } let result = new Array(len) result.fill(-1) let idx_dp = new Array(len) idx_dp.fill(-1) let start = arr.length - 2 while (start >=0) { let end = start + 1 while (arr[start] &
-
0const tmp = new Set()Array.prototype.slice.call(document.querySelectorAll("*")).forEach(v => { const tagName = v.tagName.toLowerCase() if (tagName[0] === 's' || tagName[0] === 'h') { tmp.add(v.tagName) }})console.log(tmp);
-
0^<([a-zA-Z]+)>[\s\S]*?</\1>$用正则就行比较简单
-
01、箭头函数不能绑定arguments,取而代之的是rest的...解决 2、箭头函数是匿名函数,不能作为构造函数,不能使用new 3、箭头函数没有原型属性 4、箭头函数不能绑定this,会将离自己最近的一个普通函数的this作为自己的this 5、call、apply、bind都无法改变箭头函数中this的指向
-
0Number.isInteger = function (value) { // es5的形式 return typeof value === 'number' && Number.isFinite(value) && Math.floor(value) === params; }
-
0var addStrings = function (num1, num2) { let aLen = num1.length - 1; let bLen = num2.length - 1; let remainder = 0; let result = []; while (aLen >= 0 || bLen >= 0 || remainder !== 0) { // 注意最后一个进位 const a = aLen >= 0 ? num1.charAt(aLen) - '0' : 0; const b = bLen >= 0 ? num2.charAt(bLen) - '0' : 0; const tempResult = a + b + remainder; result.push((tempResult) % 10); remainder = Math.floor(tempResult / 10); aLen -= 1; bLen -= 1; } return result.reverse().join(''); };
-
0const negativeArray = els => new Proxy(els, { get: (target, propKey, receiver) => Reflect.get( target, +propKey < 0 ? String(target.length + +propKey) : propKey, receiver ) }); const unicorn = negativeArray(["京", "程", "一", "灯"]); unicorn[-1];
-
01) 核心思路 ①接收一个 Promise 实例的数组或具有 Iterator 接口的对象作为参数 ②这个方法返回一个新的 promise 对象, ③遍历传入的参数,用Promise.resolve()将参数"包一层",使其变成一个promise对象 ④参数所有回调成功才是成功,返回值数组与参数顺序一致 ⑤参数数组其中一个失败,则触发失败状态,第一个触发失败的 Promise 错误信息作为 Promise.all 的错误信息。 2)实现代码 一般来说,Promise.all 用来处理多个并发请求,也是为了页面数据构造的
-
01)什么是闭包 函数执行后返回结果是一个内部函数,并被外部变量所引用,如果内部函数持有被执行函数作用域的变量,即形成了闭包。 可以在内部函数访问到外部函数作用域。使用闭包,一可以读取函数中的变量,二可以将函数中的变量存储在内存中,保护变量不被污染。而正因闭包会把函数中的变量值存储在内存中,会对内存有消耗,所以不能滥用闭包,否则会影响网页性能,造成内存泄漏。当不需要使用闭包时,要及时释放内存,可将内层函
-
0通过 link 进来的 css 会阻塞页面渲染吗,Js 会阻塞吗,如果会如何解决 DOM解析和CSS解析是两个并行的进程,所以这也解释了为什么CSS加载不会阻塞DOM的解析。 然而,由于Render Tree是依赖于DOM Tree和CSSOM Tree的,所以他必须等待到CSSOM Tree构建完成,也就是CSS资源加载完成(或者CSS资源加载失败)后,才能开始渲染。因此,CSS加载是会阻塞Dom的渲染的。 由于js可能会操作之前的Dom节点和css样式,因此浏览器会维持html中css和js的顺序。因此,样式表会在后面的js
-
01)伪类(pseudo-classes) 其核⼼就是⽤来选择DOM树之外的信息,不能够被普通选择器选择的⽂档之外的元素,⽤来添加⼀些选择器的特殊效果。 ⽐如:hover :active :visited :link :visited :first-child :focus :lang等 由于状态的变化是⾮静态的,所以元素达到⼀个特定状态时,它可能得到⼀个伪类的样式;当状态改变时,它⼜会失去这个样式。 由此可以看出,它的功能和class有些类似,但它是基于⽂档之外的抽象,所以叫 伪类。 2)伪元素(Pseudo-elements) DOM树没有定义的虚
-
0React 官方文档说法: React is pretty flexible but it has a single strict rule: all React components must act like pure functions with respect to their props. props 是组件的只读属性,组件内部不能直接修改 props,要想修改 props,只能在该组件的上层组件中修改 在 React 中,props 是上层组件传递进来的值,这个值是父类的值,同 Vue 一样,props 的传值是单项数据流,也就是不会让影响父类的值,如果需要改值,可以先让 props 赋值给一个变量,在修改这个变量。 其实就是保证 React 单向
-
0参考解决方式 使用 vue-router 路由懒加载 使用 gzip 压缩 使用 CDN 引入 js 和 css 文件 配置 webpack 的 external,不打包第三方库 配置 DllPlugin 和 DllReferencePlugin 将引用的依赖提取出来 webpack 打包 vue 速度慢,可以通过 webpack-bundle-analyzer 进行可视化分析,主要看依赖和 chunks 打包的时间。 减少文件依赖嵌套的深度 使用尽可能少的处理(loader、plugin) DLL 处理第三方的包 多线程打包(HappyPack) 关闭 sourcemap 减少代码体积、压缩代码 优化 resolve.extensions 配置 优化 r
-
0误区我们经常说 Get 请求参数的大小存在限制,而 Post 请求的参数大小是无限制的。实际上 HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对 Get 请求参数的限制是来源与浏览器或 web 服务器,浏览器或 web 服务器限制了 url 的长度。为了明确这个概念,我们必须再次强调下面几点: HTTP 协议未规定 GET 和 POST 的长度限制 GET 的最大长度显示是因为浏览器和 web 服务器限制了 URI 的长度 不同的浏览器和 WEB 服务器,限制的最大长度不一样 要支持 IE,则最大
-
0参考分析 setInterval 的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间将事件加入事件队列中去,只有当当前的执行栈为空的时候,才能去从事件队列中取出事件执行。所以可能会出现这样的情况,就是当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能到间隔一段时间执行的效果。 针对 setInterval 的这个缺
-
0
-
0分析 在前端实现中一般会通过 setTimeout 和 setInterval 方法来实现一个倒计时的效果。但是使用这些方法会存在时间偏差的问题,这是由于 js 的程序执行机制造成的,setTimeout 和 setInterval 的作用是隔一段时间将回调事件加入到事件队列中,因此事件并不是立即执行的,它会等到当前执行栈为空的时候再取出事件执行,因此事件等待执行的时间就是造成误差的原因。 一般解决倒计时中的误差的有这样两种办法: 第一种是通过前端定时向服务器发送请求获
-
0
-
0严格模式中的变化 ECMAScript 5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,从而使代码显示地脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。 严格模式同时改变了语法及运行时行为。变化通常分为这几类:将问题直接转化为错误(如语法错误或运行时错误), 简化了如何为给定名称的特定变量计算,简化了 eval 以及 arguments, 将写"安全“JavaScript 的步骤变得更简单,以及改变了预测未来 ECMAScript 行为的方式。 1.1 将过失错误转成异常
-
0
-
0一、定义 1.1 useEffect 1.2 useLayoutEffect 1.2 useCallback 1.3 useMemo 一、定义useEffect(didUpdate, deps);const memoizedCallback = useCallback(() => { doSomething(params);}, deps);const memoizedValue = useMemo(() => computerExpensiveValue(params), deps); deps 是依赖的参数列表,当依赖列表中的任一参数变化时,则重新执行前面的函数。 1.1 useEffect useEffect 一般用于处理状态更新导致的 side effects。虽然说不提倡面向生命周期函数编程,但是在没有熟练掌握 useEffect 的时候,类比 Class Component 生命周期函
-
0初级:数据类型的种类与作用,常用框架的使用,会编写函数,掌握样式表的使用,常用组件库的使用; 中级:理解闭包,作用域,掌握递归,防抖,节流等算法的实现;能够使用 mvvm 框架进行组件封装及使用,事件的使用及原理,独立完成功能模块开发; 高级:掌握 mvvm 框架的实现原理,类型检查,代码规范化的标准,了解 webpack,gulp 等自动化部署的开发;编写高效的算法函数,编写高复用性组件 至于 vue 要掌握生命周期函数,作用,数据流向,