还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
基础教程JavaScript欢迎学习JavaScript基础教程!本课程为您提供从入门到精通的全套JavaScript学习资源,全面覆盖从基础语法到高级应用的所有内容无论您是刚接触编程的初学者,还是希望提升前端开发技能的进阶学习者,本课程都将为您提供系统化的知识体系和实践机会,帮助您成为优秀的JavaScript开发者让我们一起开启这段令人兴奋的学习旅程!课程概述精心设计的内容丰富实例与练习核心技术掌握本课程包含50节精心设计的每个章节都配备丰富的实例和通过本课程,您将全面掌握现JavaScript教学内容,从基础编程练习,帮助您将理论知识代Web开发的核心技术,为今语法到高级应用循序渐进,确转化为实际编程能力,提高解后的前端开发工作或进阶学习保学习者能够系统掌握各项技决问题的能力打下坚实基础能简介JavaScript全球影响力应用领域JavaScript是世界上最流行的编程语言之一,几乎所有现JavaScript不仅是现代Web开发的核心技术,还广泛应用代网站都使用JavaScript来提供交互功能和动态内容于移动应用开发、桌面应用程序和服务器端开发作为客户端脚本语言,JavaScript无需编译即可在浏览器通过Node.js,JavaScript实现了全栈开发的可能性,使开中直接运行,极大地简化了开发流程和用户体验发者能够使用同一种语言构建完整的应用程序的历史与发展JavaScript年诞生1995JavaScript由Brendan Eich在网景公司仅用10天时间创建,最初名为LiveScript,后因营销原因更名为JavaScript标准化ECMAScript1997年,JavaScript被提交给ECMA国际组织进行标准化,形成了ECMAScript规范,奠定了语言发展的基础现代演进从ES5到ES2023,JavaScript经历了多次重大更新,增加了箭头函数、Promise、async/await等革命性特性的组成部分JavaScriptECMAScript核心语言规范DOM文档对象模型BOM浏览器对象模型ECMAScript作为JavaScript的核心,定义了语言的基本语法、类型、语句、关键字和保留字等基础内容,是JavaScript的灵魂所在DOM(文档对象模型)提供了访问和操作网页内容的方法和接口,使开发者能够动态修改页面内容、结构和样式BOM(浏览器对象模型)则提供了与浏览器进行交互的对象,包括窗口操作、导航历史、地理位置等功能开发环境搭建现代浏览器选择Chrome、Firefox或Edge等现代浏览器作为开发环境,它们提供了强大的开发者工具,便于调试和测试JavaScript代码代码编辑器推荐使用VS Code或WebStorm等专业编辑器,它们提供语法高亮、代码补全、错误检查等功能,极大提高开发效率开发工具熟练使用浏览器开发者工具的控制台、元素检查器、网络监控和性能分析功能,是提高JavaScript开发能力的关键学习资源MDN WebDocs、JavaScript.info等在线学习平台提供了丰富的教程和文档,是JavaScript学习过程中的重要参考资源基本语法规则JavaScript区分大小写分号使用注释规范代码缩进JavaScript中的变量每条语句末尾应加分使用//添加单行注释,保持一致的缩进风格名、函数名和所有标识号,虽然JavaScript有使用/**/添加多行注(通常为2或4个空符都严格区分大小写,自动分号插入机制,但释好的注释应简洁明格),使代码结构清如myVariable和为避免潜在错误,建议了,解释代码意图而非晰,易于阅读和维护myvariable被视为两个显式添加分号重述代码内容不同的变量在中嵌入HTML JavaScript内联JavaScript直接在HTML中使用script标签编写代码外部文件引用通过src属性引入外部.js文件特殊加载属性使用async或defer控制加载方式内联JavaScript适合少量代码,但对于大型项目,推荐使用外部文件引用方式,这有助于代码组织和维护,并能利用浏览器缓存提高加载速度async属性使脚本异步加载并立即执行,适合独立脚本;defer属性使脚本延迟到DOM解析完成后执行,保证执行顺序,适合有依赖关系的脚本最佳实践建议将JavaScript文件放在HTML底部,或使用defer属性,以避免阻塞页面渲染,提高用户体验变量与常量声明var传统的变量声明方式,函数作用域,存在变量提升现象例如var name=张三;声明letES6引入的块级作用域变量,解决了var的许多问题例如let age=25;声明const用于定义常量,赋值后不可更改,也是块级作用域例如const PI=
3.14159;变量提升是JavaScript的一个特性,使用var声明的变量会被提升到函数顶部,但初始化不会提升,这可能导致意外的undefined值而let和const声明的变量不会被提升,必须先声明后使用在现代JavaScript开发中,推荐使用let声明可变变量,使用const声明不变的值,几乎不再使用var,这有助于避免作用域混淆和意外的变量覆盖问题数据类型概览引用数据类型•Object(对象)•Array(数组)基本数据类型类型检测•Function(函数)•Number(数值)使用typeof操作符可以检查基本数据•Date(日期)类型,但对于引用类型,通常返回•String(字符串)•RegExp(正则表达式)object,需要配合instanceof或其•Boolean(布尔值)动态类型•Map和Set(ES6)他方法进行更精确的判断•Undefined(未定义)JavaScript是动态类型语言,变量可•Null(空值)以存储任意类型的值,并可在运行时•Symbol(符号,ES6)改变类型,这提供了灵活性但也可能•BigInt(大整数,ES2020)带来类型相关的错误数值类型()Number数值表示特殊数值与精度JavaScript使用IEEE754标准的双精度64位浮点格式表示特殊数值包括NaN(不是数字)和Infinity(无限大)数值,包括整数和浮点数整数可以直接表示(如42),NaN表示无效的数学运算结果,具有特殊性质NaN不等浮点数使用小数点(如
3.14)于任何值,包括它自身支持科学计数法(如3e8表示3×10^8)和不同进制表示由于浮点数表示的限制,JavaScript中存在精度问题,如十六进制(0xFF)、八进制(0o77)、二进制
0.1+
0.2≠
0.3处理金融计算时,应使用专门的库或技术(0b1010)如toFixed方法处理精度问题字符串类型()String字符串表示方法JavaScript中的字符串可以使用单引号hello、双引号world或反引号`template`表示单引号和双引号功能相同,可以互相嵌套使用,避免转义模板字符串ES6引入的模板字符串(使用反引号)支持多行文本和字符串插值,如`Hello,${name}!`可以直接在字符串中嵌入变量和表达式,大大简化了字符串拼接转义字符使用反斜杠\创建特殊字符,如\n表示换行,\t表示制表符,\\表示反斜杠本身,\和\用于在字符串中包含引号,而不引起字符串结束支持UnicodeJavaScript使用UTF-16编码存储字符串,支持Unicode字符,可以使用\uXXXX表示Unicode字符,如\u00A9表示版权符号©ES6增强了对Unicode的支持,处理了代理对问题字符串操作方法查找与替换长度与访问indexOf、lastIndexOf查找子串位置,使用length属性获取字符串长度,使用方括includes检查是否包含,replace替换内号或charAt方法按索引访问字符容分割与合并大小写转换split将字符串分割为数组,concat或+toUpperCase转大写,toLowerCase转运算符合并字符串,slice提取子字符串小写,便于不区分大小写的比较这些字符串方法都不会修改原字符串,而是返回一个新的字符串这符合JavaScript中字符串不可变的特性,即一旦创建,字符串的内容就不能被修改,只能创建新字符串在处理大量文本时,应注意字符串操作的性能影响频繁的字符串拼接可能导致性能问题,此时可以考虑使用数组的join方法或模板字符串作为替代方案布尔类型()Boolean布尔基础真值与假值应用场景布尔类型是JavaScript中最简单的数据JavaScript中,非布尔值在需要布尔值布尔值广泛应用于条件语句类型,只有两个可能的值true(真)的上下文中会被自动转换假值包括(if/else)、循环控制和false(假)这种简单的二元状态false、
0、(空字符串)、null、(while/for)、逻辑运算(/||/!)是逻辑运算和条件判断的基础undefined和NaN,其他所有值都被视以及表达用户权限、功能开关等状为真值,包括空数组[]和空对象{}态理解布尔转换规则对编写简洁高效的代码至关重要空值与未定义的概念与使用的概念与场景null undefinednull表示无或空,是一个特殊的值,表示一个变量被明undefined表示变量已声明但尚未赋值,或访问对象不存确地赋予了无值它是原始值之一,但typeof null返回在的属性,或函数没有返回值时的隐式返回typeofobject,这是JavaScript的一个历史遗留错误undefined正确返回undefinednull通常用于表示一个对象变量不再指向任何对象,或作产生undefined的常见场景未初始化的变量(let x;)、为函数的返回值表示操作失败或没有找到需要的对象例函数参数未提供值、没有return语句的函数返回值、对象如let user=null;//明确表示用户不存在中不存在的属性(obj.nonExistentProperty)类型转换避免转换陷阱隐式类型转换使用严格相等===和不相等!==运算符避免显式类型转换在特定上下文中,JavaScript会自动进行类比较时的隐式转换对用户输入等不确定来使用专门的转换函数如String、型转换例如,算术运算符会将操作数转为源的数据进行显式转换和验证理解转换规Number、Boolean等进行明确的类型转数字,+运算符在处理字符串时会进行字符则,如空字符串转数字为0,123转数字为换这种方式清晰表达了转换意图,减少了串连接,条件判断会将表达式转为布尔值123,而hello转数字为NaN代码的歧义性,是推荐的做法例如这种自动转换可能导致意外结果Number42将字符串转为数字运算符
(一)算术运算运算符名称示例结果+加法5+27-减法5-23*乘法5*210/除法5/
22.5%取余5%21++自增let x=5;x++;5,x变为6--自减let y=5;y--;5,y变为4算术运算符的优先级与数学中一致括号自增/自减乘法/除法/取余加法/减法合理使用括号可以明确表达计算顺序,提高代码可读性注意自增(++)和自减(--)运算符的前缀和后缀形式区别前缀形式(++x)先增加再返回值,后缀形式(x++)先返回值再增加,这在赋值和复合表达式中尤为重要运算符
(二)比较运算等值比较==(宽松相等)比较前进行类型转换===(严格相等)不进行类型转换,比较值和类型不等比较!=(宽松不等)与==相反!==(严格不等)与===相反大小比较(大于)(小于)=(大于等于)=(小于等于)在JavaScript中,强烈推荐使用严格相等(===)和严格不等(!==)运算符,避免意外的类型转换带来的问题例如,5==5为true(字符串5被转换为数字5),而5===5为false(类型不同)比较运算符的常见陷阱包括NaN与任何值比较都返回false,包括它自身;对象比较是基于引用而非内容;空数组和null的转换行为等理解这些规则对编写可靠的条件语句至关重要运算符
(三)逻辑运算JavaScript中的逻辑运算符包括与()、或(||)和非(!)这些运算符不仅可用于布尔值,还可以操作任何类型的值,并返回相应的操作数而非布尔值这称为短路求值短路求值是逻辑运算的关键特性对于AB,如果A为假值,直接返回A而不评估B;对于A||B,如果A为真值,直接返回A而不评估B这种机制可用于条件赋值、默认值设置和条件执行,如const name=user.name||未知用户逻辑运算符的优先级为!(非)(与)||(或)复杂表达式应使用括号明确分组,如if age18||hasParentalConsent!isBlacklisted{...}控制流
(一)条件语句语句if单一条件判断语句if...else二选一条件分支if...else if...else多条件分支判断if语句是JavaScript中最基本的条件控制结构,用于根据条件执行不同的代码基本语法为if条件{语句块}条件表达式会被转换为布尔值,若为真则执行语句块,否则跳过if...else语句提供了二选一的执行路径if条件{语句块1}else{语句块2}当需要处理多个互斥条件时,可以使用if...else if...else结构if条件1{...}elseif条件2{...}else{...}条件语句可以嵌套,但过深的嵌套会降低代码可读性良好的实践包括使用大括号即使只有一条语句,避免复杂的条件表达式,适当使用提前返回(early return)减少嵌套控制流
(二)语句switch基本结构与case breakswitch语句用于根据一个表达式的每个case后跟一个值和冒号,当表值选择多个代码分支之一来执行达式的值与case值严格相等===它的基本语法包括switch关键字、时,执行该case下的代码break语表达式、多个case分支和可选的句用于跳出switch结构,若省略会default分支导致代码继续执行下一个case(称为落空)分支defaultdefault子句是可选的,当表达式的值与所有case都不匹配时执行通常放在所有case之后,作为其他情况的处理方式与多个if...else if结构相比,switch语句在处理多个固定值条件时通常更清晰简洁但switch只能做严格相等比较,而if可以使用任意条件表达式,这决定了它们的适用场景switch语句的落空特性(case穿透)既可能是bug源,也可能是有用的功能当多个case需要执行相同代码时,可以故意省略break让它们共用代码块,但需要清晰注释说明意图控制流
(三)循环结构循环循环for while适用于已知迭代次数的情况,语法为for适用于未知迭代次数的情况,语法为初始化;条件;步进{循环体}while条件{循环体}控制语句循环do...whilebreak中断整个循环,continue跳过当前迭至少执行一次循环体,语法为do{循环代继续下一次体}while条件;for循环通常用于数组遍历和已知次数的迭代,其紧凑语法将初始化、条件检查和步进操作整合在一起ES6引入的for...of(遍历可迭代对象的值)和for...in(遍历对象的键)提供了更专业的迭代方式循环性能考虑避免在循环中重复计算不变的值;减少DOM操作;大型数据集处理考虑使用分批处理或虚拟列表;适当使用函数式方法(map/filter/reduce)替代命令式循环,提高代码可读性数组基础数组创建与初始化元素访问与修改数组长度与多维数组JavaScript数组可以通过字面量语法创使用方括号和从0开始的索引访问数组length属性返回数组长度,可读写增建let fruits=[苹果,香蕉,橙子];,元素fruits
[0]表示第一个元素负索大length会用undefined填充新位置,也可以使用Array构造函数let引不被支持(与Python不同)可以减小会截断数组JavaScript支持多维numbers=new Array1,2,3;数组可直接赋值修改元素fruits
[1]=梨子数组(数组的数组)let matrix=以包含任意类型的元素,甚至混合类;,或添加新元素fruits
[3]=西瓜;[[1,2],[3,4]];,访问如型matrix
[0]
[1]数组方法
(一)基础操作添加与删除元素•push末尾添加元素,返回新长度•pop删除并返回末尾元素•unshift开头添加元素,返回新长度•shift删除并返回开头元素数组合并与切片•concat合并多个数组,返回新数组•slicestart,end提取部分数组,不改变原数组•splicestart,deleteCount,...items删除或替换元素数组元素查找•indexOfitem查找元素首次出现位置•lastIndexOfitem查找元素最后出现位置•includesitem检查是否包含元素•findcallback查找满足条件的第一个元素数组转换•joinseparator用分隔符连接元素成字符串•toString转换为字符串(用逗号分隔)•toLocaleString本地化字符串表示数组方法
(二)高级操作函数基础函数定义参数传递返回值JavaScript中函数可以通过函数参数按值传递,但对于函数使用return语句返回函数声明(function对象,传递的是引用的副值,若没有return语句或name{})、函数表达式本JavaScript允许传入比return后没有表达式,则返(const name=定义时更多或更少的参数回undefined函数可以返function{})或箭头函数多余参数可通过arguments回任何类型的值,包括对(const name=={})等对象或剩余参数(...rest)象、数组或其他函数,这是方式定义函数是一等公访问;缺少的参数为实现闭包和工厂函数的基民,可以赋值给变量、作为undefined础参数传递或从其他函数返回默认参数ES6引入了默认参数语法function greetname=访客{},当参数未提供或为undefined时使用默认值默认参数可以是任何表达式,包括函数调用,且后面的默认参数可以引用前面的参数函数表达式与箭头函数函数表达式箭头函数函数表达式将匿名函数赋值给变量const sum=ES6引入的箭头函数提供了更简洁的语法const sum=a,functiona,b{return a+b;}与函数声明不同,函数表b=a+b;单参数可省略括号,单表达式可省略花括号达式不会被提升,必须在定义后调用和return函数表达式的特点是灵活性高,可以立即调用(IIFE模箭头函数没有自己的this、arguments、super或式)、作为参数传递,或者根据条件创建不同的函数实new.target绑定,它们继承自外围作用域这解决了传统现它是回调函数、高阶函数和函数式编程的基础回调函数中this指向问题,但使箭头函数不适合作为方法或构造函数作用域与闭包全局作用域在函数外部声明的变量属于全局作用域,可被任何代码访问过多全局变量会导致命名冲突和内存问题局部作用域在函数内部声明的变量属于局部作用域,只在函数内可访问ES6引入的let和const创建块级作用域,限制在{...}块内词法作用域JavaScript使用词法作用域,即函数的作用域在函数定义时确定,而非调用时函数可以访问自身作用域、外部作用域和全局作用域的变量闭包闭包是函数及其词法环境的组合,使函数能够访问其定义时的作用域当函数在其定义的作用域外被调用时仍能访问原作用域的变量闭包的典型应用包括数据封装和私有变量、函数工厂、回调函数中保存状态例如,计数器函数function createCounter{let count=0;return function{return++count;};}闭包使用不当可能导致内存泄漏,因为闭包会保持对外部变量的引用,阻止垃圾回收为避免问题,应在不再需要时解除引用,特别是在处理DOM元素或大型数据结构时对象基础70%3网页使用对象创建方式现代Web应用程序中数据结构的主要形式对象字面量、构造函数和Object.create2访问方式点表示法和方括号表示法JavaScript对象是键值对的集合,类似于字典或哈希表创建对象最常用的方法是对象字面量语法let person={name:张三,age:30,greet:function{console.log你好!;}}访问对象属性有两种方式点表示法(person.name)和方括号表示法(person[name])点表示法更简洁直观,而方括号表示法允许使用变量作为键名或使用特殊字符的键名JavaScript对象具有动态特性,可以随时添加、修改或删除属性person.job=工程师添加新属性,delete person.age删除属性这种灵活性使对象成为表示复杂数据结构的理想选择对象的高级操作对象属性描述符允许精细控制属性行为,通过Object.defineProperty设置描述符包括value(值)、writable(可写性)、enumerable(可枚举性)、configurable(可配置性)、getter和setter函数这提供了创建计算属性和控制属性访问行为的强大机制ES6增强了对象操作能力Object.freeze冻结对象使其完全不可变;Object.seal封装对象防止添加/删除属性;Object.assign合并对象;解构赋值提供了提取对象属性的简洁语法let{name,age}=person现代JavaScript还提供了对象操作的新方法Object.keys、Object.values和Object.entries便于迭代对象属性;扩展运算符(...)简化对象复制和合并;可选链操作符(.)和空值合并操作符()提供了更安全的属性访问方式原型与继承类语法ES6现代JavaScript中定义对象模板的语法糖继承实现2通过原型链或类继承来实现代码复用原型链对象间属性查找的机制原型对象4所有JavaScript对象的基础JavaScript的继承基于原型,而非类每个对象都有一个内部链接指向另一个对象,称为其原型当试图访问对象的属性时,如果对象本身没有该属性,JavaScript会在原型上查找,然后是原型的原型,形成原型链,直到找到属性或到达链尾(null)传统的继承实现使用构造函数和原型function Animalname{this.name=name;}Animal.prototype.speak=function{...}ES6引入的class语法提供了更清晰的面向对象编程体验,但底层仍使用原型机制class Animal{constructorname{this.name=name;}speak{...}}基础文档对象模型DOM树结构DOMDOM将HTML文档表示为树形结构,树中的每个节点代表文档的一部分根节点是document对象,代表整个文档元素节点对应HTML标签,文本节点包含文本内容,属性节点表示元素属性节点类型与关系DOM定义了多种节点类型,主要包括元素节点
1、属性节点
2、文本节点
3、注释节点8和文档节点9节点之间形成父子、兄弟等关系,可通过节点属性如parentNode、childNodes、firstChild等导航操作性能DOMDOM操作是网页性能瓶颈之一,因为它触发页面重排和重绘优化DOM操作的关键策略包括减少直接操作次数、使用文档片段DocumentFragment批量操作、适当缓存DOM引用、使用事件代理减少事件监听器数量操作
(一)元素选择DOM方法返回类型选择依据示例getElementById单个元素ID属性document.getElementByIdheadergetElementsByClass元素集合类名document.getElemeName ntsByClassNamebtngetElementsByTagN元素集合标签名document.getElemeame ntsByTagNamedivquerySelector单个元素CSS选择器document.querySelector.containerpquerySelectorAll静态节点列表CSS选择器document.querySelectorAllul li传统的DOM选择方法(getElementById、getElementsByClassName、getElementsByTagName)返回实时更新的集合,而现代方法(querySelector、querySelectorAll)返回静态快照这意味着后者在选择元素后不会反映DOM的变化在选择元素时,应优先考虑最高效的方法ID选择通常最快,其次是标签选择避免过于复杂的CSS选择器,特别是在频繁操作的场景中对于动态内容,考虑缓存DOM引用以提高性能操作
(二)内容操作DOM内容读写创建节点innerHTML设置HTML内容,textContent设置createElement创建元素,createTextNode创纯文本,避免使用已弃用的innerText建文本,cloneNode复制现有节点移除节点插入节点removeChild删除子节点,现代方法appendChild添加子节点,insertBefore在特定element.remove直接删除元素自身位置插入,replaceChild替换现有节点innerHTML和textContent的关键区别在于安全性和性能innerHTML解析HTML字符串并创建DOM元素,存在XSS风险;而textContent仅处理纯文本,更安全高效当只需显示文本时,始终选择textContent处理大量DOM操作时,使用DocumentFragment可显著提高性能它是一个轻量级的文档片段,可在其中构建复杂DOM结构,然后一次性添加到文档中,减少页面重排次数const fragment=document.createDocumentFragment;/*添加元素到fragment*/container.appendChildfragment;操作
(三)属性操作DOM标准属性操作操作元素的标准HTML属性有两种主要方式DOM属性语法(element.id=newId)和特性方法(element.getAttributeid、element.setAttributeid,newId)DOM属性通常提供类型化的值,而特性方法始终处理字符串自定义数据属性HTML5引入的data-*属性允许存储自定义数据通过element.dataset对象可以方便地访问这些属性,如div data-user-id=123对应element.dataset.userId这为HTML元素提供了关联数据的标准方式,避免使用非标准属性类名与样式操作现代DOM提供了高效的类名操作element.classList.add、remove、toggle和contains直接样式操作通过element.style对象实现,适用于动态样式变化,但通常应优先使用类名切换来应用预定义的CSS样式几何尺寸与位置获取元素的尺寸和位置信息可使用element.getBoundingClientRect(相对于视口的位置和尺寸)、offsetWidth/offsetHeight(包含边框和内边距的尺寸)、clientWidth/clientHeight(不含边框的内部尺寸)事件处理基础事件模型事件处理注册JavaScript的事件模型描述了事件如何在DOM树中传播和注册事件处理程序有三种主要方式HTML属性(button处理DOM事件流包含三个阶段捕获阶段(从document onclick=handleClick)、DOM属性(element.onclick向目标元素)、目标阶段(到达目标元素)和冒泡阶段=function{})和事件监听器(从目标元素回到document)(element.addEventListenerclick,handleClick)现代浏览器支持W3C事件模型,事件处理程序接收Event推荐使用addEventListener方法,因为它允许为同一事件对象参数,包含事件相关信息如事件类型、目标元素和时添加多个处理程序,支持事件捕获,并且可以轻松移除处间戳addEventListener方法支持指定事件在捕获或冒泡理程序事件冒泡使事件从触发元素向上传播,可以通过阶段处理event.stopPropagation阻止常见事件类型鼠标事件是最常用的交互事件,包括click(单击)、dblclick(双击)、mousedown/mouseup(按下/释放)、mouseover/mouseout(进入/离开元素)、mousemove(移动)等触摸设备上,还应考虑touch事件,如touchstart、touchmove、touchend,以支持移动端交互键盘事件监听用户键盘输入,主要包括keydown(按下键)、keyup(释放键)和keypress(字符输入,已弃用)事件对象的key和code属性提供按键信息表单事件如submit(表单提交)、change(值变化)、input(输入时)、focus/blur(获得/失去焦点)用于处理用户输入页面生命周期事件跟踪文档加载状态DOMContentLoaded在HTML完全加载和解析后触发,不等待样式表和图像;load在页面所有资源(包括图像、样式表)加载完成后触发;beforeunload和unload在用户离开页面前触发,可用于确认操作或清理工作事件代理与最佳实践事件代理机制事件代理(委托)是一种利用事件冒泡将事件处理程序附加到父元素而非多个子元素的技术当子元素触发事件时,事件会冒泡到父元素,触发处理程序在处理程序中,通过event.target确定实际触发事件的元素性能优化事件代理显著减少事件处理程序数量,降低内存使用并提高性能,特别适用于大量相似元素(如表格行、列表项)或动态添加/删除的元素优化事件处理还应避免在事件处理程序中执行复杂计算,考虑使用requestAnimationFrame处理视觉更新防抖与节流防抖Debounce和节流Throttle是控制高频事件处理的技术防抖确保函数在一段时间内多次触发只执行最后一次(如调整窗口大小);节流限制函数在一定时间内只执行一次(如滚动事件)这些技术显著提高性能并减少不必要的计算浏览器对象模型BOM对象windowwindow是BOM的核心对象,代表浏览器窗口它是全局对象,全局变量和函数都是window的属性和方法提供了控制窗口的方法如open、close、resizeTo和dialogues如alert、confirm、prompt对象locationwindow.location提供当前URL信息和导航功能主要属性包括href(完整URL)、hostname(主机名)、pathname(路径)、search(查询字符串)、hash(片段标识符)方法如assign、replace和reload用于页面导航对象historywindow.history管理浏览历史提供back、forward和go方法导航历史记录现代Web应用使用History API(pushState、replaceState)实现无刷新页面状态更改,是单页应用路由的基础对象navigatorwindow.navigator包含浏览器信息提供userAgent(浏览器标识字符串)、platform(操作系统)、language(首选语言)等现代API还包括geolocation(地理位置)、permissions(权限)和serviceWorker(离线功能)支持计时器与异步编程基础计时器函数JavaScript提供两个主要的计时器函数setTimeoutcallback,delay在指定延迟后执行一次回调函数;setIntervalcallback,interval按指定间隔重复执行回调函数这些函数返回一个标识符,可用于通过clearTimeout或clearInterval取消计时器单线程模型JavaScript是单线程语言,使用事件循环处理异步操作代码在主线程(也称为执行栈)上顺序执行当遇到异步任务(如计时器、网络请求、事件监听器)时,将回调函数放入任务队列,等待主线程空闲时执行回调地狱传统异步编程使用嵌套回调函数,当多个异步操作依赖时,代码可能形成深度嵌套结构,称为回调地狱这导致代码难以阅读、调试和维护例如setTimeout={getData={processData={displayData;};};},1000;对象Promise待定状态Promise初始状态,既未完成也未拒绝已兑现状态操作成功完成,调用resolve已拒绝状态操作失败,调用rejectPromise是ES6引入的异步编程解决方案,表示一个异步操作的最终完成或失败创建Promise的基本语法为new Promiseresolve,reject={...}resolve和reject是回调函数,用于将Promise状态从pending更改为fulfilled或rejectedPromise提供了链式调用API,使用.then处理成功结果,.catch处理错误,.finally执行清理操作这种链式结构解决了回调地狱问题,提高了代码可读性例如fetchData.thenprocessData.thendisplayData.catchhandleErrorPromise还提供了静态方法处理多个Promise Promise.all[p1,p2]等待所有Promise完成;Promise.race[p1,p2]等待第一个完成的Promise;Promise.allSettled等待所有Promise完成无论成功失败;Promise.any等待第一个成功的Promise语法async/await函数async声明异步函数,返回Promise对象表达式await暂停执行直到Promise解决错误处理3使用try/catch捕获异步错误async/await是ES2017引入的语法糖,基于Promise提供更简洁的异步编程方式使用async关键字声明的函数总是返回Promise,如果函数返回非Promise值,会自动包装为已解决的Promise这使异步代码结构更接近同步代码,提高可读性在async函数内部,可以使用await关键字等待Promise解决await表达式会暂停函数执行,直到Promise解决并返回结果这消除了显式的.then链,使代码更直观async functiongetData{const response=await fetchurl;const data=await response.json;return data;}错误处理使用标准的try/catch块,可以捕获异步操作中的异常,包括rejected Promise这比Promise链中的.catch更清晰async functionfetchData{try{const data=await getData;processDatadata;}catch error{handleErrorerror;}}操作JSON基础方法JSON JSONJSONJavaScriptObject Notation是一种轻量级数据交换JavaScript提供了两个主要方法处理JSON格式,基于JavaScript对象语法但是独立于编程语言JSON.stringify将JavaScript值转换为JSON字符串,可JSON格式简单直观,是前后端数据传输的标准格式接受额外参数控制转换过程例如JSON.stringifyobj,replacer,space中replacer可以是函数或数组,用于过滤JSON支持的数据类型有对象({key:value})、数组属性;space控制缩进格式([value1,value2])、字符串、数值、布尔值、null不支持undefined、函数、Symbol和带循环引用的结构JSON.parse将JSON字符串解析为JavaScript值,也可接JSON中的键必须是双引号包围的字符串,这与JavaScript受可选的reviver函数参数,用于在返回解析值前对其进行对象有所不同转换这对处理日期等特殊格式特别有用JSON.parsejsonStr,key,value=key===datenewDatevalue:valueWeb StoragelocalStoragesessionStorage持久存储,没有过期时间,跨会话保存临时存储,关闭标签页即清除安全考虑存储限制不存储敏感数据,注意XSS风险通常每个域5-10MB,仅存储字符串Web StorageAPI提供了两种客户端存储机制localStorage和sessionStorage二者共享相同的API方法setItemkey,value设置数据,getItemkey获取数据,removeItemkey删除数据,clear清空所有数据,keyindex获取第n个键名所有值都会被自动转换为字符串存储事件storage event允许在其他页面修改存储时收到通知事件仅在localStorage变化时触发(sessionStorage不触发),仅在非发生变化的页面上触发这使开发者能够构建跨标签页的实时数据同步window.addEventListenerstorage,event=console.logevent.key,event.newValue正则表达式基础正则表达式语法正则表达式是描述字符模式的对象,在JavaScript中可以通过字面量语法(/pattern/flags)或RegExp构造函数创建常用标志包括i(忽略大小写)、g(全局匹配)、m(多行匹配)、s(点号匹配所有字符包括换行)、u(Unicode模式)常用匹配模式正则表达式使用特殊字符表示模式\d匹配数字,\w匹配字母数字下划线,\s匹配空白字符,.匹配任意字符(除换行)量词控制重复(0或1次),+(1或多次),*(0或多次),{n,m}(n到m次)字符类[abc]匹配括号内任一字符应用方法String方法中的正则应用search返回首次匹配位置,match返回匹配结果数组,replace替换匹配内容,split使用正则分割字符串RegExp对象方法test检测是否匹配,exec执行搜索并返回详细信息,适用于循环提取所有匹配模块化编程模块系统导出语法ES6ES6引入了原生JavaScript模块系统,使用import和export关键字与export关键字用于公开模块内容命名导出允许导出多个值export constCommonJS和AMD等早期模块化方案不同,ES模块是静态的,导入导出在编pi=
3.14;export functionsquarex{...}默认导出提供主要功能export译时确定,支持静态分析和优化每个文件被视为独立模块,拥有自己的作default classCalculator{...}可以组合使用命名导出和默认导出,或在模块用域末尾集中导出export{pi,square,Calculator asdefault}导入语法动态导入import关键字用于引入其他模块的功能导入命名导出import{pi,ES2020标准化了动态导入import函数返回Promise,支持条件加载和运square}from./math.js,可使用as重命名import{square as行时确定模块路径这是实现代码分割和按需加载的关键squareFunction}from./math.js导入默认导出import Calculatorfrom button.addEventListenerclick,async={const{default:module}=./calculator.js导入所有内容import*as mathUtilsfrom./math.js awaitimport./feature.js;module.initialize;}错误处理与调试语句try...catchJavaScript使用try...catch...finally结构处理运行时错误try块包含可能引发错误的代码,catch块处理捕获的错误,finally块包含无论是否发生错误都会执行的清理代码错误类型JavaScript内置多种错误类型Error(基类)、SyntaxError(语法错误)、ReferenceError(引用错误)、TypeError(类型错误)、RangeError(范围错误)等可以自定义错误类型class CustomErrorextends Error{constructormessage{supermessage;this.name=CustomError;}}调试技术console方法是基本调试工具log输出信息,error输出错误,warn输出警告,table以表格形式显示数据,time/timeEnd测量代码执行时间浏览器开发者工具提供断点调试、网络监控、性能分析等高级功能错误监控生产环境应实现错误日志和监控window.onerror全局处理未捕获错误,window.addEventListenerunhandledrejection捕获未处理的Promise拒绝服务端错误收集和分析工具帮助识别和解决生产问题性能优化基础代码优化优化资源加载DOM避免全局变量和深度嵌套循减少DOM操作次数,使用文使用异步加载脚本环,减少闭包使用,适当缓档片段批量更新,避免频繁async/defer,合理使用预存频繁访问的值,使用适当重排,使用CSS类替代直接加载preload和预获取的数据结构和算法使用现样式操作,减少回流和重prefetch指令,图像懒加代语法如解构赋值、扩展运绘虚拟滚动处理大数据列载,使用现代图像格式算符提高可读性和效率表,实现高效无限滚动WebP和响应式图像代码分割实现按需加载,将应用拆分为多个小块,减少初始加载时间使用动态import按路由或功能加载组件,结合现代打包工具实现树摇(TreeShaking)消除未使用代码开发工具链JavaScript包管理工具npm和yarn是JavaScript生态系统的包管理工具,用于安装、管理和共享代码包它们维护项目依赖,解决版本冲突,并提供脚本运行功能npm是Node.js默认包管理器,而yarn提供更快的安装速度和确定性构建打包工具Webpack是最流行的JavaScript模块打包器,将模块及其依赖打包为静态资源它支持代码分割、资源处理、开发服务器等功能Vite是新一代前端构建工具,利用ES模块提供极快的开发体验,在生产环境使用Rollup打包转译工具Babel是JavaScript编译器,将最新的JavaScript语法转换为向后兼容的版本,使开发者能够使用最新语言特性而不用担心浏览器兼容性Babel支持可配置的转换插件和预设,如@babel/preset-env可根据目标环境自动选择需要的转换学习资源与进阶路径深入学习JavaScript的优质资源包括MDN Web文档(权威参考文档)、JavaScript.info(现代JavaScript教程)、《你不知道的JavaScript》系列(深入理解语言机制)、《JavaScript高级程序设计》(全面系统的教程)在线学习平台如freeCodeCamp、Codecademy提供交互式编程练习实践是掌握JavaScript的关键参与开源项目贡献代码,在GitHub上研究高质量代码库,构建个人项目加深理解参加编程挑战如LeetCode、HackerRank提高算法能力,加入技术社区如Stack Overflow、Dev.to分享知识和解决问题JavaScript持续快速发展,前端开发职业路径包括专注React/Vue/Angular等框架成为前端工程师,学习Node.js成为全栈开发者,深入WebGL/Canvas/SVG领域成为可视化专家,研究WebAssembly和性能优化成为性能工程师保持学习新技术和最佳实践是长期成功的关键。
个人认证
优秀文档
获得点赞 0