【建议收藏】2024字节跳动,web服务器开发

  • 闭包就是能够读取其他函数内部变量的函数

  • 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个

  • 函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域

  • 闭包的特性:

  • 函数内再嵌套函数

  • 内部函数可以引用外层的参数和变量

  • 参数和变量不会被垃圾回收机制回收

  • 优点:能够实现封装和缓存等

  • 缺点:消耗内存、使用不当会内存溢出,

  • 解决方法:在退出函数之前,将不使用的局部变量全部删除

说说你对作用域链的理解

  • 作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到 window对象即被终止,作用域链向下访问变量是不被允许的。

  • 简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期

JavaScript原型,原型链 ? 有什么特点?

  • 每个对象都会在其内部初始化一个属性,就是 prototype (原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去 prototype 里找这个属性,这个prototype 又会有自己的 prototype ,于是就这样一直找下去,也就是我们平时所说的原型链的概念

  • 关系: instance.constructor.prototype = instance._*proto*_

  • 特点:JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变当我们需要一个属性的时, Javascript 引擎会先看当前对象中是否有这个属性, 如果没有的,就会查找他的 Prototype 对象是否有这个属性,如此递推下去,一直检索到 Object内建对象

请解释什么是事件委托/事件代理

  • 事件代理( Event Delegation ),又称之为事件委托。是 JavaScript 中常用的绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能

  • 可以大量节省内存占用,减少事件注册,比如在 table 上代理所有 td 的 click 事件就非常棒

  • 可以实现当新增子对象时无需再次对其绑定

Javascript如何实现继承?

  • 构造继承

  • 原型继承

  • 实例继承

  • 拷贝继承

  • 原型 prototype 机制或 apply 和 call 方法去实现较简单,建议使用构造函数与原型混合方式

function Parent(){

this.name = ‘wang’;

}

function Child(){

this.age = 28;

}

Child.prototype = new Parent();//继承了Parent,通过原型

var demo = new Child();

alert(demo.age);

alert(demo.name);//得到被继承的属性

复制代码

谈谈This对象的理解

  • this 总是指向函数的直接调用者(而非间接调用者)

  • 如果有 new 关键字, this 指向 new 出来的那个对象

  • 在事件中, this 指向触发这个事件的对象,特殊的是, IE 中的 attachEvent 中的this 总是指向全局对象 Window

事件模型

W3C 中定义事件的发生经历三个阶段:捕获阶段( capturing )、目标阶段 ( targetin )、冒泡阶段( bubbling

  • 冒泡型事件:当你使用事件冒泡时,子级元素先触发,父级元素后触发

  • 捕获型事件:当你使用事件捕获时,父级元素先触发,子级元素后触发

  • DOM 事件流:同时支持两种事件模型:捕获型事件和冒泡型事件

  • 阻止冒泡:在 W3c 中,使用 stopPropagation() 方法;在IE下设置 cancelBubble =true

  • 阻止捕获:阻止事件的默认行为,例如 click - a 后的跳转。在 W3c 中,使用preventDefault() 方法,在 IE 下设置 window.event.returnValue = false

new操作符具体干了什么呢?

  • 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型

  • 属性和方法被加入到 this 引用的对象中

  • 新创建的对象由 this 所引用,并且最后隐式的返回 this

Ajax原理

  • Ajax 的原理简单来说是在用户和服务器之间加了—个中间层( AJAX 引擎),通过XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据,然后用 javascript来操作 DOM 而更新页面。使用户操作与服务器响应异步化。这其中最关键的一步就是从服务器获得请求数据

  • Ajax 的过程只涉及 JavaScript 、 XMLHttpRequest 和 DOM 。 XMLHttpRequestajax的核心机制

如何解决跨域问题?

首先了解下浏览器的同源策略 同源策略 /SOP(Same origin policy) 是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到 XSS 、 CSFR 等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源

  • 通过jsonp跨域

var script = document.createElement(‘script’);

script.type = ‘text/javascript’;

// 传参并指定回调执行函数为onBack

script.src = ‘http://www…:8080/login?user=admin&callback=onBack’;

document.head.appendChild(script);

// 回调执行函数

function onBack(res) {

alert(JSON.stringify(res));

}

复制代码

  • document.domain + iframe跨域

//父窗口:(http://www.domain.com/a.html)

//子窗口:(http://child.domain.com/b.html)

document.domain = ‘domain.com’;

// 获取父窗口中变量

alert('get js data from parent —> ’ + window.parent.user);

复制代码

  • nginx代理跨域

  • nodejs中间件代理跨域

  • 后端在头部信息里面设置安全域名

说说你对AMD和Commonjs的理解

  • CommonJS 是服务器端模块的规范, Node.js 采用了这个规范。 CommonJS 规范加载模

块是同步的,也就是说,只有加载完成,才能执行后面的操作。 AMD 规范则是非同步加载 模块,允许指定回调函数

  • AMD 推荐的风格通过返回一个对象做为模块对象, CommonJS 的风格通过对

module.exports 或 exports 的属性赋值来达到暴露模块对象的目的

js的7种基本数据类型

Undefined 、 Null 、Boolean 、Number 、String 、Bigint 、Symbol 了解更多加入我们前端学习圈

介绍js有哪些内置对象

  • ObjectJavaScript 中所有对象的父对象

  • 数据封装类对象: Object 、 Array 、 Boolean 、 Number 和 String

  • 其他对象: Function 、 Arguments 、 Math 、 Date 、 RegExp 、 Error

JS有哪些方法定义对象

  • 对象字面量: var obj = {};

  • 构造函数: var obj = new Object();

  • Object.create(): var obj = Object.create(Object.prototype);

你觉得jQuery源码有哪些写的好的地方

  • jquery 源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入 window 对象参数,可以使 window 对象作为局部变量使用,好处是当 jquery 中访问 window 对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问window对象。同样,传入 undefined 参数,可以缩短查找 undefined 时的作用域链

  • jquery 将一些原型属性和方法封装在了 jquery.prototype 中,为了缩短名称,又赋值给了 jquery.fn ,这是很形象的写法

  • 有一些数组或对象的方法经常能使用到, jQuery 将其保存为局部变量以提高访问速度

  • jquery 实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率

null,undefined 的区别

  • undefined 表示不存在这个值。

  • undefined :是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。尝试读取时会返回 undefined

  • 例如变量被声明了,但没有赋值时,就等于 undefined

  • null 表示一个对象被定义了,值为“空值”

  • null : 是一个对象(空对象, 没有任何属性和方法)

  • 例如作为函数的参数,表示该函数的参数不是对象;

  • 在验证 null 时,一定要使用 === ,因为 == 无法分别 null 和 undefined

谈谈你对ES6的理解

  • 新增模板字符串(为 JavaScript 提供了简单的字符串插值功能)

  • 箭头函数

  • for-of (用来遍历数据—例如数组中的值。)

  • arguments 对象可被不定参数和默认参数完美代替。

  • ES6promise 对象纳入规范,提供了原生的 Promise 对象。

  • 增加了 let 和 const 命令,用来声明变量。

  • 还有就是引入 module 模块的概念

了解更多加入我们前端学习圈

面向对象编程思想

  • 基本思想是使用对象,类,继承,封装等基本概念来进行程序设计

  • 易维护

  • 易扩展

  • 开发工作的重用性、继承性高,降低重复工作量。

  • 缩短了开发周期

如何通过JS判断一个数组

  • instanceof 运算符是用来测试一个对象是否在其原型链原型构造函数的属性

var arr = [];

arr instanceof Array; // true

复制代码

  • isArray

Array.isArray([]) //true

Array.isArray(1) //false

复制代码

  • constructor 属性返回对创建此对象的数组函数的引用,就是返回对象相对应的构造函数

var arr = [];

arr.constructor == Array; //true

复制代码

  • Object.prototype

Object.prototype.toString.call([]) == ‘[object Array]’

// 写个方法

var isType = function (obj) {

return Object.prototype.toString.call(obj).slice(8,-1);

//return Object.prototype.toString.apply([obj]).slice(8,-1);

}

isType([]) //Array

复制代码

异步编程的实现方式

  • 回调函数

  • 优点:简单、容易理解

  • 缺点:不利于维护,代码耦合高

  • 事件监听(采用时间驱动模式,取决于某个事件是否发生)

  • 优点:容易理解,可以绑定多个事件,每个事件可以指定多个回调函数

  • 缺点:事件驱动型,流程不够清晰

  • 发布/订阅(观察者模式)

  • 类似于事件监听,但是可以通过‘消息中心‘,了解现在有多少发布者,多少订阅者

  • Promise对象

  • 优点:可以利用then方法,进行链式写法;可以书写错误时的回调函数;

  • 缺点:编写和理解,相对比较难

  • Generator函数

  • 优点:函数体内外的数据交换、错误处理机制

  • 缺点:流程管理不方便

  • async函数

  • 优点:内置执行器、更好的语义、更广的适用性、返回的是Promise、结构清晰。

  • 缺点:错误处理机制

对原生Javascript了解方向

数据类型、运算、对象、Function、继承、闭包、作用域、原型链、事件、 RegExpJSONAjaxDOMBOM 、内存泄漏、跨域、异步装载、模板引擎、前端MVC 、路由、模块化、 CanvasECMAScript

sort 快速打乱数组

var arr = [1,2,3,4,5,6,7,8,9,10];

arr.sort(()=> Math.random() - 0.5)

//利用sort return 大于等于0不交换位置,小于0交换位置

// [5, 8, 4, 3, 2, 9, 10, 6, 1, 7]

复制代码

数组去重操作

  • ES6 Set

  • for循环 indexOf

  • for循环 includes

  • sort

了解更多加入我们前端学习圈

JS 原生拖拽节点

  • 给需要拖拽的节点绑定 mousedown , mousemove , mouseup 事件

  • mousedown 事件触发后,开始拖拽

  • mousemove 时,需要通过 event.clientX 和 clientY 获取拖拽位置,并实时更新位置

  • mouseup 时,拖拽结束

  • 需要注意浏览器边界值,设置拖拽范围

深拷贝、浅拷贝

  • 所有的基础数据类型的赋值操作都是深拷贝

  • 通常利用上面这点,来对引用数据类型做递归深拷贝

  • 浅拷贝:Object.assign 或者 扩展运算符

  • 深拷贝:JSON.parse(JSON.stringify(object)) 深层递归

  • 局限性:会忽略 undefined,不能序列化函数,不能解决循环引用的对象

了解更多加入我们前端学习圈

节流防抖

  • 节流:每隔一段时间执行一次,通常用在高频率触发的地方,降低频率。–如:鼠标滑动 拖拽

  • 防抖:一段时间内连续触发,不执行,直到超出限定时间执行最后一次。–如:input 模糊搜索

了解更多加入我们前端学习圈

变量提升

当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境

js b() // call b console.log(a) // undefined var a = 'Hello world' function b() { console.log('call b') }

变量提升 这是因为函数和变量提升的原因。通常提升的解释是说将声明的代码移动到了顶部,这其实没有什么错误,便于大家理解。但是更准确的解释应该是:在生成执行环境时,会有两个阶段。第一个阶段是创建的阶段,JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined ,所以在第二个阶段,也就是代码执行阶段,我们可以直接提前使用

b() // call b second

function b() {

console.log(‘call b fist’)

}

function b() {

console.log(‘call b second’)

}

var b = ‘Hello world’

复制代码

js单线程

  • 单线程 - 只有一个线程,只能做一件事

  • 原因 - 避免 DOM 渲染的冲突

  • 浏览器需要渲染 DOM

  • JS 可以修改 DOM 结构

  • JS 执行的时候,浏览器 DOM 渲染会暂停

  • 两段 JS 也不能同时执行(都修改 DOM 就冲突了)

  • webworker 支持多线程,但是不能访问 DOM

  • 解决方案 - 异步

说说event loop

首先, js 是单线程的,主要的任务是处理用户的交互,而用户的交互无非就 是响应 DOM 的增删改,使用事件队列的形式,一次事件循环只处理一个事件 响应,使得脚本执行相对连续,所以有了事件队列,用来储存待执行的事件, 那么事件队列的事件从哪里被 push 进来的呢。那就是另外一个线程叫事件触 发线程做的事情了,他的作用主要是在定时触发器线程、异步 HTTP 请求线程 满足特定条件下的回调函数 push 到事件队列中,等待 js 引擎空闲的时候去 执行,当然js引擎执行过程中有优先级之分,首先js引擎在一次事件循环中, 会先执行js线程的主任务,然后会去查找是否有微任务 microtask(promise) ,如果有那就优先执行微任务,如果没有,在去查找 宏任务 macrotask(setTimeout、setInterval) 进行执行

了解更多加入我们前端学习圈

描述下this

this ,函数执行的上下文,可以通过 apply , call , bind 改变 this 的指向。对于匿名函数或者直接调用的函数来说,this指向全局上下文(浏览 器为window,NodeJS为 global ),剩下的函数调用,那就是谁调用它, this 就指向谁。当然还有es6的箭头函数,箭头函数的指向取决于该箭头函 数声明的位置,在哪里声明, this 就指向哪里

ajax、axios、fetch区别

ajax:

  • 本身是针对 MVC 的编程,不符合现在前端 MVVM 的浪潮

  • 基于原生的 XHR 开发, XHR 本身的架构不清晰,已经有了 fetch 的替代方案

  • JQuery 整个项目太大,单纯使用 ajax 却要引入整个 JQuery 非常的不合理(采取个性化打包的方案又不能享受CDN服务)

axios:

  • 从浏览器中创建 XMLHttpRequest

  • node.js 发出 http 请求

  • 支持 Promise API

  • 拦截请求和响应

  • 转换请求和响应数据

  • 取消请求

  • 自动转换 JSON 数据

  • 客户端支持防止 CSRF/XSRF

fetch:

  • 只对网络请求报错,对 400 , 500 都当做成功的请求,需要封装去处理

  • 这里对于 cookie 的处理比较特殊,不同浏览器对credentials的默认值不一样,也就使得默认情况下cookie变的不可控。详细前往MDN

  • 本身无自带 abort ,无法超时控制,可以使用AbortController解决取消请求问题。

了解更多加入我们前端学习圈

  • 没有办法原生监测请求的进度,而XHR可以

更多fetch知识前往:阮一峰 fetch

优化 篇


SEO优化

  • 合理的 title 、 description 、 keywords :搜索对着三项的权重逐个减小, title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面 title 要有所不同; description 把页面内容高度概括,长度合适,不可过分堆砌关键词,不同页面description 有所不同; keywords 列举出重要关键词即可

  • 语义化的 HTML 代码,符合W3C规范:语义化代码让搜索引擎容易理解网页

  • 重要内容 HTML 代码放在最前:搜索引擎抓取 HTML 顺序是从上到下,有的搜索引擎对抓取长度有限制,保证重要内容一定会被抓取

  • 重要内容不要用 js 输出:爬虫不会执行js获取内容

  • 少用 iframe :搜索引擎不会抓取 iframe 中的内容

  • 非装饰性图片必须加 alt

  • 提高网站速度:网站速度是搜索引擎排序的一个重要指标

server优化

  • 减少HTTP请求,合并文件、雪碧图

  • 减少DNS查询,使用缓存

  • 减少Dom元素的数量

  • 使用CDN

  • 配置ETag,http缓存的手段

  • 对组件使用Gzip压缩

  • 减少cookie的大小

css优化

  • 将样式表放在页面顶部

  • 使用less scss表达式

  • 使用link 不适用@import引入样式

  • 压缩css

  • 禁止使用 gif 图片实现 loading 效果(降低 CPU 消耗,提升渲染性能)

  • 使用 CSS3 代码代替 JS 动画(尽可能避免重绘重排以及回流)

  • 对于一些小图标,可以使用base64位编码,以减少网络请求。

  • 页面头部的 <style> <script> 会阻塞页面;(因为 Renderer进程中 JS 线程和渲染线程是互斥的)

  • 当需要设置的样式很多时设置 className 而不是直接操作 style

js方面

  • 将脚本放到页面底部

  • js 外部引入

  • 压缩js

  • 使用Eslint语法检测

  • 减少Dom的操作

  • 熟练使用设计模式

  • 禁止使用 iframe (阻塞父文档 onload 事件)

  • 页面中空的 href 和 src 会阻塞页面其他资源的加载

  • 网页 gzip , CDN 托管, data 缓存 ,图片服务器

webpack优化点

  • 代码压缩插件 UglifyJsPlugin

  • 服务器启用gzip压缩

  • 按需加载资源文件 require.ensure

  • 优化 devtool 中的 source-map

  • 剥离 css 文件,单独打包

  • 去除不必要插件,通常就是开发环境与生产环境用同一套配置文件导致

  • 开发环境不做无意义的工作如提取 css 计算文件hash等

  • 配置 devtool

  • 优化构建时的搜索路径 指明需要构建目录及不需要构建目录

其他优化点

为什么利用多个域名来存储网站资源会更有效?

  • CDN 缓存更方便

  • 突破浏览器并发限制

  • 节约 cookie 带宽

  • 节约主域名的连接数,优化页面响应速度

  • 防止不必要的安全问题

Other 篇


从用户刷新网页开始,一次js请求一般情况下有哪些地方会有缓存处理?

  • dns 缓存

  • cdn缓存

  • 浏览器缓存

  • 服务器缓存

常见web安全及防护原理

  • sql 注入原理:就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

  • 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双 “-” 进行转换等

  • 永远不要使用动态拼装SQL,可以使用参数化的 SQL 或者直接使用存储过程进行数据查询存取

  • 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接

  • 不要把机密信息明文存放,请加密或者 hash 掉密码和敏感的信息

  • XSS防范方法:Xss(cross-site scripting) 攻击指的是攻击者往 Web 页面里插入恶意 html 标签或者 javascript 代码。比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取 cookie 中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点

  • 首先代码里对用户输入的地方和变量都需要仔细检查长度和对 ”<”,”>”,”;”,”’” 等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把 html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击

  • XSS与CSRF有什么区别:XSS 是获取信息,不需要提前知道其他用户页面的代码和数据包。 CSRF 是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。要完成一次 CSRF 攻击,受害者必须依次完成两个步骤,1.登录受信任网站 A ,并在本地生成 Cookie 。2.在不登出 A 的情况下,访问危险网站 B

  • 服务端的 CSRF 方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数

  • 通过验证码的方法

用过哪些设计模式

  • 单例模式

  • 策略模式

  • 代理模式

  • 迭代器模式

  • 发布—订阅模式

更多设计模式15种了解更多加入我们前端学习圈

Node的应用场景

  • 特点

  • 它是一个javascript运行环境

  • 依赖于chrome V8 引擎进行代码解释

  • 事件驱动

  • 非阻塞 I/o

  • 单进程,单线程

  • 优点

  • 对于文件的读写处理效率极高

  • 高并发(node最重要的优点)

  • 缺点

  • 只支持单核 CPU ,不能充分利用 CPU

  • 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

那些操作会造成内存泄漏?

  • 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在

  • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏

  • 闭包使用不当

简单介绍下webpack

WebPack 是一个模块打包工具,你可以使用 WebPack 管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包 Web 开发中所用到的 HTML 、 Javascript 、 CSS 以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源, webpack 有对应的模块加载器。 webpack 模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源。

谈谈你对gulp的了解

  • gulp 是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成

  • gulp的核心概念:流

  • 流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向

  • gulp正是通过流和代码优于配置的策略来尽量简化任务编写的工作

  • Gulp的特点:

  • 易于使用:通过代码优于配置的策略,gulp 让简单的任务简单,复杂的任务可管理

  • 构建快速 利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 IO 操作

  • 易于学习 通过最少的 API ,掌握 gulp 毫不费力,构建工作尽在掌握:如同一系列流管道

渐进增强和优雅降级

  • 渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

  • 优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容

谈一谈你理解的函数式编程

  • 简单说,“函数式编程"是一种"编程范式”(programming paradigm),也就是如何编写程序的方法论

  • 它具有以下特性:闭包和高阶函数、惰性计算、递归、函数是"第一等公民"、只用"表达式"

想了解更多,移步这里:https://zhuanlan.zhihu.com/p/57708956

Vue的双向绑定数据的原理

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty() 来劫持各个属性的 setter , getter ,在数据变动时发布消息给订阅者,触发相应的监听回调

写个简单Loader

loader 就是一个 node 模块,它输出了一个函数。当某种资源需要用这个 loader 转换时,这个函数会被调用。并且,这个函数可以通过提供给它的 this 上下文访问 Loader API 。 reverse-txt-loader

// 定义

module.exports = function(src) {

//src是原文件内容(abcde),下面对内容进行处理,这里是反转

var result = src.split(‘’).reverse().join(‘’);

//返回JavaScript源码,必须是String或者Buffer

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

anlan.zhihu.com/p/57708956]( )

Vue的双向绑定数据的原理

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty() 来劫持各个属性的 setter , getter ,在数据变动时发布消息给订阅者,触发相应的监听回调

写个简单Loader

loader 就是一个 node 模块,它输出了一个函数。当某种资源需要用这个 loader 转换时,这个函数会被调用。并且,这个函数可以通过提供给它的 this 上下文访问 Loader API 。 reverse-txt-loader

// 定义

module.exports = function(src) {

//src是原文件内容(abcde),下面对内容进行处理,这里是反转

var result = src.split(‘’).reverse().join(‘’);

//返回JavaScript源码,必须是String或者Buffer

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-lasFNdEc-1710903139516)]
[外链图片转存中…(img-hdbKmw8p-1710903139517)]
[外链图片转存中…(img-IkdU0psB-1710903139518)]
[外链图片转存中…(img-6LNze9wz-1710903139518)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-3MnBXxm8-1710903139518)]

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值