还剩27页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
传智播客教学课件JavaScript第一章简介与发展历程JavaScript年JavaScript诞生于1995年,最初由Netscape的Brendan Eich设计开发,原名19951LiveScript,后更名为JavaScript以搭上当时Java的热度JavaScript诞生,最初在从简单的表单验证工具发展至今,JavaScript已成为世界上最流行的编程语Netscape Navigator浏览年言之一,支撑着现代互联网的交互体验器中实现21997ECMAScript1标准发布,年JavaScript语言标准化20093ECMAScript5发布,引入严格模式等特性年42015ECMAScript6ES6发布,至今带来类、模块等重大更新5的核心价值JavaScript浏览器交互的灵魂语言动态网页与单页应用的基石作为唯一被所有浏览器原生支持的脚从DOM操作到Ajax异步通信,再到现本语言,JavaScript实现了用户与网代前端框架React、Vue,JavaScript页的动态交互,为静态HTML注入生命使复杂的单页应用成为可能力推动的服务器端革命Node.js第二章基础语法JavaScript掌握JavaScript的基础语法是构建复杂应用的第一步我们从变量声明、数据类型和基本运算符开始,打下坚实的编程基础变量声明数据类型运算符与表达式var+-*/%函数作用域,存在变量提升基本类型String、Number、Boolean、算术运算符let Null、Undefined、SymbolES
6、=====!=!==块级作用域,不存在变量提升比较运算符BigIntES2020const块级作用域,声明常量,不可重新引用类型Object、Array、Function、赋值Date、RegExp等代码演示变量声明与类型转换与的作用域差异隐式类型转换的坑与防范var let//var的函数作用域function varTest{var x=1;if true{var x=2;//同一个//隐式类型转换示例console.log5+3;//53(字符串连接)console.log5-3;变量console.logx;//2}console.logx;//2}//let的块级作用域function//2(数字减法)console.log5==5;//true(值相等)console.log5===5;//letTest{let x=1;if true{let x=2;//不同变量console.logx;//false(类型不同)//防范措施//
1.使用严格相等===而非宽松相等==//
2.显式类型转换2}console.logx;//1}console.logNumber5+3;//8console.logString5+3;//53第三章流程控制与函数条件语句循环语句函数//if语句if条件{//代码块}else if条件//for循环for初始化;条件;更新{//代码块}////函数声明function函数名参数{//代码块{//代码块}else{//代码块}//switch语句while循环while条件{//代码块}//do-while循return结果;}//函数表达式const函数名=switch表达式{case值1://代码块break;环do{//代码块}while条件;function参数{//代码块return结果;};//箭头case值2://代码块break;default://函数const函数名=参数={//代码块return代码块}结果;};真实案例实现一个简单的计算器函数代码拆解与逻辑分析/***简单计算器函数*@param{number}a-第一个数字*@param{number}b-第二个数字*@param{string}operation-运算类型*@returns{number}计算结果*/function calculatora,b,operation=+{//参数operation=+默认值示例//确保输入为数字a=Numbera;b=Numberb;//检查参数是否为有效数字if isNaNa函数参数默认值表示如果不传递该参数,默认使用加法Number||isNaNb{return请提供有效的数字;}//根据不同操作执行计算switch operation{case类型转换使用确保输入被转换为数字类型+:return a+b;case-:return a-b;case*:return a*b;case/:•参数验证检查输入是否为有效数字if b===0{return除数不能为零;}return a/b;default:return不支持的•错误处理当除数为零时返回错误信息操作;}}switch使用语句根据操作类型执行不同计算使用示例第四章对象与数组对象的创建与访问数组的基本操作//对象字面量const person={name:张三,age:25,greet:function{return`你好,我是//创建数组const fruits=[苹果,香蕉,橙子];//访问元素console.logfruits
[0];//苹果//修改元素${this.name}`;}};//访问对象属性console.logperson.name;//张三console.logperson[age];//fruits
[1]=梨子;console.logfruits;//[苹果,梨子,橙子]//添加元素fruits.push葡萄;//25console.logperson.greet;//你好,我是张三//构造函数创建对象function Personname,age末尾添加fruits.unshift草莓;//开头添加//删除元素fruits.pop;//删除末尾元素fruits.shift;//{this.name=name;this.age=age;this.greet=function{return`你好,我是删除开头元素${this.name}`;};}const person2=new Person李四,30;深浅拷贝代码演示对象属性动态增删与数组方法详解对象属性的动态操作数组常用方法//动态添加属性const user={name:王五};user.age=28;user[email]=wangwu@example.com;//删除属性delete user.age;//检查属性是否存在console.lognamein user;//trueconsole.loguser.hasOwnPropertyemail;//true//获取所有键const keys=Object.keysuser;console.logkeys;//[name,email]第五章操作与事件处理DOM结构与节点类型常用操作DOM DOMAPIDOM DocumentObject Model是HTML和XML文档的编程接口,将网页表示为节点树//获取元素const el1=document.getElementByIdmyId;const el2=document.querySelector.myClass;const els=•文档节点Document整个HTML文档document.querySelectorAlldiv;//创建元素const newEl=•元素节点Element HTML标签document.createElementdiv;newEl.textContent=新元素•文本节点Text标签内的文本内容;newEl.className=new-class;//添加/删除元素parentEl.appendChildnewEl;parentEl.removeChildchildEl;//修改内容•属性节点Attribute元素的属性和属性el.textContent=新文本;el.innerHTML=HTML内容•注释节点Comment HTML注释;el.setAttributedata-id,123;el.style.color=red;事件绑定与事件冒泡机制互动演示点击按钮改变页面内容事件监听器的多种写法对比阻止事件默认行为与事件委托//HTML属性(不推荐)button//阻止默认行为onclick=handleClick点击/button//DOM0级document.getElementByIdlink.addEventList事件处理enerclick,event=document.getElementByIdbtn
1.onclick={event.preventDefault;//阻止链接跳转function console.log链接被点击但未跳转;};//事件委{托示例//不必为每个列表项单独添加事件监听器document.getElementByIdoutput.textContent document.getElementByIdtodoList.addEvent=使用DOM0级事件处理;};//DOM2级事件处理Listenerclick,event={//检查是否点(推荐)击了列表项if event.target.tagName===LIdocument.getElementByIdbtn
2.addEventList{//切换completed类enerclick,function event.target.classList.togglecompleted;{console.log任务状态已更改;}};document.getElementByIdoutput.textContent=使用DOM2级事件处理;};//箭头函数写法document.getElementByIdbtn
3.addEventListenerclick,={document.getElementByIdoutput.textContent=使用箭头函数;};第六章新特性详解(上)ES6ECMAScript6ES6发布于2015年,带来了JavaScript历史上最重大的语法和特性更新,大幅提升了开发效率和代码质量模板字符串解构赋值扩展运算符//旧写法var name=张三;var greeting=你好,//数组解构const[a,b]=[1,2];console.loga;+name+!;//ES6模板字符串const name=张三//1console.logb;//2//对象解构const{name,;const greeting=`你好,${name}!`;//多行字符串age}={name:李四,age:30};console.logname;const multiLine=`第一行第二行第三行`;//李四console.logage;//30//嵌套解构const{address:{city}}={address:{city:北京}};console.logcity;//北京代码演示用模板字符串优化代码可读性模板字符串优化生成解构赋值在函数参数中的应用HTML//旧写法function createUserCarduser{return++user.name++年龄:+user.age++邮箱:+user.email++user.isVIPVIP:+;}//ES6模板字符串写法function createUserCarduser{return`div class=user-cardh2${user.name}/h2p年龄:${user.age}/p p邮箱:${user.email}/p${user.isVIPspan class=vip-badgeVIP/span:}/div`;}第七章新特性详解(下)ES6异步编程基础的块级作用域箭头函数与绑定Promise let/const thisPromise是ES6引入的异步编程解决方案,用于处理异步操作的结果,解决回调地狱ES6引入了块级作用域变量声明方式,解决var的变量提升和污染问题箭头函数是函数表达式的简写形式,没有自己的this,this值继承自外围作用域问题//let声明的变量{let x=10;//x仅在此块内可用}//此处x不可访//基本用法const promise=new Promiseresolve,reject=问//const声明的常量const PI=
3.14159;//PI不能被重新赋值//PI={//异步操作if操作成功{resolve结果;}else3;//报错//但const对象的属性可以修改const user={name:张三{reject错误;}};promise.thenresult={//处理成};user.name=李四;//允许user={};//报错功结果}.catcherror={//处理错误}.finally={//无论成功失败都会执行};实战案例用实现异步数据请求Promise链式调用与错误捕获/***使用Promise封装的网络请求函数*@param{string}url-请求地址*@returns{Promise}返回Promise对象Promise*/function fetchDataurl{return newPromiseresolve,reject={//创建XMLHttpRequest对象const xhr=new XMLHttpRequest;//配置请求xhr.openGET,url;xhr.responseType=json;//处理加载完成事件xhr.onload=function{if xhr.status=200xhr.status300{//请求成功,解析响应数据resolvexhr.response;}else{//请求失败,返回错误信息rejectnew Error`请求失败:${xhr.status}`;}};//处理网络错误xhr.onerror=function{rejectnew Error网络错误;};//发送请求xhr.send;};}第八章模块化与代码组织模块系统模块系统CommonJS ES6主要用于Node.js环境,使用require和module.exports现代浏览器原生支持,使用import和export语法//导出模块math.jsfunction adda,b{return a+b;}function//导出模块math.jsexport functionadda,b{return a+subtracta,b{return a-b;}module.exports={add,b;}export functionsubtracta,b{return a-b;}//默认导出exportsubtract};//导入模块const math=default functionmultiplya,b{return a*b;}//导入模块importrequire./math;console.logmath.add5,3;//8multiply,{add,subtract}from./math.js;console.logadd5,3;//8console.logmultiply5,3;//15模块化的优势•代码封装,避免全局变量污染•依赖关系清晰,提高代码可维护性•按需加载,提高应用性能•团队协作更高效,便于分工传智播客课程模块化案例电商网站前端项目采用模块化开发•UI组件模块复用的界面元素•API接口模块统一管理后端请求•工具函数模块通用业务逻辑第九章高级特性JavaScript闭包与作用域链原型与原型链闭包是函数和声明该函数的词法环境的组合,允许函数访问其外部作用域中的变量JavaScript是基于原型的语言,对象通过原型链实现继承function createCounter{let count=0;//私有变量return function{count++;//访问外部函数作用域return//构造函数function Personname{this.name=name;}//原型方法Person.prototype.greet=function{return`你好,我是count;};}const counter=createCounter;console.logcounter;//1console.logcounter;//2console.logcounter;${this.name}`;};const person1=new Person张三;console.logperson
1.greet;//你好,我是张三//原型链//3console.logperson
1.__proto__===Person.prototype;//trueconsole.logPerson.prototype.__proto__===Object.prototype;//true闭包的应用场景•创建私有变量关键字•实现函数工厂this•实现回调和事件处理this的值取决于函数调用方式,不是在声明时确定的代码演示闭包实现私有变量闭包实现私有变量原型链继承与方法共享//使用闭包创建带有私有状态的对象function createBankAccountinitialBalance{//私有变量,外部无法直接访问let balance=initialBalance;//返回包含公共方法的对象return{//查询余额getBalance:function{return balance;},//存款方法deposit:functionamount{if amount=0{return存款金额必须为正数;}balance+=amount;return`存款成功,当前余额:${balance}`;},//取款方法withdraw:functionamount{if amount=0{return取款金额必须为正数;}if amountbalance{return余额不足;}balance-=amount;return`取款成功,当前余额:${balance}`;}};}//创建银行账户const account=createBankAccount1000;console.logaccount.getBalance;//1000console.logaccount.deposit500;//存款成功,当前余额:1500console.logaccount.withdraw200;//取款成功,当前余额:1300//无法直接访问私有变量console.logaccount.balance;//undefined第十章错误处理与调试技巧错误类型SyntaxError语法错误,代码无法解析ReferenceError引用不存在的变量TypeError操作无效,类型不匹配RangeError数值超出有效范围URIError URI编解码函数参数无效EvalError eval函数使用不当语句try...catchtry{//尝试执行的代码const result=riskyOperation;console.logresult;}catch error{//处理错误的代码console.error捕获到错误:,error.message;}finally{//无论是否发生错误都会执行console.log操作完成;}//自定义错误class ValidationErrorextends Error{constructormessage{supermessage;this.name=ValidationError;}}//抛出自定义错误function validateUseruser{if!user.name{throw newValidationError用户名不能为空;}}调试技巧Chrome DevTools技巧•断点设置在源代码面板中点击行号•条件断点右键行号,设置触发条件•Watch表达式监控变量变化真实案例调试异步代码中的错误异步函数中的异常捕获使用简化错误处理async/await//错误方式Promise中的错误未被捕获function fetchData{fetchhttps://api.example.com/data.thenresponse={if!response.ok{throw newError网络请求失败;}returnresponse.json;}.thendata={//处理数据processDatadata;//可能出错的函数};//错误!这里无法捕获Promise链中的错误console.log数据获取完成;}//正确方式添加catch处理程序function fetchDataCorrect{fetchhttps://api.example.com/data.thenresponse={if!response.ok{throw newError网络请求失败;}return response.json;}.thendata={processDatadata;}.catcherror={console.error发生错误:,error;//显示用户友好的错误信息showErrorToUser数据加载失败,请稍后重试;}.finally={console.log数据获取过程完成;};}代码演示用实现简单的网络请求Fetch使用获取数据本地存储数据的增删改查Fetch API/***获取用户数据并展示在页面上*/function fetchUsers{//显示加载状态document.getElementByIdloading.style.display=block;document.getElementByIderror.style.display=none;//发起请求fetchhttps://jsonplaceholder.typicode.com/users.thenresponse={//检查响应状态if!response.ok{throw newError`HTTP错误:${response.status}`;}return response.json;}.thenusers={//处理数据displayUsersusers;//隐藏加载状态document.getElementByIdloading.style.display=none;}.catcherror={console.error获取用户数据失败:,error;//显示错误信息document.getElementByIdloading.style.display=none;document.getElementByIderror.style.display=block;document.getElementByIderror.textContent=`获取数据失败:${error.message}`;};}/***将用户数据渲染到页面*/function displayUsersusers{const userList=document.getElementByIduserList;userList.innerHTML=;users.forEachuser={const li=document.createElementli;li.className=user-item;li.innerHTML=`第十二章项目实战应用开发Todo List需求分析与功能拆解代码结构设计与模块划分核心功能todo-app/├──index.html#主HTML文件├──css/│└──styles.css#样式文件├──js/│├──app.js#应用入口│├──•添加新任务models/││└──todo.js#任务数据模型│•标记任务完成/未完成├──views/││├──todoView.js#视图渲染│•删除任务│└──formView.js#表单处理│├──•编辑任务内容controllers/││└──todoController.js#控制器│└──services/│└──扩展功能storageService.js#本地存储服务└──assets/#图标和其他资源•任务分类(工作、个人等)•设置任务优先级•任务过滤与搜索•本地存储,刷新不丢失用户体验•响应式设计,适配各种设备•拖拽排序功能采用MVC架构模式•动画效果增强交互Model定义任务数据结构和操作方法•主题切换(明/暗模式)View负责DOM渲染和用户交互项目演示实现增删改查与本地存储同步核心数据模型与存储事件绑定与数据渲染//models/todo.jsclass TodoModel{constructor{this.todos=this.loadFromStorage;}//从本地存储加载任务//views/todoView.jsclass TodoView{constructor{this.todoList=document.getElementByIdtodoList;loadFromStorage{const storedTodos=localStorage.getItemtodos;return storedTodosJSON.parsestoredTodos:this.newTodoForm=document.getElementByIdnewTodoForm;this.todoInput=document.getElementByIdtodoInput;[];}//保存到本地存储saveToStorage{localStorage.setItemtodos,JSON.stringifythis.todos;}//添加新任务this.filterBtns=document.querySelectorAll.filter-btn;}//渲染任务列表renderTodostodos,filter=alladdTodotitle,category=默认{const newTodo={id:Date.now,title,category,completed:false,{this.todoList.innerHTML=;//根据过滤条件筛选任务let filteredTodos=todos;if filter===activecreatedAt:new Date};this.todos.pushnewTodo;this.saveToStorage;return newTodo;}//切换任务完成状{filteredTodos=todos.filtertodo=!todo.completed;}else iffilter===completed{filteredTodos=态toggleCompleteid{this.todos=this.todos.maptodo={if todo.id===id{return{...todo,todos.filtertodo=todo.completed;}//创建DOM元素filteredTodos.forEachtodo={const li=completed:!todo.completed};}return todo;};this.saveToStorage;return this.todos;}//删除document.createElementli;li.className=`todo-item${todo.completedcompleted:}`;li.dataset.id=任务deleteTodoid{this.todos=this.todos.filtertodo=todo.id!==id;this.saveToStorage;return todo.id;li.innerHTML=`${todo.title}this.todos;}//更新任务内容updateTodoid,updates{this.todos=this.todos.maptodo={if todo.id===id{return{...todo,...updates};}return todo;};this.saveToStorage;return this.todos;}}第十三章性能优化与安全JavaScript性能瓶颈分析与优化技巧防止与攻击基础XSS CSRF跨站脚本攻击操作优化XSSDOM攻击者在网页中注入恶意脚本,当其他用户浏览该页面时执行•减少DOM查询,缓存DOM引用//不安全直接插入用户输入element.innerHTML=userInput;//安全•使用DocumentFragment批量操作DOM转义HTML特殊字符function escapeHTMLstr{return•使用CSS类切换而非直接操作样式str.replace//g,.replace//g,•避免强制重排reflow,合并样式修改.replace//g,.replace//g,;}element.textContent=userInput;//安全方式代码执行效率•减少全局变量,防止命名空间污染•使用节流throttle和防抖debounce优化事件处理•避免内存泄漏,及时清理事件监听器•优化循环结构,减少嵌套,提前缓存length资源加载优化跨站请求伪造CSRF•脚本懒加载和按需加载攻击者诱导用户点击链接或访问页面,在用户不知情的情况下提交操作•使用async/defer属性加载非关键脚本//防止CSRF的策略//
1.使用CSRF令牌const csrfToken=•减少HTTP请求,合并资源getCSRFToken;fetch/api/update,{method:POST,headers:•利用浏览器缓存机制{Content-Type:application/json,X-CSRF-Token:csrfToken},body:JSON.stringifydata};//
2.验证请求来源//在服务器端检查Referer和Origin头真实案例传智播客学员项目优化分享初始问题分析张同学电商网站项目存在的问题•页面加载时间超过5秒•滚动商品列表时明显卡顿•搜索功能响应缓慢•移动端体验较差优化措施实施
1.使用虚拟滚动技术处理长列表,一次仅渲染可见区域商品
2.图片懒加载,减少初始加载资源
3.将频繁执行的搜索函数添加防抖处理
4.使用IntersectionObserver优化滚动监听
5.实现请求合并与缓存策略优化成效对比68%95%75%页面加载提速滚动流畅度内存占用减少从
5.2秒降至
1.7秒FPS从平均15提升到58大量商品页面内存使用优化通过性能优化,张同学的项目不仅用户体验大幅提升,还在校企合作项目评比中获得了优秀作品奖,被合作企业直接录用为前端开发工程师第十四章未来趋势与生态圈与的关系前端框架简介TypeScript JavaScriptTypeScript是JavaScript的超集,添加了静态类型系统和面向对象编程React的特性,可编译为纯JavaScript由Facebook开发的组件化UI库,使用虚拟DOM和JSX语法,强调的优势TypeScript组件复用和单向数据流•静态类型检查,减少运行时错误特点组件化、虚拟DOM、大型生态系统•提供接口、泛型等高级类型功能•增强IDE支持,提供更好的代码补全和提示Vue•更容易维护大型项目代码渐进式JavaScript框架,易于上手,结合了React和Angular的优点,采用模板语法示例TypeScript特点双向绑定、模板语法、轻量级//TypeScript代码示例interface User{id:number;name:string;age:number;//可选属Angular性}function greetUseruser:User:string{return`你好,${user.name}!`;}//类型错误会在Google维护的完整前端框架,使用TypeScript开发,提供完整解编译时被捕获const user={id:1,name:张三决方案};console.loggreetUseruser;特点依赖注入、完整MVC、企业级应用与全栈开发趋势Node.js•Node.js让JavaScript可运行于服务器端,实现前后端语言统一•全栈JavaScript开发逐渐成为主流,降低技术栈切换成本•Serverless架构兴起,使前端开发者能更专注于业务逻辑•Deno等新一代JavaScript运行时的出现,提供更好的安全性和开发体验传智播客学习路径推荐JavaScript第一阶段基础周1JavaScript4掌握语法基础、DOM操作、事件处理等核心概念•每日练习简单DOM操作、表单验证•项目实战个人简历网页、简单计算器•配套资源《JavaScript高级程序设计》前6章第二阶段进阶周2JavaScript5深入理解闭包、原型、异步编程等高级特性•每日练习手写Promise、实现继承•项目实战天气查询应用、购物车功能•配套资源《你不知道的JavaScript》系列第三阶段现代前端框架周36学习Vue或React等主流框架,掌握组件化开发•每日练习组件开发、状态管理•项目实战在线商城、社交媒体应用•配套资源框架官方文档、实战视频第四阶段全栈开发周45学习Node.js后端开发,实现前后端一体化•每日练习API开发、数据库操作•项目实战完整全栈应用,包含用户认证、数据存储•配套资源《Node.js实战》、线上辅导传智播客提供全方位学习支持视频教程、直播课堂、1对1辅导、就业指导学员可根据自身基础和目标,灵活调整学习进度和重点学员故事分享深圳学员红豆杉个月入门前端成功就业毕老师授课风格与学员反馈1之前在传统行业工作,收入低且没有发展听朋友介绍来到传智播客学习•深入浅出复杂概念用生活化比喻讲解JavaScript刚开始担心编程太难,但老师循序渐进的教学让我很快找到了学习方•实战为王每个知识点都有对应的实际案例法通过每天8小时的刻苦练习,一个月内掌握了基础,三个月后成功入职互联网•针对性强根据不同学员背景调整教学方式公司,薪资翻了一倍!•耐心细致对学员问题不厌其烦解答黑马程序员与传智播客的教学优势红豆杉同学从零基础开始,通过系统学习和大量实战练习,现已成为团队的骨干开发者,负责公司核心项目的前端开发工作•14年IT培训经验,累计培养超过30万名IT人才•与3000+企业合作,了解一线企业需求•全程项目驱动教学,理论结合实践•阶段测试与及时反馈,确保学习效果•就业服务团队提供简历指导、面试辅导结语开启你的编程之旅JavaScript持续学习,实践为王掌握,拥抱未来互JavaScript联网时代编程能力来自不断实践建议每天编写代码,参与开源项目,解决实际问题保持学JavaScript已成为互联网的通用语言,从前端习新技术的热情,跟踪JavaScript生态系统的到后端,从桌面到移动,从物联网到人工智发展能,JavaScript的应用无处不在记住编程是一门手艺,熟能生巧没有捷掌握JavaScript,就掌握了连接数字世界的钥径,只有不断打磨自己的技能匙,为你的职业发展打开无限可能传智播客与你同行,助力成长无论你是初学者还是希望提升的开发者,传智播客都将提供专业的课程和全方位的支持我们不仅教授技术,更注重培养解决问题的能力加入我们的学习社区,与志同道合的伙伴一起成长,开启你的JavaScript之旅!。
个人认证
优秀文档
获得点赞 0