还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
深度学习指南JavaScript欢迎来到《深度学习指南》课程!本课程将全面深入地探索JavaScript语言的核心概念、高级特性以及实际应用场景无论您是JavaScript初学者还是希望提升技能的开发者,这门课程都将为您提供JavaScript系统性的知识框架和实用技巧在接下来的课程中,我们将从基础语法开始,逐步深入到异步编程、模块化、前端架构等高级主题通过丰富的示例和实战练习,帮助您真正掌握的精髓,并能在实际项目中灵活应用JavaScript课程导入与目标核心学习目标掌握语言核心概念与高级特性,能够独立解决复杂编程问JavaScript题,并在实际项目中灵活运用所学知识课程结构设计从基础语法到高级特性,循序渐进,每个模块包含理论讲解与实战练习,确保知识点得到充分消化适用对象前端开发者、全栈工程师、对感兴趣的计算机专业Web JavaScript学生,以及希望提升技能的在职程序员先修知识要求基本的知识,了解编程基础概念如变量、函数、循环HTML/CSS等,能够使用简单的开发工具发展历史JavaScript年诞生1995由Brendan Eich在网景公司(Netscape)仅用10天时间开发完成,最初名为Mocha,后改名为LiveScript,最终定名为JavaScript年标准化1997被提交给ECMA国际组织进行标准化,形成ECMAScript标准规范,JavaScript成为这一标准的最著名实现年代普及2000随着Ajax技术的兴起和Web
2.0时代到来,JavaScript在网页交互中的作用日益重要,成为前端开发的核心技术年革新2015ES6ES6(ECMAScript2015)发布,带来class、箭头函数、Promise等重要特性,使JavaScript成为更现代化的编程语言生态系统概览JavaScript浏览器端应用服务端Node.js前端网页交互、单页应用()开发、SPA服务器开发、中间件、实时通信应API(渐进式应用)、PWA WebWebGL3D用、命令行工具、自动化脚本等渲染等桌面应用开发移动端开发框架允许使用构建、等框架用于构建跨Electron JavaScript React NativeIonic跨平台桌面应用,如、等平台移动应用,使用一次编VS CodeSlack JavaScript知名软件写多平台运行初识语法JavaScript你的第一个基础语法特点Hello World区分大小写的语言•//方法一在HTML中嵌入脚本语句末尾分号可选(建议保持一致)•使用字符集,支持中文变量名•Unicode//方法二外部JS文件引入支持单行和多行注释•弱类型动态语言,变量类型可变•支持多种编程范式面向对象、函数式等•//方法三在浏览器控制台中直接执行console.logHello,World!;变量声明与作用域声明方式变量提升作用域重复声明初始化要求会提升,初始函数作用域允许可选var化为undefinedlet不会提升存块级作用域不允许可选在暂时性死区const不会提升存块级作用域不允许必须在暂时性死区变量提升是JavaScript的一个独特特性,会将变量和函数的声明提升到当前作用域的顶部然而,只有声明会被提升,赋值或初始化操作并不会被提升在ES6引入的块级作用域之前,JavaScript只有全局作用域和函数作用域块级作用域解决了许多变量污染问题,提高了代码的可维护性和安全性推荐在现代开发中优先使用let和const替代var关键字与保留字常用关键字保留字示例命名陷阱与建议•var,let,const-声明变量•enum-虽未实现但已保留•避免使用关键字作为变量名或函数名条件控制可不要覆盖全局对象如•if,else,switch,case-•implements,interface,package-•window,能在严格模式下使用循环document•for,while,do,break,continue-控制•private,protected,public-类访问修•采用驼峰命名法提高代码可读性饰符•function,return-函数相关•常量通常使用全大写加下划线特定场景关键字•try,catch,throw,finally-异常处理•static,yield,await-•私有属性习惯以下划线开头类与对象•class,extends,super,new-类型体系JavaScript原始类型()引用类型()Primitive TypesReference Types文本字符串,如对象,包含属性的集合String HelloObject整数或浮点数,如或数组,有序集合Number
423.14Array或函数,可执行代码块Boolean truefalse Function未赋值的变量默认值日期对象Undefined Date表示空值或不存在正则表达式Null RegExp新增,创建唯一标识符新增集合类型Symbol ES6Map/Set ES6大整数,用于超出范围的整数类实例自定义类的实例对象BigInt Number中原始类型和引用类型有本质区别原始类型按值存储,引用类型按引用存储使用运算符可以检查基本类JavaScript typeof型,但对复杂对象通常返回;而运算符则用于检查对象是否为特定类的实例object instanceof类型转换机制隐式类型转换自动完成的类型转换JavaScript显式类型转换使用转换函数主动进行的类型转换转换陷阱容易造成错误的类型转换情况作为弱类型语言,在运算过程中会进行大量的隐式类型转换例如,当字符串与数字进行加法运算时,数字会被转换为JavaScript字符串;而在减法运算中,字符串会尝试转换为数字这种灵活性带来便利的同时也容易导致意外错误常见的显式转换方法包括、、等构造函数,以及、等专用函数理解类型转Number StringBoolean parseIntparseFloat换规则对于编写可靠的代码至关重要,特别是在处理用户输入和进行数据运算时JavaScript运算符与表达式算术运算符赋值运算符逻辑运算符比较运算符•加法:+•简单赋值:=•逻辑与:•相等:==,===•减法:-•复合赋值:+=,-=,*=,•逻辑或:||•不等:!=,!==•乘法:*/=•逻辑非:!•大小比较:,,=,=•除法:/•ES6解构赋值:•空值合并:[a,b]=[1,2]•取余:%•幂运算:**•自增/自减:++/--理解运算符优先级对于正确计算表达式至关重要括号拥有最高优先级,可用于改变默认的计算顺序JavaScript中的逻辑运算符具有短路特性,例如和||运算符会在确定结果后停止计算,这一特性常被用于简化条件判断和默认值设置条件语句语句if...else最基本的条件分支结构语句switch多值条件分支优化选择三元运算符简洁的单条件表达式条件语句是中实现逻辑分支的基础工具语句适用于复杂的逻辑条件判断,可以嵌套使用以处理多个条件场景当需要根JavaScript if据单一变量的不同值执行不同代码块时,语句通常比多个更清晰简洁switch if-else三元运算符是的简洁形式,适合简单条件判断和值赋予操作在实际开发中,我们应根据逻辑复杂conditionexpr1:expr2if-else度选择最合适的条件结构,既保证代码的可读性,又能确保执行效率过度使用嵌套条件会导致代码难以维护,应考虑使用提前返回或逻辑分解等技巧优化循环语句与遍历传统循环结构现代遍历方法//for循环//for...in适用于对象属性遍历for leti=0;i5;i++{const person={name:张三,age:30};console.logi;for let key inperson{}console.logkey+:+person[key];}//while循环let j=0;//for...of适用于可迭代对象如数组while j5{const colors=[红,绿,蓝];console.logj;for letcolor ofcolors{j++;console.logcolor;}}//do...while循环//forEach方法letk=0;colors.forEachcolor,index={do{console.log`颜色${index}:${color}`;console.logk;};k++;}while k5;for...in和for...of是两种常被混淆的遍历方式,它们有着本质区别for...in遍历的是对象的可枚举属性键名,包括继承的属性,主要用于对象属性遍历;而for...of遍历的是可迭代对象的值,如数组、字符串等,更适合处理数据集合函数声明与表达式函数声明•使用function关键字直接定义•存在声明提升,可在声明前调用•形式function nameparams{...}函数表达式•将匿名函数赋值给变量•不会被提升,必须在定义后调用•形式const name=functionparams{...}箭头函数ES6•更简洁的语法•没有自己的this,继承上下文的this•形式params=expression或{...}立即执行函数表达式IIFE•定义后立即执行的函数•创建独立的作用域,避免变量污染•形式function{...}或={...}箭头函数相比传统函数有几个重要区别没有自己的this绑定,始终捕获其所在上下文的this值;不能作为构造函数使用;没有arguments对象;不能用作生成器函数这些特性使箭头函数特别适合用作回调函数或简短的单行操作参数和默认值默认参数剩余参数引入了默认参数语法,可以为函数参数设置默认值,当调用使用运算符收集剩余的参数到一个数组中,必须是参数列表中ES
6...时未提供该参数或值为时使用默认值默认参数可以的最后一个参数剩余参数提供了比对象更清晰的处undefined arguments是简单值,也可以是表达式或函数调用理可变参数函数的方式对象参数解构arguments传统的类数组对象,包含传递给函数的所有参数在箭头函数中可以在函数参数处使用对象或数组解构,直接从传入的复杂对象不可用,但在普通函数中仍可访问它不是真正的数组,需要转中提取所需属性作为参数,使函数调用更简洁清晰换才能使用数组方法关键字理解this调用方式this指向示例代码普通函数调用非严格模式全局对象window/global function test{console.logthis;}严格模式undefined test;//window或undefined对象方法调用调用该方法的对象const obj={method{console.logthis;}}obj.method;//obj构造函数调用新创建的对象实例function Person{this.name=张三;}const p=new Person;//this指向p箭头函数定义时外层作用域的this值const obj={method:={console.logthis;}}obj.method;//window而非objcall/apply/bind显式指定的对象functiontest{console.logthis;}test.call{name:李四};//{name:李四}理解this指向是JavaScript中最易混淆的概念之一this的值在函数执行时确定,而非定义时,这种动态绑定机制既灵活又容易出错箭头函数的this继承自外部作用域,这种特性使其特别适合作为回调函数使用,尤其在处理事件监听和定时器时能避免常见的this丢失问题闭包原理与应用闭包定义常见应用场景•函数与其词法环境的组合•数据封装与私有变量•内部函数可以访问外部函数的变量和•函数工厂与柯里化参数•模块化模式实现•即使外部函数已经返回,内部函数仍•回调函数中保存状态然可以访问其变量•事件处理器与计时器内存管理注意事项•闭包会保持对外部变量的引用•过度使用可能导致内存泄漏•不再需要时应解除引用•避免循环引用导致的问题闭包是JavaScript中最强大也最容易被误解的特性之一通过闭包,我们可以创建能记住其创建环境的函数,这使得函数可以访问其词法作用域之外的变量这一特性在实现数据隐藏、函数工厂和模块模式等方面有着广泛应用然而,闭包也带来了内存管理的挑战由于闭包会持续引用外部函数的变量,这些变量不会被垃圾回收,可能导致内存泄漏在使用闭包时,应当注意适时清除不再需要的引用,特别是在长期运行的应用程序中作用域链全局作用域最外层的作用域,全局可访问函数作用域函数内部创建的独立环境块级作用域由花括号创建的作用域{}ES6作用域链是引擎查找变量的路径,从当前作用域开始,逐层向外查找,直至全局作用域的作用域在代码编译阶段确JavaScript JavaScript定(词法作用域),而非执行阶段当访问一个变量时,引擎首先查找当前作用域,如果找不到,会沿着作用域链向上查找父级作用域,直到找到该变量或到达全局作用域理解作用域链对于调试变量访问问题至关重要内部作用域可以访问外部作用域的变量,但外部作用域无法访问内部作用域的变量这种单向访问机制是变量隔离和安全性的基础和引入的块级作用域进一步细化了变量的可见范围,减少了因作用域混淆导致JavaScript letconst的错误对象与属性对象创建方法属性描述符与操作//对象字面量//定义属性const person={Object.definePropertyperson,gender,{name:王五,value:男,age:28,writable:true,greet{enumerable:true,return`你好,我是${this.name}`;configurable:true}};};//属性描述符获取//构造函数const desc=Object.getOwnPropertyDescriptorfunction Personname,age{person,namethis.name=name;;this.age=age;console.logdesc;this.greet=function{return`你好,我是${this.name}`;//属性的遍历};//获取自身可枚举属性键}const keys=Object.keysperson;const person2=new Person赵六,32;//获取所有自身属性键(包括不可枚举)const allKeys=Object.getOwnPropertyNamesperson;//Object.create//获取自身可枚举属性键值对const personProto={const entries=Object.entriesperson;greet{//基于键值对创建对象return`你好,我是${this.name}`;const fromEntries=Object.fromEntries[}[name,张三],};[age,30]const person3=Object.createpersonProto;];person
3.name=钱七;person
3.age=25;数组与高级方法创建与初始化修改与操作字面量、构造函数、、Array.from、、、push/pop shift/unshift splicefill等多种创建数组的方式,满足不Array.of等方法用于添加、删除、替换数组元素同数据来源的需求查找与迭代转换与映射、、、、、、、等方法indexOf findevery somemap flatMapfilter reduce等方法用于元素查找和遍历处理创建新数组并进行数据转换或聚合forEach数组的高级方法极大地简化了数据处理操作方法可以将数组中的每个元素映射为新值;方法可以筛选出符合条件的元素;map filter方法则可以将数组归约为单一值,如求和或构建新对象这些函数式编程方法不仅代码简洁,还避免了副作用,提高了代码的可维护reduce性和可测试性理解数组方法是否修改原数组至关重要例如,、、等方法会直接修改原数组,而、、等方法则返回新数push popsplice mapfilter concat组而不影响原数组在实际开发中,应根据需求选择适当的方法,以避免意外的副作用或性能问题字符串与正则表达式字符串常用正则表达式基础API基本属性创建方式字面量与构造函数length/pattern/new RegExp查找方法常用元字符indexOf,lastIndexOf,includes,^,$,.,*,+,,[],{},|,\d,\w,\sstartsWith,endsWith修饰符忽略大小写全局多行点号匹配换行i,g,m,s提取方法slice,substring,substr,charAt替换方法方法replace,replaceAll RegExptest,exec转换方法正则方法toUpperCase,toLowerCase,trim,String match,matchAll,search,padStart,padEnd replace分割方法捕获组使用分组并提取匹配内容split模板字符串使用反引号和插值断言${expression}=,!,=,正则表达式提供了强大的文本处理能力,常用于表单验证、数据提取、文本替换等场景虽然正则表达式简洁高效,但过于复杂的模式可能导致可读性和维护性降低,建议适度使用并添加清晰的注释、与全局对象Date Math对象对象Date MathJavaScript的Date对象提供了日期Math对象包含了各种数学常量和函和时间的创建、格式化和计算功能数常用属性有Math.PI、Math.E等可以通过new Date创建当前时数学常量;常用方法有间,或通过传入特定参数创建指定时Math.round、Math.floor、间常用方法包括getFullYear、Math.ceil用于取整,getMonth、getDate等获取日期Math.random生成随机数,以及组件,以及setFullYear、Math.max、Math.min、setMonth等设置日期组件Math.pow等数学运算函数全局对象浏览器环境中的全局对象是window,Node.js环境中是global,而ES2020引入的globalThis则提供了统一的全局对象访问方式全局对象上定义了许多内置函数如parseInt、encodeURI,以及构造函数如Array、Object等Date对象在处理时区时需要特别注意默认情况下,Date方法会根据用户系统的时区设置进行转换,这在国际化应用中可能导致问题为了更精确地处理日期时间,现代应用通常使用如Moment.js、date-fns或原生的Intl API等工具库,它们提供了更丰富的格式化和时区处理功能异常处理机制块try包含可能抛出异常的代码块catch捕获并处理try块中的异常块finally无论是否发生异常都会执行的清理代码语句throw手动抛出自定义异常JavaScript中的异常对象通常是Error类的实例,包含message和stack属性,分别表示错误信息和调用堆栈除了基本的Error外,还有一些特殊类型如SyntaxError、TypeError、ReferenceError等,它们针对不同种类的错误提供更具体的信息在实际开发中,合理使用异常处理可以提高代码的健壮性应当只捕获预期中可能发生的异常,而不是使用空的catch块忽略所有错误对于异步代码,Promise的catch方法和async/await的try/catch结构提供了处理异步操作中错误的机制自定义错误类型继承自Error基类可以帮助创建更具语义的错误处理系统原型与继承基础原型链核心概念构造函数继承示例•每个对象都有一个内部属性[[Prototype]],指向其原型对象//父构造函数•通过__proto__或Object.getPrototypeOf可以访问对象的原型function Animalname{•构造函数有prototype属性,指向实例对象的原型this.name=name;•原型链是对象通过原型连接形成的层次结构}Animal.prototype.speak=function{•属性和方法查找沿着原型链向上进行return`${this.name}发出声音`;•Object.prototype是原型链的终点,其原型为null};//子构造函数function Dogname,breed{//调用父构造函数Animal.callthis,name;this.breed=breed;}//继承父原型Dog.prototype=Object.createAnimal.prototype;//恢复构造函数指向Dog.prototype.constructor=Dog;//添加/覆盖方法Dog.prototype.speak=function{return`${this.name}汪汪叫`;};const myDog=new Dog小黑,拉布拉多;console.logmyDog.speak;//小黑汪汪叫类与面向对象ES6类的基本语法继承与关键词super•使用class关键字定义类•使用extends关键字实现继承•构造函数通过constructor方法定义•子类构造函数必须调用super•方法直接定义在类体内,无需function关键字•super作为对象指向父类的原型•静态方法使用static关键字•super作为函数调用父类构造函数•可以定义getter/setter访问器属性•静态方法也可以继承•类声明不会被提升•可以继承内置类型如Array、Error等私有字段与方法ES2022•使用#前缀定义私有字段•私有字段只能在类内部访问•私有方法同样使用#前缀•静态私有字段和方法也支持•支持私有getter和setter•比闭包实现私有性更高效ES6的类语法本质上是原型继承的语法糖,背后仍然使用原型链机制但类语法提供了更清晰的面向对象编程方式,使代码结构更易理解类定义中的方法自动设置为不可枚举,这与手动设置原型方法的默认行为不同尽管ES6类带来了语法便利,理解原型链的工作原理仍然重要,有助于解决复杂继承问题和性能优化迭代器与生成器迭代器协议生成器函数迭代器是一个具有next方法的对象,每次调用next返回一个包含value和done属性的结果对象当所生成器是使用function*语法定义的函数,可以暂停执行并稍后恢复生成器返回一个迭代器,使用yield有值都已产生时,done变为true关键字产生值//手动实现迭代器//生成器函数示例function createIteratorarray{function*numberGenerator{let index=0;yield1;return{yield2;next{yield3;return indexarray.length}{value:array[index++],done:false}:{done:true};const gen=numberGenerator;}console.loggen.next;//{value:1,done:false}};console.loggen.next;//{value:2,done:false}}console.loggen.next;//{value:3,done:false}console.loggen.next;//{done:true}const iter=createIterator[1,2,3];console.logiter.next;//{value:1,done:false}//生成器用于创建可迭代对象console.logiter.next;//{value:2,done:false}function*rangeGeneratorstart,end{console.logiter.next;//{value:3,done:false}for leti=start;i=end;i++{console.logiter.next;//{done:true}yield i;}}//使用for...of遍历生成器for constnum ofrangeGenerator1,5{console.lognum;//输出1,2,3,4,5}与Symbol Set/Map是引入的原始数据类型,创建唯一标识符,用于避免属性名冲突每个值都是唯一的,即使描述相同Symbol ES6Symbol常用于定义对象私有属性或实现特殊的内置接口如Symbolid!==Symbolid Symbol.iterator集合存储唯一值,适用于数组去重和集合运算提供键值对存储,与对象不同,的键可以是任何类型Set MapMap WeakSet和则提供弱引用存储,允许键对象被垃圾回收,适用于关联数据存储而不阻止内存清理,但不可迭代且值只能是对WeakMap象这些集合类型极大丰富了的数据处理能力JavaScript深浅拷贝详解深拷贝浅拷贝递归复制所有层级的属性,创建完全独立的副赋值创建一个新对象,其属性值是原始对象属性的精本深拷贝后的对象与原对象完全分离,任何修最基本的操作,创建对引用类型的引用,而非副确拷贝如果属性是原始类型,则复制其值;如改都不会互相影响常用实现包括序列化JSON/本当修改新变量时,原对象也会被修改,因为果属性是引用类型,则复制其引用实现方法包反序列化、递归函数和结构化克隆算法它们指向同一内存地址括、展开运算符和等Object.assign slice在实际开发中,选择合适的拷贝方式至关重要对于简单对象,浅拷贝通常足够且性能更好但处理嵌套对象时,必须使用深拷贝以避免意外的副作用需要注意的是,序列化方法虽然简便,但无法处理函数、、和循环引用等情况复杂场景下,可考虑使用专业库如的JSON Symbolundefined lodash或cloneDeep structuredCloneAPI解构赋值与扩展运算符数组解构•基本语法[a,b]=[1,2]•跳过元素[a,,c]=[1,2,3]•剩余模式[a,...rest]=[1,2,3,4]•默认值[a=0,b=0]=
[1]•交换变量[a,b]=[b,a]对象解构•基本语法{a,b}={a:1,b:2}•重命名{a:x,b:y}={a:1,b:2}•嵌套解构{a,b:{c}}={a:1,b:{c:2}}•默认值{a=0,b=0}={a:1}•剩余属性{a,...rest}={a:1,b:2,c:3}扩展运算符应用•数组合并[...arr1,...arr2]•数组浅拷贝[...arr]•字符串转数组[...hello]•对象合并{...obj1,...obj2}•对象浅拷贝{...obj}解构赋值和扩展运算符是ES6中最实用的语法特性之一,极大地简化了数据提取和操作在函数参数中使用解构可以直接提取所需属性,提高代码可读性扩展运算符则简化了数组和对象的合并、复制等操作,成为现代JavaScript开发的重要工具需要注意的是,扩展运算符创建的是浅拷贝,对于嵌套对象或数组,内部引用仍然保持不变在处理复杂数据结构时,可能需要结合深拷贝技术确保数据完全独立解构赋值在处理可能不存在的属性时,设置默认值也是一种优雅的防错机制模块化机制模块系统其他模块化规范对比ES6CommonJS Node.js//导出变量、函数或类export constname=模块化;//导出export functionhello{module.exports={return你好;name:模块化,}hello{return你好;}export classPerson{}};//或单独导出//默认导出exports.name=模块化;export defaultfunction{return默认导出;//导入}const mod=require./module.js;const{name}=require./module.js;//重命名导出export{hello assayHello};//导入模块AMD RequireJSimport{name,hello}from./module.js;import Personfrom./module.js;//默认导入//定义模块import*as modfrom./module.js;//命名空间导入define[依赖模块],functiondep{import{name asmoduleName}from./module.js;//重命名导入return{hello:function{return你好;}//动态导入};import./module.js.thenmodule={};module.hello;};//使用模块require[模块路径],functionmod{mod.hello;};ES6模块系统与CommonJS的主要区别在于ES模块是静态的,导入导出在编译时确定;而CommonJS是动态的,在运行时加载ES模块默认严格模式,且导入的是绑定而非值的拷贝,当导出值变化时导入也会反映这些变化同步编程模型单线程执行环境JavaScript在单一线程上运行所有代码调用栈Call Stack跟踪函数调用的执行顺序任务队列Callback Queue存储等待执行的回调函数事件循环Event Loop协调调用栈和任务队列的机制JavaScript的执行模型基于单线程和事件循环当JavaScript引擎执行代码时,会将函数调用压入调用栈同步代码按顺序执行,当调用栈为空时,事件循环检查任务队列,将等待的回调函数推入调用栈执行在浏览器环境中,异步操作如定时器、网络请求、事件监听等,由浏览器的其他线程处理完成后,相关回调函数被放入任务队列任务队列又分为宏任务队列如setTimeout,setInterval和微任务队列如Promise.then,queueMicrotask,微任务队列优先级高于宏任务理解这一机制对于编写高效、无阻塞的JavaScript代码至关重要异步基础回调函数回调概念作为参数传递给另一个函数的函数,将在特定时机或事件发生时被调用回调地狱嵌套回调形成的复杂代码结构,难以阅读和维护错误处理处理异步操作中可能发生的错误,通常采用错误优先回调模式优化策略通过命名函数、模块化和Promise等方式改善回调结构回调函数是JavaScript中处理异步操作的基础机制常见的异步场景包括定时器函数setTimeout,setInterval、事件监听addEventListener、Ajax请求和文件读写等IO操作在Node.js环境中,几乎所有API都采用回调模式虽然回调简单易懂,但在复杂异步流程中容易形成回调地狱,导致代码难以阅读和维护优化回调的常见策略包括使用命名函数替代匿名函数,将嵌套回调分解为独立函数,采用模块化处理相关功能,以及使用Promise、async/await等现代异步模式重构代码错误处理方面,应采用错误优先约定,始终检查回调的第一个参数是否为错误对象原理与链式调用Promise基础概念链式调用实例Promise状态pending进行中、fulfilled已成功、rejected已失败//基本Promise链状态不可逆一旦从pending转变为fulfilled或rejected,状态不再改变fetchhttps://api.example.com/data创建方式new Promiseresolve,reject={...}.thenresponse={核心方法then、catch、finally if!response.ok{throw newError网络响应不正常;静态方法Promise.resolve、Promise.reject、Promise.all、Promise.race、Promise.allSettled、Promise.any}return response.json;}.thendata={console.log数据处理:,data;return data.id;}.thenid={return fetch`https://api.example.com/details/${id}`;}.thenresponse=response.json.thendetails={console.log详细信息:,details;}.catcherror={console.error发生错误:,error;}.finally={console.log无论成功失败都执行;};//Promise并行处理Promise.all[fetchhttps://api.example.com/data
1.thenr=r.json,fetchhttps://api.example.com/data
2.thenr=r.json].then[data1,data2]={console.log两个请求都成功:,data1,data2;}.catcherror={console.error任一请求失败:,error;};语法async/await函数async使用async关键字声明的函数,返回值自动包装为Promise对象即使函数体内没有异步操作,返回值仍会被Promise.resolve包装这使得所有async函数都可以使用Promise的方法,如then和catch表达式awaitawait关键字只能在async函数内部使用,用于暂停函数执行,等待Promise解决await接收一个Promise对象并返回其最终值如果接收的不是Promise,则直接返回该值await使异步代码看起来像同步代码,提高可读性错误处理await表达式会将Promise拒绝转换为异常,可以使用try/catch捕获这提供了比Promise链更自然的错误处理方式可以捕获多个await操作的错误,也可以针对特定操作做精细处理并行与串行默认情况下,多个await表达式会串行执行,可能影响性能对于相互独立的操作,可以先创建所有Promise然后同时await它们,或使用Promise.all实现并行执行,提高效率async/await是处理异步操作的终极解决方案,构建在Promise之上,提供了更直观的异步编程模型它让开发者能够以同步编码风格处理异步流程,避免了回调地狱和Promise链的复杂性在现代JavaScript开发中,async/await已成为首选的异步处理模式与网络请求Fetch AJAX基础使用简化Fetch APIasync/await//基本GET请求async functionfetchUserDatauserId{fetchhttps://api.example.com/data try{.thenresponse={//请求用户信息//检查响应状态const userResponse=await fetchif!response.ok{`https://api.example.com/users/${userId}`throw newError`HTTP错误${response.status}`;;}//解析JSON数据if!userResponse.ok{return response.json;throw newError获取用户信息失败;}}.thendata={console.log成功获取数据:,data;const userData=await userResponse.json;}.catcherror={//基于用户信息请求相关文章console.error获取数据失败:,error;const articlesResponse=await fetch};`https://api.example.com/articlesauthor=${userId}`;//POST请求发送JSON数据fetchhttps://api.example.com/create,{if!articlesResponse.ok{method:POST,throw newError获取文章失败;headers:{}Content-Type:application/json,Authorization:Bearer token123const articlesData=await articlesResponse.json;},body:JSON.stringify{//返回合并数据name:张三,return{age:30user:userData,}articles:articlesData}};.thenresponse=response.json}catch error{.thendata=console.log创建结果:,data console.error数据获取错误:,error;.catcherror=console.error创建失败:,error;throw error;//重新抛出以便调用者处理}}//使用函数fetchUserData
123.thendata=console.log用户数据:,data.catcherr=console.errorerr;编程基础DOM文档对象模型是和文档的编程接口,将网页表示为节点树通过,可以动态操作网页内容、结DOM HTMLXML DOMAPI JavaScript构和样式常用的节点选择方法包括、、等;节点操作方法包括getElementById querySelectorquerySelectorAll、、、等createElement appendChildremoveChild innerHTML事件是实现网页交互的核心机制事件处理有三种注册方式属性、元素属性和方法,其中DOM HTMLDOM addEventListener最为灵活强大事件传播包括三个阶段捕获、目标和冒泡通过事件委托将事件监听器添加到父元素可以提高性addEventListener能并简化代码,特别适用于动态创建的元素现代框架通常提供更高级的操作抽象,但理解原生仍是前端开发的基础DOM DOMAPI浏览器与环境交互BOM对象Location对象Window提供当前信息和导航功能,可以解析URL和修改地址全局对象,表示浏览器窗口,包含全局变量、函数和其他对象BOM对象History管理浏览历史,提供前进、后退和历史状态管理对象Screen对象包含有关用户屏幕的信息,如尺寸、颜色Navigator深度等提供浏览器和系统信息,如用户代理、语言、位置等浏览器对象模型提供了与浏览器窗口交互的对象通过可以实现页面跳转、解析和参数提取;使用BOM window.location URL的和方法可以实现无刷新更新,这是现代单页应用导航的基础window.history pushStatereplaceState URL还提供了与用户交互的接口,如、和对话框;和用于客户端存储;BOM alertconfirm promptlocalStorage sessionStorage用于获取地理位置;以及用于桌面通知等现代应用还可以通过访navigator.geolocation NotificationAPI Webnavigator.mediaDevices问摄像头和麦克风,通过操作剪贴板,这些大大扩展了网页应用的能力边界Clipboard APIAPI在前端项目架构JavaScript表现层UI组件、视图渲染和用户交互状态管理层数据流、状态更新和共享逻辑服务层API请求、数据处理和业务逻辑路由层页面导航和URL管理单页应用SPA是现代前端开发的主流模式,整个应用作为单一页面加载,通过JavaScript动态更新内容SPA的核心优势包括更流畅的用户体验、减少服务器负载、前后端职责清晰分离主要框架如React、Vue和Angular都采用组件化思想,将UI拆分为可复用的独立组件前后端分离架构中,前端负责界面渲染和用户交互,通过API与后端通信;后端专注于数据处理、业务逻辑和安全控制,以JSON等格式提供数据服务这种架构提高了开发效率,允许前后端团队并行工作,同时支持多端应用共用一套API状态管理如Redux、Vuex、路由管理和模块化是构建大型SPA的关键技术构建工具与模块打包核心概念转译器Webpack Babel作为最流行的前端打包工具,Babel是JavaScript编译器,能将新Webpack将项目文件视为模块,通版本代码ES6+转换为向后兼容的过依赖图分析将其打包成优化的静态JavaScript版本通过插件和预设配资源核心概念包括入口Entry、置,可以控制语法转换的具体特性,输出Output、加载器Loader、插如箭头函数、解构赋值和类语法等件Plugin和模式ModeLoader Babel使开发者能够使用最新的语言处理非JavaScript文件,如样式和图特性,同时保证代码在老旧浏览器中片;Plugin扩展功能,如代码压缩和的兼容性环境变量注入优势RollupRollup专注于ES模块打包,生成更加简洁高效的输出代码它的树摇Tree-shaking功能可以自动移除未使用的代码,大幅减小包体积Rollup特别适合打包库和框架,因其生成的代码具有更好的可读性和性能与Webpack相比,Rollup配置更简单,但对非ESM模块支持较弱现代前端构建工具链解决了多项开发挑战模块化开发、依赖管理、代码转译、资源优化、开发体验等Webpack的热模块替换HMR功能允许在不刷新页面的情况下替换模块,极大提高了开发效率代码分割Code Splitting则实现按需加载,减少初始加载时间与包管理NPM基本操作流程依赖管理要点•初始化npm init创建package.json•dependencies生产环境所需依赖•安装包npm install[包名]•devDependencies仅开发环境需要•开发依赖npm install--save-dev[包名]•peerDependencies宿主项目应提供的依赖•全局安装npm install-g[包名]•package-lock.json锁定依赖版本•移除包npm uninstall[包名]•yarn/pnpm替代包管理工具•运行脚本npm run[脚本名]•npm缓存加速重复安装•更新包npm update[包名]版本控制策略•语义化版本主版本.次版本.修订号•版本范围^兼容更新,~补丁更新•固定版本精确指定版本号•npx执行本地安装的包•审计安全npm audit检查漏洞•私有注册表企业内部共享包NPMNode PackageManager是JavaScript生态系统的基石,管理着世界上最大的代码注册表,拥有超过150万个包掌握NPM是有效开发JavaScript项目的必备技能package.json文件不仅管理依赖,还定义项目元数据、脚本和配置,是项目的核心描述文件在团队项目中,正确使用版本锁定文件package-lock.json或yarn.lock至关重要,确保所有开发者和环境使用相同的依赖版本版本控制应遵循语义化版本规范,明确表达更新的兼容性定期更新依赖并进行安全审计可以避免安全漏洞和过时代码问题现代项目通常使用monorepo管理复杂的多包项目,提高代码共享和版本协调效率与代码风格规范Lint核心功能代码格式化ESLint Prettier静态代码分析在不运行代码的情况下发现问题一致格式强制统一的代码样式可配置规则启用、禁用或自定义检查规则支持多种语言、、、、等JS TSCSS HTMLJSON自动修复许多规则支持自动修正问题简单配置较少的配置选项,专注于格式编辑器集成、等编辑器插件与协作通过整合VS CodeWebStorm ESLinteslint-config-prettier预设配置如、、等风格保存时格式化编辑器设置自动格式化Airbnb StandardGoogle插件扩展、、专用规则钩子集成使用和React VueTypeScript Githusky lint-staged代码规范统一不仅提高了代码可读性,还能预防潜在的错误和缺陷可以捕获语法错误、未使用的变量、不安全的代码模式ESLint等问题;则确保代码格式一致,解决了团队中关于格式的争论将两者结合使用,负责代码质量,负责代码Prettier ESLintPrettier美观,形成完整的代码规范解决方案在团队项目中,推荐使用钩子如和在提交前自动运行和格式化,确保所有提交的代码符合团队标准配Githusky lint-staged Lint置文件和应随项目一起版本控制,使所有团队成员共享相同的规则对于大型项目,可以考虑使用可共享.eslintrc.js.prettierrc的配置包,在多个项目间保持规则一致单元测试与调试测试框架JestJest是Facebook开发的JavaScript测试框架,以零配置和内置功能丰富著称它提供断言库、测试运行器、覆盖率报告等一站式功能Jest的快照测试可以捕获UI组件的渲染输出,便于检测意外变化模拟功能Mock允许隔离测试单元,替换外部依赖如API调用、计时器等浏览器调试技巧浏览器开发者工具是前端调试的强大武器控制台Console用于日志输出和表达式计算;源代码面板Sources支持断点调试、单步执行和监视变量;网络面板Network分析请求响应和性能;元素面板Elements检查和修改DOM;性能和内存面板帮助识别瓶颈和泄漏调试Node.jsNode.js应用可以通过内置调试器、VS Code集成调试或使用检查器协议进行调试常用调试命令包括node--inspect启动调试服务器,或使用ndb等专用工具提供图形界面对于复杂应用,日志库如winston、debug提供了结构化日志记录,便于问题排查错误追踪与监控生产环境错误监控对于及时发现和修复问题至关重要错误边界Error Boundaries可以在React应用中优雅处理UI错误;全局错误处理器window.onerror捕获未处理的异常;Sentry、LogRocket等工具提供远程错误报告和用户会话重现功能性能优化基础减少资源体积•代码压缩与混淆•树摇Tree Shaking移除未使用代码•图片优化与WebP/AVIF格式•按需加载与代码分割合理使用缓存•HTTP缓存策略•内容散列和版本控制•localStorage/sessionStorage离线缓存•Service Worker缓存优化渲染性能•避免重排Reflow和重绘Repaint•使用CSS硬件加速•虚拟列表处理大数据集•请求动画帧requestAnimationFrame高效事件处理•防抖Debounce函数•节流Throttle函数•事件委托优化•异步处理耗时操作防抖和节流是处理频繁触发事件的两种重要优化策略防抖Debounce确保函数在一段安静时间后才执行,适用于搜索输入、窗口调整等场景;节流Throttle则限制函数在指定时间间隔内最多执行一次,适用于滚动事件、游戏控制等正确实现这两种策略能显著减少不必要的函数调用,提高应用响应性内存泄漏排查常见泄漏场景排查工具与技巧开发者工具全局变量滥用意外创建的全局变量不会被垃圾回收Chrome闭包引用闭包保持对外部变量的引用,可能导致内存无法释放内存面板记录堆快照,比较内存增长性能面板记录内存使用随时间变化定时器未清除或未终止的持续引用对setInterval setTimeout任务管理器监控内存使用JavaScript象排查方法引用在内存中保留对已移除元素的引用DOM DOM事件监听未移除组件销毁时未移除事件监听器堆快照对比执行操作前后拍摄快照并比较循环引用两个对象互相引用,特别是在对象包含间接闭包引用分离树检查寻找已移除但仍被引用的DOM DOM时时间线记录观察长时间运行后内存增长模式缓存未控制无限增长的缓存数据占用大量内存减少变量作用域限制变量生命周期大型数据集处理后的大型数组对象未及时释放/使用存储对象引用时不阻止垃圾回收WeakMap/WeakSet组件销毁钩子确保在组件卸载时清理资源React/Vue安全性与防护措施安全威胁描述防护措施跨站脚本XSS攻击者将恶意脚本注入网页,内容安全策略CSP、输入验在用户浏览器中执行证、输出编码、HttpOnlyCookie跨站请求伪造CSRF强制用户在已登录的网站上执CSRF令牌、SameSite行非预期操作Cookie、验证Referer/OriginSQL注入通过输入注入SQL命令操纵数参数化查询、ORM、输入验据库证、最小权限原则点击劫持诱使用户点击隐藏的恶意元素X-Frame-Options头、CSPframe-ancestors依赖安全使用含有漏洞的第三方库定期更新依赖、npm audit、漏洞扫描工具内容安全策略CSP是现代网站防御XSS的关键技术,通过HTTP头或meta标签指定允许加载的资源来源,有效限制恶意脚本的执行前端框架如React和Vue默认对输出进行编码,减轻XSS风险,但仍需注意避免使用dangerouslySetInnerHTML或v-html等直接注入HTML的API对于API安全,除了服务端验证外,前端也应实施防护使用HTTPS加密传输、实施适当的身份验证和授权机制、避免在客户端存储敏感信息开发安全的Web应用需要多层防御策略,包括代码审查、安全测试、定期更新和用户教育等综合措施安全不是一次性工作,而是需要持续关注的过程与类型系统TypeScript是的超集,增加了静态类型系统,提供编译时类型检查,帮助开发者在代码运行前发现错误的类TypeScript JavaScriptTypeScript型系统包括基本类型等、复合类型等、函数类型、接口、类型别名number,string,booleanarray,tuple,enuminterface、泛型和高级类型等type genericsunion,intersection引入的主要优势包括增强代码的可读性和可维护性,尤其在大型项目中;提供更好的工具支持,包括自动完成、重构和文TypeScript档生成;捕获更多运行时错误;通过类型定义文件与生态系统兼容不会改变运行时行为,编译后生成标.d.ts JavaScriptTypeScript准代码渐进式类型系统允许逐步采用,可以通过和类型与非类型化代码交互,降低迁移障碍JavaScript anyunknown前端主流框架简述React Vue Angular核心理念组件化、声明式、虚拟核心理念渐进式框架、响应式数据绑定核心理念完整平台、双向数据绑定、依赖UI DOM注入状态管理单向数据流、、状态管理、、状态管理、、hooks ContextVuex PiniaComposition ServicesNgRx RxJSAPIAPI生态系统、Angular MaterialAngular生态系统Redux、React Router、生态系统Vue Router、Nuxt.js、Vite CLINext.js优势易学易用、文档完善、模板语法直观优势企业级功能全面、集成、TypeScript优势灵活性高、社区庞大、适合大型应用强类型学习曲线平缓适合初学者学习曲线陡峭需学习多个概念学习曲线中等到陡峭需理解、状态管JSX理等框架选型应考虑多个因素项目规模和复杂度、团队经验和偏好、性能需求、长期维护等适合对灵活性要求高、希望深度定制的大型应React用;适合快速开发、学习成本低的场景;则适合需要严格架构和规范的企业级应用VueAngular现代前端框架共同趋势包括组件化开发、声明式编程、状态管理分离、服务端渲染支持、集成等值得注意的是,框架只是工具,TypeScript理解核心概念和标准更为重要,这能帮助开发者快速适应任何框架或未来的技术变革选择适合项目需求的框架,并保持对新技JavaScript Web术的学习是前端开发的关键在新兴领域JavaScript后端开发服务端渲染架构桌面与移动开发Node.js SSRServerless使跨和、让开发者用Node.js JavaScriptNext.jsReact AWSLambda VercelElectron Web越前端边界,成为全栈语等框架带来和等平台让技术构建跨平台桌面应Nuxt.jsVue Netlify言它基于引服务端渲染能力,解决单开发者专注于用;和Chrome V8JavaScriptReactNative擎构建,采用事件驱动、页应用问题并提升首函数编写,而无需管理服则实现用SEO NativeScript非阻塞模型,特别适合屏加载性能结合静务器模式简开发原生移动I/O SSRServerless JavaScript处理高并发、密集型应态网站生成,为现化了部署流程,提供自动应用这种跨平台能力大I/O SSG用、、代应用提供了更多可扩展能力,特别适合构建大提高了开发效率和代码Express KoaWeb等框架使开发能性微服务和复用NestJS APIAPI更加高效人工智能与可视化300+60%模型性能提升TensorFlow.js可直接在浏览器中使用的预训练AI模型数量WebGL加速后的机器学习算法执行速度提升10KB40+最小模型可视化库可在低端设备上运行的压缩机器学习模型大小基于JavaScript的数据可视化开源库数量TensorFlow.js是一个开源的WebGL加速机器学习库,允许在浏览器和Node.js环境中训练和部署模型它支持迁移学习、模型转换和实时推理,使开发者能构建智能Web应用,如图像识别、自然语言处理、姿态检测等,无需服务器端AI支持D
3.jsData-Driven Documents是最强大的JavaScript数据可视化库,提供了将数据绑定到DOM并应用数据驱动转换的能力它采用声明式方法创建SVG、Canvas和HTML可视化,能实现复杂的交互式图表、地图和网络图除D3外,还有Chart.js、Highcharts、Three.js等专业可视化工具,分别针对不同复杂度和场景机器学习与可视化的结合,正在为Web应用开辟新的可能性未来趋势与新特性整合WebAssembly语言演进JavaScript与WebAssembly协同工作,实现接近原生性能的Web应用ECMAScript规范年度更新,引入管道运算符、装饰器、顶层await、私有字段等新特性扩展Web API文件系统、WebGPU、Web蓝牙、WebXR等新API扩展Web能力边界响应式编程元框架崛起RxJS、Solid.js等推动细粒度响应式系统普及Astro、Remix、SvelteKit等新型框架提供全栈开发体验JavaScript生态系统正以惊人的速度发展TC39委员会负责ECMAScript标准制定,遵循提案阶段制度,每年发布新版本,不断增强语言能力WebAssemblyWasm作为JavaScript的补充而非替代,允许其他语言如C++、Rust编译到网页运行,为性能密集型应用提供解决方案新兴的Web API正在拓展浏览器能力File SystemAccess API提供本地文件访问;WebGPU实现高性能图形和计算;Web Bluetooth连接周边设备;WebTransport提供低延迟数据传输同时,元框架Meta-frameworks整合构建工具、路由、数据获取等功能,简化全栈开发这些进步共同指向一个趋势JavaScript和Web平台正成为构建各类应用的通用平台,模糊了Web与原生应用的界限总结与学习建议构建坚实基础彻底掌握JavaScript核心概念,包括变量、函数、作用域、原型、异步编程等理解ECMAScript规范与Web API的区别通过小型实战项目巩固基础知识,培养编程思维和问题解决能力专注技术栈选择一个主要框架React/Vue/Angular深入学习,同时了解状态管理、路由、构建工具等配套技术避免频繁切换技术栈,保持专注以达到精通水平在掌握一个框架后,再横向扩展知识面持续学习与实践关注JavaScript周刊、GitHub趋势、技术博客了解生态发展参与开源项目或个人实践,将理论知识应用到实际问题中建立个人知识体系,通过写作、分享加深理解拓展视野学习计算机科学基础知识,如算法、数据结构、设计模式等了解服务端技术、数据库、网络协议拓展全栈能力参与技术社区,与其他开发者交流经验和见解JavaScript学习是一个持续进化的旅程开源资源如MDN Web文档、JavaScript.info、You DontKnowJS系列书籍提供了优质学习材料GitHub、Stack Overflow和各种技术论坛是解决问题和交流的宝贵平台推荐参与技术会议、线上讲座和本地开发者社区,拓展人脉并保持技术敏感度。
个人认证
优秀文档
获得点赞 0