还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
语法讲义JavaScript欢迎来到语法讲义!本课程将全面介绍的基础知识和JavaScript JavaScript高级特性,帮助您掌握这门强大的编程语言作为当今互联网不JavaScript可或缺的一部分,在网页交互、服务器开发和移动应用等领域有着广泛应用我们将从基础语法开始,逐步深入到函数、对象、原型等核心概念,最后探讨现代特性和异步编程模型无论您是编程新手还是有经验的开发JavaScript者,这门课程都能帮助您建立扎实的基础JavaScript简介JavaScript脚本语言特性应用领域是一种高级、解释型、动态类型的脚本语言,它不最初主要在浏览器环境中运行,但随着的出JavaScript JavaScriptNode.js需要编译就能直接运行最初被设计用于增强网页的交互性和动现,它已经扩展到服务器端开发如今,已成为网JavaScript态效果,现已发展成为全栈开发语言页前端开发的核心语言,同时在后端服务、移动应用、桌面应用等领域都有广泛应用作为一种脚本语言,代码在浏览器引擎中被实时解JavaScript释执行,无需事先编译,这使得开发过程更加灵活高效第一章基础语法概览代码书写规范注释格式代码应遵循一致支持两种注释方JavaScript JavaScript的格式规范,包括适当的缩进式单行注释使用,多行//(通常为或个空格)、合注释使用这些注释24/*...*/,理的换行以及语句结束的分不会被执行,但对代码的理解号良好的代码风格能提高代和维护至关重要码的可读性和可维护性区分大小写程序Hello World创建最简文件HTML首先创建一个基本的文件,在其中引入代码可以通HTML JavaScript过标签直接在中嵌入,或者引用外部script HTMLJavaScript文件JavaScript编写第一个语句JavaScript使用方法在页面上输出或使用document.write Hello,World!在控制台打印信息这是了解最基本的输console.log JavaScript出方式运行并查看结果在浏览器中打开文件,查看页面显示或打开开发者工具查HTML看控制台输出这样就完成了第一个程序的编写和运JavaScript行变量定义方式var传统的变量声明方式,存在变量提升现象声明的变量可以被重复声明,作用域为函数作用域在现代开发中,JavaScript不推荐使用varlet引入的块级作用域变量声明方式声明的变量只在其声ES6let明的块或子块中可用,不存在变量提升,不可重复声明const用于声明常量的关键字,声明后不能再赋值但如果声const明的是引用类型(如对象或数组),其内部属性仍然可以被修改标识符命名规范合法字符与规则命名风格•标识符可以包含字母、数字、下划线_和美元符号$•驼峰命名法(camelCase)首字母小写,后续单词首字母大写,如•必须以字母、下划线或美元符号开头,不能以数字开头myFirstName•不能使用JavaScript的关键字和保留字作为标识符•帕斯卡命名法(PascalCase)每个单词首字母大写,通常用于类名,如MyClass•建议使用有意义的名称,反映变量的用途或内容•下划线命名法(snake_case)单词之间用下划线连接,如my_first_name•常量通常使用全大写,单词间用下划线分隔,如MAX_COUNT数据类型总览BooleanNullUndefined表示逻辑值,只表示空值或不存String有true和false两在的对象表示未赋值的变Symbol个值量的默认值表示文本数据,新增类型,ES6如Hello或表示唯一且不可Object变的值World引用类型,包含Number数组、函数、日表示整数和浮点期等复杂数据结数,如或构
423.14类型详解Number整数与浮点数特殊数值中的所有数字都以位浮点格式存储,遵循()表示非法的数字值,如的结果JavaScript64IEEE NaNNot aNumber0/0标准整数实际上是没有小数部分的浮点数有趣的是,不等于任何值,包括它自己可以使用754NaN isNaN函数检测一个值是否是NaN数字可以用十进制(常规)、十六进制(前缀)、八进制0x(前缀)和二进制(前缀)表示中的整数精和表示无穷大和无穷小,如的结果是0o0b JavaScriptInfinity-Infinity1/0确表示范围为到可以使用函数检测一个值是否是有限数-2^532^53Infinity isFinite(字符串)类型String单引号声明使用单引号声明字符串是最常见的方式之一如果字符串内部需要...包含单引号,可以使用反斜杠进行转义\例如let str=It\s abeautiful day;双引号声明使用双引号声明字符串的方式与单引号类似如果字符串内部需...要包含双引号,同样可以使用反斜杠进行转义例如let str=He said,\Hello!\;;模板字符串()ES6使用反引号声明的模板字符串是引入的新特性它支持多行字`...`ES6符串和字符串插值,使用的语法可以在字符串中嵌入表${expression}达式例如let name=World;let greeting=`Hello,${name}!`;类型与逻辑Boolean布尔常量真值与假值布尔类型()只有两个值和这两个值用在中,非布尔类型的值在进行条件判断时会被自动Boolean true false JavaScript于表示逻辑真和逻辑假,是条件语句和逻辑运算的基础转换为布尔值了解哪些值会被转换为(真值)或true false(假值)非常重要布尔值通常用于条件判断,如语句、循环等布尔值也if while可以通过逻辑运算符(、、)进行运算,生成新的布尔假值()包括、、(空字符串)、、||!falsy false0null值和除此之外的所有值都是真值(),包undefined NaNtruthy括所有对象和数组(即使是空数组或空对象)[]{}和区别null undefined的含义与场景的含义与场景undefined null表示未定义,是一个表示空值,需要显式赋值,undefinednull变量的原始值当声明一个变量但表示一个变量不再指向任何对象未赋值时,该变量的默认值为通常用于表示程序级的、人为null此外,函数无明确返的或意图的空值undefined回值时也会返回undefined在实际应用中,我们经常使用null通常表示意料之中的来初始化将来会被赋值为对象的变undefined无,即系统级别的、原始的或默量,或者表示一个对象不存在认的空值比较与转换虽然和表示不同的概念,但在相等比较()时它们相等,而null undefined==在全等比较()时它们不相等返回,而===typeof nullobject typeof返回undefined undefined当转换为数字时,变为,而变为这些细微差别在处理数null0undefined NaN据时需要特别注意类型Symbol唯一性特征创建与使用•Symbol是ES6引入的新原始数据类型•使用Symbol函数创建,可以提供可选的描述参数•每个Symbol值都是唯一的,即使描述相同•Symbol.for方法可以在全局•Symbol可以作为对象属性的键,保证Symbol注册表中创建共享的Symbol属性不会被意外覆盖•Symbol.keyFor方法可以从全局•Symbol值不会被自动转换为字符串,Symbol注册表中检索Symbol的描述需要显式调用toString方法•内置Symbol值如Symbol.iterator用于实现特定的JavaScript行为应用场景•创建对象的唯一属性,避免属性名冲突•在库或框架中定义私有或内部属性和方法•实现特定的JavaScript接口或协议,如迭代器协议•定义对象的元数据,不影响对象的正常使用对象类型Object对象字面量创建最常用的创建对象方式,使用花括号直接定义对象的属性和方法{}例如张三let person={name:,age:25,greet:function你好{return}};构造函数创建使用关键字和构造函数创建对象例如new Objectlet person=张三new Object;person.name=;person.age=25;方法Object.create引入的方法,可以指定新对象的原型对象例如ES5let你好personProto={greet:function{return}};let person=Object.createpersonProto;数组类型Array数组创建方法数组可以通过字面量或构造函数创建例如苹果香蕉橙子[]Array letfruits=[,,];索引与长度数组元素通过索引访问,索引从开始数组长度通过属性获取0length常用Array API(末尾添加删除)、(开头删除添push/pop/shift/unshift/加)、(任意位置操作)等splice操作符详解typeof值typeof返回值说明数字类型,包括整数和浮42number点数字符串类型hello string布尔类型true boolean未定义类型undefined undefinednullobject这是JavaScript的一个历史遗留bug对象类型{}object数组也是对象的一种[]object函数类型function{}functionSymbol symbolSymbol类型ES6新增运算符总览一元运算符对单一操作数进行操作等+x,-x,++x,x++,--x,x--,typeof,delete二元运算符对两个操作数进行操作算术运算符、赋值运算符、比较运算符等三元运算符条件运算符conditionexpr1:expr2算术与赋值运算算术运算符赋值运算符支持常见的算术运算符,用于执行数学计算赋值运算符用于给变量赋值,并支持与其他运算符的组合JavaScript•加法(+)将两个数相加,或连接字符串•简单赋值(=)将右侧的值赋给左侧的变量•减法(-)从一个数中减去另一个数•加法赋值(+=)将右侧的值加到左侧变量上并赋值•乘法(*)将两个数相乘•减法赋值(-=)从左侧变量中减去右侧的值并赋值•除法(/)将一个数除以另一个数•乘法赋值(*=)将左侧变量与右侧的值相乘并赋值•取模(%)返回除法的余数•除法赋值(/=)将左侧变量除以右侧的值并赋值•自增(++)将变量的值增加1•取模赋值(%=)计算左侧变量除以右侧的值的余数并赋值•自减(--)将变量的值减少1•幂运算(**)ES2016新增,计算底数的指数次幂•幂运算赋值(**=)计算左侧变量的右侧值次幂并赋值比较运算符相等运算符不等运算符大小比较==(相等)与===!=(不相等)与!==(大于)、(小(全等)是(不全等)用于判断于)、=(大于等JavaScript中最常用两个值是否不相等于)和=(小于等的比较运算符相等其工作原理与相等运于)用于比较数值的运算符在比较之前会算符相反,同样区分大小关系,也可用于进行类型转换,而全是否进行类型转换字符串的字典序比等运算符则要求类型较和值都相同三元运算符conditionexpr1:expr2是JavaScript中唯一的三元运算符,根据条件的真假返回不同的值,是if-else语句的简洁替代逻辑运算符逻辑非()逻辑或()!||一元运算符,将布尔值取反如果操作数不是布尔值,会先将其转换为二元运算符,只要有一个操作数为真,结果就为真也具有短路特性,布尔值,然后再取反例如返回,返回如果第一个操作数为真,则不会评估第二个操作数!truefalse!0true逻辑与()二元运算符,只有当两个操作数都为真时,结果才为真具有短路特性,如果第一个操作数为假,则不会评估第二个操作数位运算符简介按位与()对两个操作数的每个对应位执行操作只有当两个位都为时,结果位AND1才为,否则为常用于掩码操作,提取特定位10按位或()|对两个操作数的每个对应位执行操作只要有一个位为,结果位就为OR11常用于设置特定位为,而不影响其他位1按位异或()^对两个操作数的每个对应位执行操作当两个位不同时,结果位为,XOR1相同时为常用于切换位的状态0按位非()~对操作数的每个位执行操作,将所有的变为,所有的变为在NOT0110中,由于采用补码表示,等于JavaScript~x-x-1流程控制条件语句基本语句if最简单的条件结构,只有当条件为真时执行特定代码块例如if age=18{console.log成年人;}语句if-else根据条件的真假执行不同的代码块例如if score=60{console.log通过;}else{console.log不通过;}语句if-else if-else处理多个条件的顺序检查例如if score=90{console.log优秀;}else ifscore=60{console.log及格;}else{console.log不及格;}嵌套条件语句在条件语句内部再使用条件语句,用于处理复杂的决策逻辑但过度嵌套会降低代码可读性,应尽量避免多分支语句switch的作用break语法结构每个语句块末尾通常需要语case break语句评估一个表达式,将结果与switch句,以防止代码继续执行下一个case子句进行匹配,并执行相应的代case1如果省略,程序会继续执行下一break码它提供了一种比多个语句更if-else个的代码,这种现象称为贯穿case清晰的方式来处理多分支逻辑()fall-through使用建议子句default语句对于处理一个表达式有多个switch4default子句在所有case都不匹配时执可能值的情况特别有用但对于范围检行,类似于链中的最后一个if-else查,通常更适合执行效率上,if-else它是可选的,但通常建议添加,else对于大量值通常比switch caseif-else以处理意外情况链更快循环语句总览循环循环循环for while do-while循环是中最常用的循环结循环在每次迭代前检查条件只要循环与循环类似,但它for JavaScriptwhile do-while while构,特别适合需要迭代特定次数的场条件为真,循环体就会继续执行在每次迭代后检查条件这意味着循环while景它由三个部分组成初始化表达循环特别适合当你不知道需要循环多少体至少会执行一次,即使条件最初就是式、条件表达式和递增表达式次的场景假的语法语法语法for initialization;condition;while condition{statement}do{statement}whileincrement{statement}condition;例如let i=0;while i5例如例如for let i=0;i5;i++{console.logi;i++;}leti=0;do{console.logi;{console.logi;}i++;}while i5;循环深度讲解for循环控制递增表达式在循环体内,可以使用break语句提条件表达式第三部分是递增表达式,在每次循环前退出循环,或使用continue语句初始化表达式第二部分是条件表达式,在每次迭代体执行后求值通常用于更新计数器跳过当前迭代的剩余部分,直接进入for循环的第一部分是初始化表达式,开始前求值如果条件为真,则执行变量可以进行复杂的操作,不限于下一次迭代这些控制语句增强了循它在循环开始前执行一次通常用于循环体;如果为假,则终止循环可简单的递增环的灵活性声明并初始化计数器变量可以声明以省略条件,默认为真,但需要在循例如for leti=0;i10;i+=2多个变量,用逗号分隔环体内提供退出机制,避免无限循环例如for leti=0,j=10;...循环while/do-while循环特点循环特点whiledo-while•在循环开始前检查条件•在循环结束时检查条件•如果条件为假,循环体一次都不•循环体至少执行一次,即使条件会执行初始为假•适合不确定迭代次数的场景•适合需要至少执行一次的场景•需要在循环体内更新条件相关变•同样需要在循环体内更新条件相量,否则可能导致无限循环关变量循环陷阱与解决•无限循环确保条件最终会变为假•循环不执行检查初始条件•提前退出使用break语句•跳过迭代使用continue语句函数基本语法函数声明使用关键字定义function functionfunctionNameparameters{statements}参数传递函数可以接收多个参数,参数之间用逗号分隔返回值使用语句返回结果,可以返回任何类型的值return函数调用使用函数名加括号,并传入实际参数functionNamearguments匿名函数与表达式匿名函数定义函数表达式特点匿名函数是没有名称的函数,通常函数表达式将函数赋值给变量,可作为函数表达式的一部分例如以在程序运行时动态创建与函数声明不同,函数表达式不会被提升,let greet=functionname你好,必须在定义后才能使用{return+name;};匿名函数可以作为参数传递给其他函数,尤其是在回调函数、事件处函数表达式使代码更灵活,能够创理程序和数组方法中非常常见建闭包和模块化设计,是函数式编程的基础JavaScript立即执行函数表达式()IIFE是一种在定义后立即执行的函数表达式语法IIFE function{/*code第一对括号将函数声明转换为表达式,第二对括号执行该函数*/}主要用于创建私有作用域,避免全局命名空间污染,是模块化开发的重要IIFE手段箭头函数()ES6基本语法箭头函数提供了一种更简洁的函数表达式语法基本形式或parameters=expression parameters={statements}绑定特性this箭头函数没有自己的,而是继承父作用域的这避免了传统函this this数中常见的绑定问题this语法限制箭头函数不能用作构造函数,没有对象,不能用作生成器arguments函数(不能使用)yield常用场景适合用于短小的回调函数、数组方法链和需要保持上下文的场景this不适合用于需要动态的方法this参数默认值和不定参数默认参数值剩余参数()展开运算符()Rest ParametersSpread Operator允许在函数声明时为参数指定默认值,当剩余参数语法允许函数接受不定数量的参数,展开运算符与剩余参数使用相同的语法(),ES
6...调用函数时没有提供该参数或提供的值为这些参数被收集到一个数组中语法使用三个但作用相反它用于将数组展开为单独的参数,时,将使用默认值例如点()后跟参数名例如或者将对象展开为单独的键值对例如undefined...function访客你等同于function greetname={returnsum...numbers{return Math.max...[1,2,3]Math.max1,2,好,+name;}numbers.reducea,b=a+b,0;}3默认参数可以是任何表达式,包括函数调用,剩余参数必须是函数参数列表中的最后一个参展开运算符在复制数组、合并数组或对象、将且在函数执行时才会被求值当参数有默认值数与对象不同,剩余参数是真正可迭代对象转换为数组等场景非常有用,是arguments时,调用函数可以传入来使用默认的实例,可以直接使用数组方法中最灵活的特性之一undefined ArrayES6值函数作用域与闭包函数作用域基本概念函数作用域是指在函数内部声明的变量只能在该函数内部访问,外部无法直接访问作用域链当函数需要查找变量时,会先在自身作用域内查找,如果没有找到,则会逐级向上查找闭包的形成当函数访问其词法作用域之外的变量时,就形成了闭包,即使外部函数已经执行完毕闭包应用闭包常用于数据隐藏、创建私有变量、函数工厂和记忆化函数等场景对象属性和方法定义属性访问与添加属性删除对象属性可以通过点符号()obj.prop使用操作符可以删除对象的属delete或方括号()访问使用点obj[prop]性例如这会完delete person.age;符号或方括号也可以动态添加新属性全移除该属性,而不仅仅是将其值设为例如或person.age=25;undefinedperson[age]=25;关键字方法定义this在方法中,关键字引用调用该方法方法是作为对象属性的函数提供this ES6的对象的值在函数执行时确定,了简写语法定义方法例如this letobj=而不是在定义时箭头函数中的与张三你this{name:,greet{return常规函数不同,它继承自父级作用域好;}};原型与原型链原型概念每个JavaScript对象都有一个原型(prototype),它是另一个对象,本对象会从原型继承属性和方法函数对象有一个特殊的prototype属性,用于实现基于原型的继承原型链原理当访问对象的属性或方法时,如果对象本身没有,JavaScript会沿着原型链向上查找这种链式查找构成了原型链,是JavaScript继承机制的基础原型继承实现3通过设置构造函数的prototype属性,所有由该构造函数创建的实例都会继承原型上的属性和方法Object.create方法也可以显式指定对象的原型原型操作方法Object.getPrototypeOf获取对象的原型,Object.setPrototypeOf设置对象的原型(但性能较差),实例的__proto__属性可访问原型(不推荐直接使用)构造函数与实例化构造函数定义构造函数是用来创建对象的特殊函数,通常首字母大写以区分普通函数例如function Personname,age{this.name=name;this.age=age;}构造函数内部使用this关键字引用新创建的对象,为其添加属性和方法关键字作用new使用new关键字调用构造函数时,会发生以下步骤创建一个新对象;将构造函数的this绑定到新对象;执行构造函数代码;如果构造函数没有返回对象,则返回新创建的对象例如let person=new Person张三,25;实例与原型关系使用构造函数创建的对象称为该构造函数的实例每个实例都链接到构造函数的prototype对象,从而继承其属性和方法可以使用instanceof运算符检查对象是否是特定构造函数的实例例如person instanceofPerson返回true内置对象总览对象对象对象其他内置对象Math Date JSON提供数学常数和函数的静用于处理日期和时间的对提供解析和转换值还提供了JSON JavaScript态属性和方法,如象,提供各种获取和设置为的方法主要有(正则表达JSON RegExp、日期时间的方法例如(将式)、(错误处Math.PI JSON.parse Error、、字符串转换为理)、和(集合Math.random newDateJSONMap Set等它是
一、对象)和类型)等内置对象,丰富Math.floor date.getFullYear JavaScript个静态对象,不需要实例等支(将了语言的功能和应用场date.setMonth JSON.stringify化,直接通过调用持多种日期格式和时区操对象转换为景Math JavaScript其方法作字符串)两个方JSON法数组方法进阶方法描述返回值forEach为数组中的每个元素执行一次回undefined调函数map创建一个新数组,其结果是对每新数组个元素调用回调函数的结果filter创建一个新数组,包含通过回调新数组函数测试的所有元素find返回数组中满足回调函数的第一元素值或undefined个元素的值reduce对数组中的每个元素执行回调函累积结果数,将结果汇总为单个返回值some测试数组中是否至少有一个元素布尔值通过回调函数的测试every测试数组中的所有元素是否都通布尔值过回调函数的测试includes判断数组是否包含一个指定的值布尔值字符串高级API子字符串提取字符串操作模板字符串应用提供了多种提取子字符串的常用字符串处理方法包括引入的模板字符串提供了更强大的JavaScript ES6方法字符串处理能力•splitseparator将字符串分割成•substringstartIndex,数组•多行字符串使用反引号可以直接创提取指定索引范围内的建多行字符串,保留换行符endIndex•replacesearchValue,字符•substrstartIndex,length从指replaceValue替换匹配的子字符•变量插值使用${expression}语法定索引开始提取指定长度的字符(不串在字符串中嵌入表达式推荐使用)•toLowerCase和•标签模板允许自定义字符串的处理•slicestartIndex,endIndex类似toUpperCase转换大小写方式,用于创建特殊的字符串格式,但支持负索引(从字符substring•trim删除字符串两端的空白字符串末尾计数)•charAtindex或str[index]获取例如世界let name=;let greeting指定位置的字符例如你好,!let str=Hello;=`${name}`;返回str.substring1,3el异常处理机制块trytry块包含可能引发异常的代码如果发生异常,try块中的剩余代码将不会执行,控制权会立即转移到catch块例如try{let result=riskyOperation;processResultresult;}块catchcatch块接收try块抛出的异常对象,并处理异常情况catch参数(通常命名为e或error)包含有关异常的信息,如message属性描述错误消息例如catcherror{console.error发生错误+error.message;}块finallyfinally块包含无论try块是否抛出异常都会执行的代码通常用于清理资源,如关闭文件、释放锁等finally块即使在try或catch块中有return语句,也会执行例如finally{closeConnection;}抛出异常throw语句用于手动抛出异常可以抛出任何值,但通常抛出Error对象或其子类的实例,以提供更详细的错误信息例如if!isValid{throw newError无效的输入数据;}作用域规则全局作用域函数作用域•在所有函数和块之外声明的变量属•在函数内声明的变量只在该函数内于全局作用域部可见•全局变量可以在代码的任何地方访•每次调用函数都会创建一个新的作问用域•在浏览器环境中,全局变量会成为•内部函数可以访问外部函数的变量对象的属性(作用域链)window•过多的全局变量可能导致命名冲突•使用var声明的变量遵循函数作用和内存泄漏域规则块级作用域•ES6引入的let和const关键字创建块级作用域变量•块级作用域限定在花括号{}内•if语句、for循环、while循环等都会创建块级作用域•块级作用域提供了更精细的变量生命周期控制变量提升与暂时性死区变量提升是JavaScript中的一个重要概念,指的是变量和函数声明在编译阶段被移动到作用域顶部的行为使用var声明的变量会被提升,但初始化不会被提升,因此在声明前访问变量会得到undefined值函数声明也会被完全提升,包括函数体,因此可以在声明前调用函数但函数表达式不会被提升,除非赋值给var变量(此时只有变量声明被提升)ES6引入的let和const不存在传统意义上的提升虽然它们的声明也会在编译阶段处理,但在声明前访问这些变量会导致引用错误从变量进入作用域到声明语句执行前的这段区域称为暂时性死区(Temporal DeadZone,TDZ)模块化基础()ES6导出模块内容导入模块内容模块化系统比较模块使用关键字导出变量、函数、使用关键字从其他模块导入内容可以除了原生模块系统外,生态还ES6export importES6JavaScript类等有两种主要的导出方式命名导出和默导入命名导出、默认导出或两者的组合有其他模块化方案(使CommonJS Node.js认导出命名导出可以导出多个内容,使用具语句必须在模块顶层,不能在条件语句用)、(实现)和(通import AMDRequireJS UMD体名称引入;默认导出只能有一个,导入时可或函数内使用用模块定义)它们各有优缺点,适用于不同以使用任意名称场景例如import{PI,square}from./math.js;例如export constPI=
3.14159;(命名导出)(导入命名导出)或import Userfrom ES6模块系统的优势在于它是语言标准的一部或export defaultclass User{}(默认导出)./user.js;(导入默认导出)分,支持静态分析、树摇(tree-shaking)优化,并且具有异步加载能力解构赋值()ES6数组解构数组解构允许一次性将数组中的值赋给多个变量使用方括号语法,变量的顺序与数组元素的顺序相对应例如let[a,b,c]=[1,2,3];将a赋值为1,b赋值为2,c赋值为3数组解构支持默认值、跳过元素和剩余元素语法例如let[a,,...rest]=[1,2,3,4];将a赋值为1,跳过2,rest为[3,4]对象解构对象解构允许基于属性名从对象中提取值使用花括号语法,变量名必须与对象的属性名匹配例如let{name,age}={name:张三,age:25};将name赋值为张三,age赋值为25可以使用不同的变量名接收属性值,格式为propName:varName例如let{name:userName}={name:张三};将userName赋值为张三嵌套解构解构赋值可以处理嵌套的数组和对象例如let{address:{city}}={address:{city:北京}};将city赋值为北京类似地,可以解构嵌套数组let[[a,b]]=[[1,2]];嵌套解构在处理复杂数据结构(如API返回的JSON数据)时特别有用,可以直接提取深层嵌套的值参数解构函数参数可以使用解构语法,直接从传入的对象或数组中提取需要的值例如function greet{name,age}{console.log`你好,${name},你${age}岁了!`;};参数解构使函数调用更加灵活,不必关心参数的顺序,并且可以只提取需要的属性展开运算符应用数组复制1使用展开运算符可以创建数组的浅拷贝例如let original这种方法比使用=[1,2,3];let copy=[...original];数组合并或方法更简洁2slice concat展开运算符可以方便地合并多个数组例如let merged=这比使用方法更直观,[...arr1,...arr2,...arr3];concat对象属性展开3尤其是当需要合并多个数组时展开运算符也适用于对象,可以复制对象的属性例如let这是创建对象浅拷贝的简便方法clone={...original};对象属性合并4可以合并多个对象的属性例如let merged=如果有同名属性,后面对象的属性会覆{...obj1,...obj2};函数参数展开5盖前面的可以将数组元素作为单独参数传递给函数例如等同于Math.max...numbers;Math.max1,2,3常用操作DOM元素选择内容操作样式和属性•getElementById通过ID获取单个元素•innerHTML获取或设置元素的HTML内容•style属性直接设置元素的内联样式•getElementsByClassName通过类名•textContent获取或设置元素的文本内容•classList添加、删除和切换类名获取元素集合(不解析HTML)•getAttribute获取元素的特定属性值•getElementsByTagName通过标签名•value获取或设置表单元素的值•setAttribute设置元素的属性值获取元素集合•createElement创建新的HTML元素•removeAttribute删除元素的属性•querySelector使用CSS选择器获取第•appendChild将元素添加到父元素的末一个匹配元素尾•querySelectorAll使用CSS选择器获取所有匹配元素事件监听与处理32主要事件类型事件注册方式常见的事件类型包括点击(click)、鼠标移动推荐使用addEventListener方法添加事件监(mouseover/mouseout)、键盘听器,它允许为同一事件添加多个处理函数,(keydown/keyup)、表单并支持冒泡和捕获阶段(submit/change/input)、加载(load/DOMContentLoaded)等4事件对象属性事件处理函数接收的事件对象(e)包含许多有用的属性,如target(触发事件的元素)、preventDefault(阻止默认行为)、stopPropagation(阻止事件冒泡)等定时器和异步机制setTimeoutsetTimeout函数用于在指定的毫秒数后执行一次回调函数它返回一个定时器ID,可以使用clearTimeout取消定时器例如let timerId=setTimeout={console.log延迟执行},1000;setIntervalsetInterval函数用于按照指定的周期(以毫秒计)重复执行回调函数它返回一个间隔器ID,可以使用clearInterval取消间隔器例如let intervalId=setInterval={console.log重复执行},1000;回调地狱当多个异步操作需要按顺序执行时,可能会出现嵌套回调的情况,这种代码结构称为回调地狱(Callback Hell)它使代码难以阅读和维护,容易导致错误解决方案解决回调地狱的方法包括使用Promise链式调用、async/await语法糖、模块化和命名函数等这些技术可以使异步代码更加线性和可读基础Promise概念Promise是异步编程的一种解决方案,代表一个尚未完成但预期将来会完成的操作Promise创建Promise使用构造函数创建,接收一个执行器函数,包含和参数Promise Promiseresolve reject状态Promise有三种状态(进行中)、(已成功)和(已失3Promise pendingfulfilled rejected败)链式调用Promise使用处理成功,处理错误,支持链式调用避免回调.then.catch嵌套语法async/await函数声明表达式async await关键字用于声明异步函数,使函数关键字只能在函数内使用,用async awaitasync始终返回即使函数返回的是普于等待完成它会暂停当前Promise Promise通值,也会被包装成例如函数的执行,直到解决或Promise asyncPromise数拒绝例如async function getData{returnlet result=await据等同于会等待返回的;}functiongetData{return fetchData;fetchData数据完成后,将结果赋值给Promise.resolve;}Promise result顺序与并行错误处理多个表达式会按顺序执行,这在某些await在函数中,可以使用结构async try/catch情况下可能不是最优的使用捕获表达式中的错误这使得异步代await或可以实现Promise.all Promise.race3码的错误处理变得更加简单和直观例多个的并行处理例如Promise let如try{let data=await[result1,result2]=awaitriskyOperation;}catch errorPromise.all[operation1,{console.errorerror;}operation2];浏览器常见用法API现代浏览器提供了丰富的,增强了应用的功能存储包括(持久化数据,无过期时间)和(会话期间有API WebAPI localStoragesessionStorage效)两者都提供、、和等方法,用于存储和检索键值对数据setItem getItemremoveItem clear是现代的替代品,提供了更强大的网络请求功能基本用法Fetch APIAJAX fetchurl.thenresponse=response.json.thendata=返回,支持语法,可设置请求方法、头部、请求体等console.logdata FetchPromise async/await其他实用浏览器包括(获取用户位置)、(操作浏览历史)、(绘图)、(后台线API GeolocationAPI HistoryAPI CanvasAPI WebWorkers程)、(通知)等这些共同构成了现代应用开发的基础Notification APIAPI Web综合案例数据处理与交互课程总结与进阶建议专业应用开发框架与库的选择、项目架构、测试与部署高级编程概念设计模式、函数式编程、性能优化核心语言特性对象、原型、异步编程、模块化基础语法变量、数据类型、运算符、流程控制。
个人认证
优秀文档
获得点赞 0