10 个你可能不知道的高级 JavaScript 技术

你不知道的JS 包含:JS基础、JS实操。 阅读详情
前言

JavaScript 是一种功能强大的开发语言,它隐藏了许多可以用来提高开发效率和代码整洁度的功能。

以下是 10 种你可能不知道的高级 JavaScript 技术,它们可以显著提高你的编码技能。

1. 使用别名进行解构 

解构允许你将数组中的值或对象的属性解包为不同的变量。别名允许你在此过程中重命名变量,这在处理来自外部来源(如 API)的数据时特别有用。

用例:从 API 获取数据时,你想为属性分配更有意义的名称,以提高代码的可读性和可维护性。

const apiResponse = {
  first_name: 'John',
  user_age: 30,
  address: {
    city: 'New York',
    zip: '10001'
  }
};

const {
  first_name: firstName,
  user_age: age,
  address: {
    city: hometown,
    zip: postalCode
  }
} = apiResponse;

console.log(firstName);  // John
console.log(age);        // 30
console.log(hometown);   // New York
console.log(postalCode); // 10001

为什么要使用它:它使变量名更加不言自明和直观,从而提高了代码的可读性和可维护性。

通过使用别名,可以避免命名冲突并提高代码清晰度,从而更轻松地处理复杂的数据结构。

2. 柯里化 

柯里化是将接受多个参数的函数转换为一系列每个接受单个参数的函数的过程。这种技术允许你创建更灵活和可重用的函数,这在函数式编程中特别有用。

用例:创建可重用和可配置的函数以应用折扣。可以创建一个柯里化函数,而不必为不同的折扣百分比编写单独的函数。

const applyDiscount = (discount) => (price) => price - (price * discount / 100);
const tenPercentOff = applyDiscount(10);
const twentyPercentOff = applyDiscount(20);

console.log(tenPercentOff(100)); // 90
console.log(twentyPercentOff(100)); // 80

const applyTax = (taxRate) => (price) => price + (price * taxRate / 100);
const applyTenPercentTax = applyTax(10);

console.log(applyTenPercentTax(100)); // 110
console.log(applyTenPercentTax(twentyPercentOff(100))); // 88

为什么要使用它:它能够在函数中预设参数,从而允许编写更模块化和可组合的代码。

这可以大大简化高度可重用的实用函数的创建,使代码库更简洁、更易于维护。

柯里化在需要部分应用函数或重用具有不同配置的函数的场景中特别有用。

3. 去抖动和节流 

去抖动和节流是控制函数执行频率的技术。它们对于优化事件处理程序和防止可能降低性能的过多函数调用特别有用。

去抖动:

去抖动可确保仅在上次调用函数后经过一定时间后才调用该函数。这对于搜索输入字段等场景很有用,在这些场景中,如果希望仅在用户停止输入后才进行 API 调用。

用例:优化搜索输入字段以减少 API 调用次数。

这可以防止服务器过载并通过仅在用户完成输入后启动搜索来改善用户体验。

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => func.apply(this, args), delay);
  };
}

const search = debounce((query) => {
  console.log(`Searching for ${query}`);
  // Assume an API call here
}, 300);

document.getElementById('searchInput').addEventListener('input', (event) => {
  search(event.target.value);
});

为何使用它:通过确保仅在用户停止执行触发操作后才调用函数,减少不必要的函数调用次数,从而提高性能和用户体验。这对于涉及网络请求或大量计算的操作特别有用。

节流:

节流确保在指定时间段内最多调用一次函数。这对于想要限制函数调用频率的滚动事件等场景很有用。

用例:优化滚动事件处理以获得更好的性能。这可以防止浏览器因过多的事件调用而过载,从而确保更流畅、响应更快的交互。

function throttle(func, interval) {
  let lastCall = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastCall >= interval) {
      lastCall = now;
      func.apply(this, args);
    }
  };
}

const handleScroll = throttle(() => {
  console.log('Scrolled');
  // Assume complex calculations or DOM updates here
}, 300);

window.addEventListener('scroll', handleScroll);

为什么要使用它:通过确保以受控间隔调用函数来防止性能问题,减少浏览器负载并提供更好的用户体验。节流对于可能频繁触发的事件侦听器特别有用,例如,滚动或调整大小事件。

4. 记忆化 

记忆化是一种优化技术,涉及缓存昂贵的函数调用的结果,并在再次出现相同输入时返回缓存的结果。

这可以显著提高计算成本高昂的函数的性能,尤其是那些使用相同参数频繁调用的函数。

用例:提高斐波那契数计算等递归函数的性能。如果没有记忆化,每次调用斐波那契函数都会重复计算相同的值多次,从而导致指数时间复杂度。

const memoize = (fn) => {
  const cache = {};
  return (...args) => {
    const key = JSON.stringify(args);
    if (!cache[key]) {
      cache[key] = fn(...args);
    }
    return cache[key];
  };
};

const fibonacci = memoize((n) => {
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
});

console.log(fibonacci(40)); // 102334155

为什么要使用它:避免冗余计算,显著提高具有重复输入的函数的性能。

记忆化可以将低效的递归计算转换为可管理的线性时间操作,使其成为优化性能密集型任务的必备技术。

5. 代理 

代理对象允许您为另一个对象创建代理,该代理可以拦截和重新定义该对象的基本操作,例如属性查找、赋值、枚举、函数调用等。

这提供了一种向对象添加自定义行为的强大方法。

用例:实现对对象属性访问和赋值的验证和日志记录。

例如,您可以强制执行类型约束并记录访问尝试,从而提供更好的控制和调试功能。

const user = {
  name: 'John',
  age: 30
};

const handler = {
  get: (target, prop) => {
    console.log(`Getting ${prop}`);
    return target[prop];
  },
  set: (target, prop, value) => {
    if (prop === 'age' && typeof value !== 'number') {
      throw new TypeError('Age must be a number');
    }
    console.log(`Setting ${prop} to ${value}`);
    target[prop] = value;
    return true;
  }
};

const proxyUser = new Proxy(user, handler);
console.log(proxyUser.name); // Getting name, John
proxyUser.age = 35; // Setting age to 35
// proxyUser.age = '35'; // Throws TypeError

为什么要使用它:允许对对象操作(例如验证、日志记录等)进行自定义行为,从而增强对对象交互的控制。

代理还可用于实现复杂的逻辑,如访问控制和数据绑定。

这使它们成为管理和扩展对象行为的多功能工具。

6. 生成器 

生成器是可以退出并稍后重新进入的函数,在重新进入之间保持其上下文和变量绑定。它们对于实现迭代器和以同步方式处理异步任务非常有用。

用例:实现迭代器以进行自定义对象遍历。

生成器提供了一种定义自定义迭代行为的简单方法,使遍历复杂数据结构变得更简单。

function* objectEntries(obj) {
  for (let key of Object.keys(obj)) {
    yield [key, obj[key]];
  }
}

const user = { name: 'John', age: 30, city: 'New York' };

for (let [key, value] of objectEntries(user)) {
  console.log(`${key}: ${value}`);
}
// name: John
// age: 30
// city: New York

为什么要使用它:提供强大的工具来实现自定义迭代器并简化异步工作流。

生成器使处理复杂的迭代逻辑和异步过程变得更加容易,从而产生更易读和更易于维护的代码。

它们还可以与 co 等库一起使用,以更直接、更线性的方式管理异步操作。

7. 充分利用控制台 

用例:改进用于调试复杂对象的日志记录。console.table、console.group 和 console.time 等控制台方法可以提供更结构化和信息丰富的调试信息。

// Basic logging
console.log('Simple log');
console.error('This is an error');
console.warn('This is a warning');

// Logging tabular data
const users = [
  { name: 'John', age: 30, city: 'New York' },
  { name: 'Jane', age: 25, city: 'San Francisco' },
];
console.table(users);

// Grouping logs
console.group('User Details');
console.log('User 1: John');
console.log('User 2: Jane');
console.groupEnd();

// Timing code execution
console.time('Timer');
for (let i = 0; i < 1000000; i++) {
  // Some heavy computation
}
console.timeEnd('Timer');

为什么要使用它:增强调试信息的可见性和组织性,使诊断和解决问题变得更加容易。

正确使用控制台方法可以通过提供清晰、有条理和详细的日志来显著改善调试过程。

8. 使用structuredClone进行结构化克隆 

使用新的structuredClone方法深度克隆对象。与传统的浅层复制不同,结构化克隆会创建对象的深层副本,确保嵌套对象也被复制。

此方法避免了JSON.parse(JSON.stringify(obj))的局限性,它无法处理某些数据类型,如函数、未定义和循环引用。

用例:创建复杂对象的深层副本。当需要复制对象以执行不应更改原始数据的操作时,这很有用。

const obj = {
  a: 1,
  b: { c: 2 },
  date: new Date(),
  arr: [1, 2, 3],
  nestedArr: [{ d: 4 }]
};
const clonedObj = structuredClone(obj);

console.log(clonedObj);
// { a: 1, b: { c: 2 }, date: 2023-06-08T00:00:00.000Z, arr: [1, 2, 3], nestedArr: [{ d: 4 }] }
console.log(clonedObj === obj); // false
console.log(clonedObj.b === obj.b); // false
console.log(clonedObj.date === obj.date); // false
console.log(clonedObj.arr === obj.arr); // false
console.log(clonedObj.nestedArr[0] === obj.nestedArr[0]); // false

为什么要使用它:提供一种内置的、高效的深度克隆对象方法,避免手动深度复制实现的陷阱和复杂性。

与 JSON.parse(JSON.stringify(obj)) 等替代方法相比,此方法更可靠,可以更好地处理复杂的数据结构。

9. 自调用函数 

自调用函数,也称为立即调用函数表达式 (IIFE),是在创建时自动执行的函数。它们对于封装代码以避免污染全局范围很有用,这对于维护干净和模块化的代码至关重要。

用例:封装代码以避免污染全局范围。此技术在较旧的 JavaScript 环境中特别有用,在这些环境中,块作用域(let 和 const)不可用,或者当需要立即执行初始化逻辑时。

(function() {
  const privateVar = 'This is private';
  console.log('Self-invoking function runs immediately');
  // Initialization code
})();

// Private variable can't be accessed from outside
// console.log(privateVar); // ReferenceError: privateVar is not defined

为什么要使用它:通过避免全局变量并执行初始化代码而不在全局范围内留下痕迹,有助于维护干净的代码。

这种方法可以防止大型代码库中的冲突,并确保更好地封装功能,从而提高代码的可维护性并减少副作用。

10. 标记模板文字 

标记模板文字允许你自定义模板文字的处理方式。它们对于创建专用模板很有用,例如用于国际化、清理 HTML 或生成动态 SQL 查询。

用例:清理 HTML 模板中的用户输入以防止 XSS 攻击。此技术可确保用户生成的内容安全地插入 DOM 中,而不会执行任何恶意脚本。

function sanitize(strings, ...values) {
  return strings.reduce((result, string, i) => {
    let value = values[i - 1];
    if (typeof value === 'string') {
      value = value.replace(/&/g, '&amp;')
                   .replace(/</g, '&lt;')
                   .replace(/>/g, '&gt;')
                   .replace(/"/g, '&quot;')
                   .replace(/'/g, '&#39;');
    }
    return result + value + string;
  });
}

const userInput = '<script>alert("xss")</script>';
const message = sanitize`User input: ${userInput}`;
console.log(message); // User input: &lt;script&gt;alert("xss")&lt;/script&gt;

为什么要使用它:提供一种强大的机制来控制和自定义模板文字的输出,从而实现更安全、更灵活的模板创建。

标记模板文字可用于强制执行安全性、格式化字符串和生成动态内容,从而增强代码的稳健性和多功能性。

结论 

JavaScript 是一种功能丰富的语言,可以帮助你编写更干净、更高效的代码。通过将这些高级技术融入到你的开发实践中,可以提高工作效率并增强代码的可读性。

关于优联前端

        武汉优联前端科技有限公司由一批从事前端10余年的专业人才创办,是一家致力于H5前端技术研究的科技创新型公司,为合作伙伴提供专业高效的前端解决方案,合作伙伴遍布中国及东南亚地区,行业涵盖广告,教育, 医疗,餐饮等。有效的解决了合作伙伴的前端技术难题,节约了成本,实现合作共赢。承接开发Web前端,微信小程序、小游戏,2D/3D游戏,动画交互与UI广告设计等各种技术研发。

超全JavaScript代码实战合集与核心技术详解 htmltable {th, td {th {pre {简介:JavaScript是Web开发的核心技术之一,广泛用于实现网页动态交互、服务器端编程及移动应用开发。本“js代码大全”资源包含丰富的示例代码、函数库与项目实践,涵盖JS基础语法、DOM/BOM操作、异步编程、ES6+新特性、主流框架、AJAX、闭包、原型继承、模块化、TypeScript及调试优化等关键知识点。 阅读详情

相关推荐

深入探索JavaScript的你不知道的JS全集

函数是执行特定任务的代码块。在JavaScript中,函数可以使用function关键字定义,也可以采用函数表达式或箭头函数的形式。函数可以带参数,并且可以返回值。通过这些基础语法的讲解,我们可以开始构建简单而有效的JavaScript代码。下一章将探讨作用域和闭包,这是任何JavaScript开发者都需要深入理解的重要概念。闭包是JavaScript的一个强大特性,它允许函数访问并操作函数外部的变量。

weixin_36431814的博客 895

js过渡效果_15 个有趣的 JS 和 CSS 库

Core UICore UI 是一个基于 Bootstrap 4 的管理模板,它提供了创建控制面板的高度自定义解决方案。同时,为了让你快速的将它与一些流行的框架整合使用(AngularJS,Angular 2,React.js 和 Vue.js.),它还提供了一些独立的样板版本。React Trend这是由Unsplash团队出品的一款 React 组件,用于创建展示趋势与活动指标的优雅的线型图。...

weixin_39582480的博客 556

非常有趣的JS,大家下载啊

非常有趣的JS,大家下载啊非常有趣的JS,大家下载啊非常有趣的JS,大家下载啊

JavaScript核心技术

声明式:解析器会先读取函数声明,并使其在执行任何代码之前可以访问;匿名式:必须等到解析器执行到它所在的代码行才会真正被解释执行;Function 构造函数:从技术角度讲,这是一个函数表达式。一般不推荐用这种方法定义函数,因为这种语法会导致解析两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能;')【案例】:分别基于JS函数三种创建方式,完成数据求和操作1、创建day03-js静态工程2、创建demo1.html页面,定义三种JS函数

愿七安的博客 1108

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

粒子滤波在基于误差状态量的INS/GNSS组合导航中的使用技巧-On Particle Filter based Error-State INS/GNSS Intergrated Navigation

本文面向以15维惯导(INS)误差为状态量,3维位置误差为量测量的INS/GNSS组合导航系统,​在西工大严恭敏老师的开源工具箱中PF相关库函数基础上实现基于粒子滤波(PF)的惯导误差状态量的递推估计,设计了粒子重置环节并强调了其在本特定场景下的重要性。

I33D33I的博客 1742

JavaScript技术(js)

JavaScript技术(js) 一、简介: 1.js:基于浏览器的,解释型,面向对象的编程语言 ​ 1)编译型语言:—C C++ 运行效率高,不能跨平台 ​ 2)解释型语言:—HTML js 运行效率低,可以跨平台 ​ 3)先编译后解释-----java C# 运行效率较高,可以跨平台 2.作用:用来嵌入到HTML页面里面,为”网页“添加动画效果 ​ 1)HTML+css—静态...

weixin_45536396的博客 3684

【架构师面试-缓存与搜索-1】-缓存与缓存置换策略源码实现

1:什么是缓存 缓存:加速数据访问的存储,降低延迟(latency),提升吞吐量(Throughput)的利器。 1:缓存演进历史 1. 查库 2. ConcurrentHashMap 3. LRU 4. Guava Cache 5. 分布式缓存(redis,MemCache) 6. 多级缓存 2:在什么地方加缓存 缓存对于每个开发者来说是相当熟悉了,为了提高程序的性能我们会去加缓存,但是在什么地方加缓存,如何加缓存呢? 举个栗子:假设一个网站,需要提高性能,缓存可以放在浏览器,可以放

chongfa2008的博客 6440

JavaScript 的新技能:5 大技巧,打造更强大的 Web 应用

大家好,我是前端宝哥。JavaScript 在现代 Web 开发中简直是必不可少的工具! 它一直在不断变化,为我们带来新玩法。今天就来跟大家聊聊 5 个顶尖的 JavaScript 技术,教你用更酷炫的方式构建 Web 应用!为什么 JavaScript 这么受欢迎?JavaScript 灵活又强大,它可以用来做各种事情,几乎是无处不在! 它可以创建那些超级酷炫的动态网页,例如实时更新、各种交互功...

前端开发博客 1205

Java开发者必看:如何快速对接七大主流快递API(附完整代码示例)

本文为Java开发者提供了快速对接顺丰、京东、DHL等七大主流快递API的实战指南。文章深入剖析了不同API的认证、通信协议与参数差异,并提供了高可用的HTTP客户端配置、通用签名工具、SOAP请求处理以及可扩展的领域模型与适配层设计等完整代码示例,帮助开发者构建统一、健壮的物流集成框架,显著提升开发效率。

tech5的博客 728

Python头歌实验题目(2024版)

武汉理工大学头歌平台实验题目

2401_84152595的博客 2万+

你不知道的javascript

最近笔者使用node.js完成了一个小型项目,在javascript的泥坑里面摸爬滚打了一番,感触颇深。Javascript会给习惯于传统面向对象模式的开发人员,带来很多意想不到的障碍。这些问题基本上是因为误解了javascript的设计导致的。 如果有本书能把js的这些槽点、另类之处,一次性说个明白就好了。还真是有,图灵就出版了一本《你不知道的javascript》。 图灵出版的这本《你不知道的javascript》三卷。 https://pan.baidu.com/s/1K2dW_syvf5LFDJYF

weixin_35597398的博客 5316

C#程序突然崩溃怎么办?5分钟学会分析Dump文件(Visual Studio 2022实战)

本文详细介绍了在C#程序崩溃或无响应时,如何捕获并分析Dump文件以快速定位问题。通过Visual Studio 2022实战演示,重点讲解了配置符号服务器、解读调用堆栈与内存状态,以及针对CPU飙高、内存泄漏等典型场景的分析方法,帮助开发者高效进行故障诊断。

docker8compose的博客 474

你不知道的 10 个 JavaScript 高级技巧

JavaScript 是一门功能丰富的语言,可以帮助你编写更简洁、更高效的代码。通过将这些高级技巧融入你的编码实践中,你可以提高你的生产力并增强代码的可读性。从带别名的解构到柯里化、防抖、节流等等,这些技巧可以使你的代码更简洁、更高效。祝你编程愉快!

2401_86113453的博客 2134

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。

龚礼鹏的博客 2547

Claude Code Agents 进阶:多代理协作与任务委托

Agent 是一个独立运行的 Claude 实例,它有自己的上下文和任务焦点。│ 主 Claude ││ (协调者) ││ │ │▼ ▼ ▼│ 代码审查 │ │ 测试生成 │ │ 文档编写 ││ │ ││▼汇总结果,完成任务并行处理:多个 Agent 同时工作,提高效率任务隔离:每个 Agent 有独立的上下文专业分工:不同类型的 Agent 擅长不同任务灵活控制:可以指定运行模式、超时等参数。

gaoxiang_120的专栏 336

你不知道的JavaScript

很多人对JavaScript这门语言的印象都是简单易学,很容易上手。虽然JavaScript语言本身有很多复杂的概念,但语言的使用者不必深入理解这些概念就可以编写出功能全面的应用。殊不知,这些复杂精妙的概念才是语言的精髓,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解它们。在本书中,我们要直面当前JavaScript开 发者“不求甚解”的大趋势,深入理解语言内部的机制。

hacker707的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

javascript高级程序设计 javascript权威指南

这篇文章主要介绍了javascript高级程序设计 javascript权威指南,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。

chatgpt001的博客 1238

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一起学《你不知道的JS》

JavaScript 作为前端最重要的一门开发语言,平时可能用的比较熟,面试的时候稍微往深问一问,可能真的什么都不知道了。这说明你对 JavaScript 没有进行系统深入地学习,只处于...

lefex的博客 529

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

你不知道的JavaScript:深潜JS核心机制的奇妙之旅!

朋友们,今天咱们来聊聊前端圈子里那个传奇系列——“You Don’t Know JS”(中文译名《你不知道的JavaScript》)。别被书名吓到,这可不是那种板着脸教训人的技术书,更像是位叼着雪茄的老船长,带着你在JavaScript的惊涛骇浪里玩冲浪!最妙的是,当你真正吃透这些原理,新出的框架/工具学起来快得飞起!市面上99%的JS教程教你怎么用工具,而这套书直接把你拽进引擎盖下面,让你亲眼看看发动机怎么转的!那章,才恍然大悟——原来不是JavaScript疯了,是我根本不懂它的游戏规则!

fintechdev的博客 910

你可能不知道的10个JavaScript小技巧

尽管我使用Javascript来做开发有很多年了,但它常有一些让我很惊讶的小特性。对于我来说,Javascript是需要持续不断的学习的。在这篇文章中,我将列出10个Javascript使用小技巧,主要面向Javascript新手和中级开发者。希望每个读者都能至少从中学到一个有用的技巧。 1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来...

122

你可能不知道的JavaScript 遍历DOM的几种方法

你可能不知道的JavaScript 遍历DOM的几种方法

Quiet-Night的博客 2万+

TypeScript 您可能不知道的15个高级技巧

TypeScript 已成为许多开发人员的必备工具,它提供类型安全性和增强的开发人员体验。虽然大多数人都熟悉它的基本功能,但 TypeScript 有很多高级技术可以提高应用程序的类型安全性。本文深入探讨了 15 个鲜为人知的 TypeScript 提示和技巧,它们将扩展您的工具包,并可能重塑您进行 TypeScript 开发的方式。不要浪费任何时间,让我们开始吧!1. 字符串文字插值类型字符串文本类型功能强大,但您知道可以对它们进行插值吗?此功能允许基于其他类型的动态创建字符串文本类型。

liangshanbo1215的博客 1292

那些你可能不知道的JavaScript

那些你可能不知道的JavaScript JavaScript语音涉及到的内容是非常非常多的,首先我们来谈谈创建对象常用的几种方式 方式一:通过对象字面量表示法(又称为直接量、原始方式) var obj={name:"xyz123"} 对象字面量是一个名/值对列表,每个名/值对之间用逗号分隔,名和值之间用冒号分隔,最后整体用一个花括号括起来。属性名可以使用数值,数值属性名会自动转换为字符串。 在ES5中,对象直接量中的最后一个属性后的逗号可以省略,且在ES3的大部分实现中也可以忽略这个逗号,但在IE中则报

qq_46366496的博客 337

探索Vue.js的深度:《你可能不知道的Vuejs》系列文章推荐

探索Vue.js的深度:《你可能不知道的Vuejs》系列文章推荐 项目介绍 《你可能不知道的Vuejs》系列文章是由一位资深开发者在其Vue.js学习与实践过程中总结出的宝贵经验和技巧的集合。这个系列不仅仅是对Vue.js基础知识的简单介绍,更是深入探讨了如何在实际项目中高效使用Vue.js,以及如何应对复杂功能需求的实战指南。文章从初学者的角度出发,逐步引导读者从基础到高级,再到实际项目的应用,...

gitblog_00066的博客 500
上一篇: 24 条可以提高工作效率的前端开发技巧代码片段
下一篇: 如何避免写出高耦合低内聚的前端代码?
优联前端
博客等级 码龄5年 1832粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值