你应该了解的25个JS技巧,2024年最新web架构师

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

})()

return (length = 12) => ${id.next().value}.padStart(length, ‘0’);

})();

// create unique id from letters and numbers

const uniqueAlphaNumericId = (() => {

const heyStack = ‘0123456789abcdefghijklmnopqrstuvwxyz’;

const randomInt = () => Math.floor(Math.random() * Math.floor(heyStack.length))

return (length = 24) => Array.from({length}, () => heyStack[randomInt()]).join(‘’);

})();

6. 创建一个范围内的数字

Python 里我很喜欢的一个功能是 range 函数,而在 JavaScript 里我经常需要自己写这个功能。下面是一个简单的实现,非常适合 for…of 循环以及需要特定范围内数字的情况。

function range(maxOrStart, end = null, step = null) {

if(!end) {

return Array.from({length: maxOrStart}, (_, i) => i)

}

if(end <= maxOrStart) {

return [];

}

if(step !== null) {

return Array.from(

{length: Math.ceil(((end - maxOrStart) / step))},

(_, i) => (i * step) + maxOrStart

);

}

return Array.from(

{length: Math.ceil((end - maxOrStart))},

(_, i) => i + maxOrStart

);

}

7. 格式化 JSON 字符串,stringify 任何内容

我在使用 NodeJs 将对象记录到控制台时经常使用这种方法。JSON.stringify 方法需要第三个参数,该参数必须有多个空格以缩进行。第二个参数可以为 null,但你可以用它来处理 function、Set、Map、Symbol 之类 JSON.stringify 方法无法处理或完全忽略的内容。

const stringify = (() => {

const replacer = (key, val) => {

if(typeof val === ‘symbol’) {

return val.toString();

}

if(val instanceof Set) {

return Array.from(val);

}

if(val instanceof Map) {

return Array.from(val.entries());

}

if(typeof val === ‘function’) {

return val.toString();

}

return val;

}

return (obj, spaces = 0) => JSON.stringify(obj, replacer, spaces)

})();

8. 顺序执行 promise

如果你有一堆异步或普通函数都返回 promise,要求你一个接一个地执行,这个工具就会很有用。它会获取函数或 promise 列表,并使用数组 reduce 方法按顺序解析它们。

const asyncSequentializer = (() => {

const toPromise = (x) => {

if(x instanceof Promise) { // if promise just return it

return x;

}

if(typeof x === ‘function’) {

// if function is not async this will turn its result into a promise

// if it is async this will await for the result

return (async () => await x())();

}

return Promise.resolve(x)

}

return (list) => {

const results = [];

return list

.reduce((lastPromise, currentPromise) => {

return lastPromise.then(res => {

results.push(res); // collect the results

return toPromise(currentPromise);

});

}, toPromise(list.shift()))

// collect the final result and return the array of results as resolved promise

.then(res => Promise.resolve([…results, res]));

}

})();

9. 轮询数据

如果你需要持续检查数据更新,但系统中没有 WebSocket,则可以使用这个工具来执行操作。它非常适合上传文件时,想要持续检查文件是否已完成处理的情况,或者使用第三方 API(例如 dropbox 或 uber)并且想要持续检查过程是否完成或骑手是否到达目的地的情况。

async function poll(fn, validate, interval = 2500) {

const resolver = async (resolve, reject) => {

try { // catch any error thrown by the “fn” function

const result = await fn(); // fn does not need to be asynchronous or return promise

// call validator to see if the data is at the state to stop the polling

const valid = validate(result);

if (valid === true) {

resolve(result);

} else if (valid === false) {

setTimeout(resolver, interval, resolve, reject);

} // if validator returns anything other than “true” or “false” it stops polling

} catch (e) {

reject(e);

}

};

return new Promise(resolver);

}

10. 等待所有 promise 完成

这个算不上是代码解决方案,更多是对 Promise API 的强化。这个 API 在不断进化,以前我还为“allSettled”“race”和“any”做了代码实现,现在直接用 API 的就好了。

11. 交换数组值的位置

ES6 开始,从数组中的不同位置交换值变得容易多了。这个做起来不难,但是了解一下也不错,

12. 条件对象键

我最喜欢这条技巧了,我在使用 React 更新状态时经常用它。你可以将条件包装在括号中来有条件地将一个键插入一个 spread 对象。

13. 使用变量作为对象键

当你有一个字符串变量,并想将其用作对象中的键以设置一个值时可以用它。

14. 检查对象里的键

这是一个很好的技巧,可以帮助你检查对象键。

15. 删除数组重复项

数组中经常有重复的值,你可以使用 Set 数据结构来消除它。它适用于许多数据类型,并且 set 有多种检查相等性的方法,很好用。对于不同实例或对象的情况,你还是可以使用 Set 来跟踪特定事物并过滤出重复的对象。

16. 在 ArrayforEach 中执行“break”和“continue”

我真的很喜欢使用数组“.forEach”方法,但有时我需要提早退出或继续进行下一个循环,而不想用 for…loop。你可以复制“continue”语句行为来提前返回,但如果要复制“break”行为,则需要使用数组“.some”方法。

17. 使用别名和默认值来销毁

Destructuring(销毁)是 JavaScript 最好用的功能之一,而且你可以使用“冒号”设置别名,并使用“等号”设置属性默认值。

18. 可选链和空值合并

深入检查对象属性并处理 null 和 undefined 值时,你可以使用几个非常好用的 JavaScript 功能来解决常见的问题。

19. 用函数扩展类

我经常对别人讲,JavaScript 类只是构造函数和底层的原型,不是像 Java 中那样的真实概念。一个证据是,你可以只使用一个构造函数来扩展一个类。在私有内容里这个很好用,在类里“#”这些看着很奇怪,并且用于 babel 或 WebPack 时,编译出来的代码更少。

20. 扩展构造函数

类的一个问题是你只能扩展一个其他类。使用构造函数,你可以使用多个构造函数来构成一个函数,这样就会灵活多了。你可以使用函数原型的.apply 或.call 方法来实现。你甚至可以只扩展函数的一部分,只要它是一个对象即可。

21. 循环任何内容

有时,你需要循环任何可迭代的内容(Set、Map、Object、Array、String 等)。这个非常简单的 forEach 函数工具就可以做到这一点。如果回调返回 true,它将退出循环。

function forEach(list, callback) {

const entries = Object.entries(list);

let i = 0;

const len = entries.length;

for(;i < len; i++) {

const res = callback(entries[i][1], entries[i][0], list);

if(res === true) break;

}

}

22. 使函数参数为 required

这是一种确保函数调用了完成工作所需内容的绝佳方法。你可以使用默认参数值的特性来调用函数,然后就会抛出一个错误。如果调用该函数时带上了它需要的值,则该值将替换该函数,并且什么也不会发生。使用 undefined 调用也有相同的效果。

function required(argName = ‘param’) {

throw new Error("${argName}" is required)

}

function iHaveRequiredOptions(arg1 = required(‘arg1’), arg2 = 10) {

console.log(arg1, arg2)

}

iHaveRequiredOptions(); // throws “arg1” is required

iHaveRequiredOptions(12); // prints 12, 10

iHaveRequiredOptions(12, 24); // prints 12, 24

iHaveRequiredOptions(undefined, 24); // throws “arg1” is required

23. 创建模块或单例

很多时候,你需要在加载时初始化某些内容,设置它需要的各种事物,然后就可以在应用程序中到处使用它,而无需再做什么补充工作。你可以使用 IIFE 函数来做到这一点,这个函数太好用了。这种模块模式用来隔离事物非常好用,它可以只暴露需要交互的内容。

24. 深度克隆对象

开发人员通常会安装一些类似“lodash”的库来执行这一操作,但使用纯 JavaScript 来实现确实也很容易。这是一个简单的递归函数:只要是一个对象,就使用函数的构造器将其重新初始化为一个克隆,然后对所有属性重复该过程。

const deepClone = obj => {

let clone = obj;

if (obj && typeof obj === “object”) {

clone = new obj.constructor();

Object.getOwnPropertyNames(obj).forEach(

prop => (clone[prop] = deepClone(obj[prop]))

);

}

return clone;

};

25. 深度冻结对象

如果你喜欢不变性,那么这个工具你一定要常备。

const deepClone = obj => {

let clone = obj;

if (obj && typeof obj === “object”) {

clone = new obj.constructor();

Object.getOwnPropertyNames(obj).forEach(

Vue 编码基础

2.1.1. 组件规范

2.1.2. 模板中使用简单的表达式

2.1.3 指令都使用缩写形式

2.1.4 标签顺序保持一致

2.1.5 必须为 v-for 设置键值 key

2.1.6 v-show 与 v-if 选择

2.1.7 script 标签内部结构顺序

2.1.8 Vue Router 规范

Vue 项目目录规范

2.2.1 基础

2.2.2 使用 Vue-cli 脚手架

2.2.3 目录说明

2.2.4注释说明

2.2.5 其他

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
.1.3 指令都使用缩写形式

2.1.4 标签顺序保持一致

2.1.5 必须为 v-for 设置键值 key

2.1.6 v-show 与 v-if 选择

2.1.7 script 标签内部结构顺序

2.1.8 Vue Router 规范

Vue 项目目录规范

2.2.1 基础

2.2.2 使用 Vue-cli 脚手架

2.2.3 目录说明

2.2.4注释说明

2.2.5 其他

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-z80VCnXs-1713230914562)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值