# JavaScriptDemo-209 **Repository Path**: nieps/java-script-demo-209 ## Basic Information - **Project Name**: JavaScriptDemo-209 - **Description**: 209 java javascript案例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-04-13 - **Last Updated**: 2023-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: 前端 ## README # JavaScript笔记 ## 介绍 node.js express js 是一种基本语言 网页组成: * html 标记语言 组织页面结构 * css 样式规则 * javascript 能够做哪些工作? * 做验证 与服务器交互 * 做表单验证 * 动态更改页面内容 * 数据绑定与渲染 ES6 ## 基础 js是弱类型语言 ,声明变量时,无需指明变量的类型,它的类型由值来决定。 区别: * undefined 有变量没有值 * is not defined 变量不存在 js允许使用双字节定义变量 ## 数据类型 分为两大类: ### 基本类型 * 数字类型 Number > 方法: > > 开发时直接使用parseInt parseFloat > > ![image-20230413150620557](E:/workspace/JavaScriptDemo/assets/image-20230413150620557.png) > > 常用原型方法: > > * toFixed 指定小数点的位数 四舍五入 > * toPrecision 指定整数和小数的位数 四舍五入 > * toLocaleString 格式化数字 > > 引用类型 对象: ----json对象 对象是一组属性的无序集合 ,每个属性都是名值对组成,名称是字符串类型,可以是空字符串,值可以是任何js类型 ## 对象 ![image-20230414085818741](E:/workspace/JavaScriptDemo/assets/image-20230414085818741.png) ## 数组 队列: FIFO * push shift * unshift pop 栈: FILO * push pop * unshift shift ## 回调函数 将函数做为参数传递的函数,就是回调函数 ## 断点调式 * 在指定的代码处 加上关键字 debugger * 在开发者工具中的 source找到源文件 单击回断点 ## 闭包 闭包就是能够读取其他函数内部变量的函数。 ## 箭头函数 ![image-20230414160146818](E:/workspace/JavaScriptDemo/assets/image-20230414160146818.png) 作用: * 简化函数的定义 * 当我们使用箭头函数的时候,箭头函数(词法作用域)会默认帮我们绑定外层 this 的值,所以在箭头函数中 this 的值和外层的 this 是一样的。 java中for each: for(String s : 数组) ## DOM BOM * DOM document object model > 将html元素转换为dom对象 * BOM 浏览器对象模型 ## 本地存储 ![image-20230417173654596](E:/workspace/JavaScriptDemo/assets/image-20230417173654596.png) ## 事件对象 * type 事件类型 * target 触发事件的目标对象 * currentTarget 绑定事件的目标对象 面试:如何防止表单重复提交 * onload: 代表页面加载完毕才执行(图片 css js ) * **`DOMContentLoaded`** 当纯 HTML 被完全加载以及解析时,**`DOMContentLoaded`** 事件会被触发 ## ajax Ajax即**A**synchronous **J**avascript **A**nd **X**ML(异步JavaScript和XML) * 同步请求 提交请求到服务器 等待服务器返回结果 这个过程一直处于等待状态,不做任何操作 from表单 * 异步请求 ### XMLHttpRequest ### 同源策略 要求 协议 域名 端口号 三者一致认为是同源,允许访问 端口号: 默认的http协议 80 https协议:443 > 1. http://www.baidu.com/index.html https://www.baidu.com/index.html 不是 > 2. http://www.baidu.com http://zhidao.baidu.com 不是 > 3. http://www.baidu.com:433/index.html http://www.baidu.com:8080/index.html [跨源资源共享*cors*](http://www.baidu.com/link?url=V_X_xb5Non9rBlopCoRYgyB3zeok1BMPkMgNAUJyQndf52Ob2gETM3KH6PwM1xArdyeknDFCODP2hlNorpd0wa) ### readyState ![image-20230418093422784](E:/workspace/JavaScriptDemo/assets/image-20230418093422784.png) ### http状态 1. 1 [消息](https://baike.baidu.com/item/HTTP状态码/5053660?fr=aladdin#1) 2. 2 [成功](https://baike.baidu.com/item/HTTP状态码/5053660?fr=aladdin#2) 3. 3 [重定向](https://baike.baidu.com/item/HTTP状态码/5053660?fr=aladdin#3) 4. 4 [请求错误](https://baike.baidu.com/item/HTTP状态码/5053660?fr=aladdin#4) 5. 5 [服务器错误](https://baike.baidu.com/item/HTTP状态码/5053660?fr=aladdin#5) 常用状态码: * 200 ok 代表服务器请求成功 * 4开头的都是客户端错误 > * 400 Bad Request 通常是请求参数有问题 > * [403 Forbidden](https://baike.baidu.com/item/403 Forbidden/5101750?fromModule=lemma_inlink) > * 404 Not Found 请求的地址找不到 要么写错了要么地址不存在 > * 405 Method Not Allowed 请求的方法与服务器方法不一致 * 5开头的 是服务器错误 > * 500 Internal Server Error ## promise 问题: 使用回调函数接收异步结果, 回调地狱: 回调函数嵌套回调函数 promise对象可以保证 异步操作有一个最终的结果(成功或失败) ### 三种状态 - *待定(pending)*:初始状态,既没有被兑现,也没有被拒绝。 - *已兑现(fulfilled)*:意味着操作成功完成。 - *已拒绝(rejected)*:意味着操作失败。 对象的创建: new Promise(callback) callback做为Promise对象 的参数,它是一个回调函数,访函数最多接收两个参数: * 第一个参数 resolve 代表的是成功的回调函数 * 第二个参数 reject 代表的是失败的回调函数 实例方法: * then() 接收一个回调函数做为参数 该函数有一个参数代表成功的结果 ,同时该方法返回一个Promise对象 * catch() 接收一个回调函数做为参数, 该函数有一个参数代表失败的结果 * `finally()` 无论最终结果是成功或失败,都执行该方法 静态方法: * Promise.resolve() 方法返回一个以给定值解析后的 [`Promise`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise) 对象 * **`Promise.reject()`** 方法返回一个带有拒绝原因的 `Promise` 对象。 ## async/await异步函数 `async` 和 `await` 关键字让我们可以用一种更简洁的方式写出基于 [`Promise`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise) 的异步行为,而无需刻意地链式调用 `promise`。 * async 声明异步函数的 > 使用方法: > > 1. 在关键字function 前面直接使用 如 async function check() {} > 2. 在箭头函数 ()前加上 async ()=>{} * `await` 操作符用于等待一个 [`Promise`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise) 兑现并获取它兑现之后的值。它只能在[异步函数](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function)或者[模块](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Modules)顶层中使用。 ## axios Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 模块: 一个js文件就是一个模块 ## 特性 - 从浏览器中创建 [XMLHttpRequests](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) - 从 node.js 创建 [http](http://nodejs.org/api/http.html) 请求 - 支持 [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API - 拦截请求和响应 - 转换请求数据和响应数据 - 取消请求 - 自动转换 JSON 数据 - 客户端支持防御 [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) ### cdn restful风格api设计: 资源名称一样,由不同的动词来表示你想干什么 * get 代表读取资源 /user * post 代表的是新建资源 /user * delete 代表删除 /user * put 代表的是修改 /user ### 请求配置参数 * url 接口地址 * method 请求方法 get put post delete * baseURL 服务器地址 * headers 请求头 * params get请求的参数对象 会将参数拼接在url上 * data post put 请求 封装的参数对象 * timeout 超时时间 要求:后端要求每个请求 都会提供公共参数 * userid * 编码... ## 模块 ### node.js 模块 > ### CommonJS模块 > > CommonJS规划中有两个基本理念: > > - 用户可以通过requeire函数,引入本地文件系统中的某个模块 > - 通过exports和module.exports两个特殊变量,对外发布能力 ### es6 模块 > ### 为什么要有模块系统 > > 一门好的语言一定要有模块系统,因为它能为我们解决工程中遇到的基本需求 > > - 把功能进行模块拆分,能够让代码更具有条理,更容易理解,能够让我们单独开发并测试各个子模块的功能 > - 能够对功能进行封装,然后再其他模块能够直接引入使用,提高复用性 > - 实现封装:只需要对外提供简单的输入输出文档,内部实现能够对外屏蔽,减少理解成本 > - 管理依赖关系:好的模块系统能够让开发者根据现有的第三方模块,轻松的构建其他模块。另外模块系统能够让用户简单引入自己想要的模块,并且把依赖链上的模块进行引入 > > 刚开始的时候,JavaScript并没有好的模块系统,页面主要是通过多个script标签引入不同的资源。但是随着系统的逐渐复杂化,传统的script标签模式不能满足业务需求,所以才开始计划定义一套模块系统,有AMD,UMD等等 > > NodeJS是运行在后台的一门服务端语言,相对于浏览器的html,缺乏script标签来引入文件,完全依赖本地文件系统的js文件。于是NodeJS按照CommonJS规范实现了一套模块系统 > > 2015年ES2015规范发布,到了这个时候,JS才对模块系统有了正式标准,按照这种标准打造的模块系统叫作ESM系统,他让浏览器和服务端在模块的管理方式上更加一致 export和import 模块是一个js文件,模块与模块之间相互引用,被引用 的模块要暴露接口,引用模块要 导入你需要的接口 ### 方式一 * 使用export { v1,v2....} 暴露接口 * 使用 import {v1,v2...} from '模块' 引入接口 ### 方式二 * 使用export default {} 暴露一个默认接口 一个模块只能有一个默认的接口 ,但同时还可以使用export {} 暴露其它接口 * 使用import 自定义名称 from '模块名' (注意:这里不需要{} ,引入的名称可以自定义) * import 自定义名称,{要导入的接口} from '模块名' ## 解构赋值 * 对象解构赋值 const {变量名,.....}=对象 会将对象的中与变量名一样的属性 值赋值给变量 * 数组解构 const [x,y,...other]=数组 x取第一个元素,y取第二个,other取剩余的组成的新的数组 # Node.js Node.js 是一个开源与跨平台的 JavaScript 运行时环境。(类似于JVM) Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核) ### 命令 ~~~shell # 查看node.js版本 node -v #查看npm 版本 npm -v #查看npm 帮助 npm --help #查看 安装源 npm config get registry #设置安装源 npm config set registry=服务器地址 #安装模块 npm install 模块名 #淘宝镜像 #方法一安装cnpm 代替npm 命令 npm install -g cnpm --registry=https://registry.npmmirror.com #方法二 替换npm 服务器地址 npm config set registry=https://registry.npmmirror.com/ #查看服务器地址 npm config get registry ~~~ ### 安装包 ~~~shell #安装 默认安装 的模块是最新的版本 npm install 模块名 #install 可以简化成 i 如 npm i 模块名 #查看模块可用的版本号 npm view 模块名 #安装指定版本的模块 npm i 模块名@版本号 #全局安装 npm i -g 模块名 #查看当前项目中 安装 的本地模块 npm list #查看全局安装的模块 npm list -g #安装所有的依赖 npm i ~~~ ### 卸载 ~~~shell #卸载 npm uninstall 模块名 #简化 uninstall === unlink, remove, rm, r, un npm rm 模块名 ~~~ ### 更新命令 ~~~sh npm update 模块名 ~~~ ### 查找模块 ~~~shell #查找 npm search 模块名 ~~~ ### 快速删除node_module ~~~shell #全局安装模块 rimraf npm i -g rimraf #使用 删除模块 进入node.js项目目录 执行 rimraf node_modules ~~~ ### 网站查找模块 [https://www.npmjs.com/](https://www.npmjs.com/) ### package.json ![image-20230419174818072](E:/workspace/JavaScriptDemo/assets/image-20230419174818072.png) 创建package.json文件 ~~~shell #创建项目 npm init ~~~ ### 清除缓存 ~~~shell npm cache clean --force ~~~ ### 模块 * ESM es模块 export 导出接口 import 导入接口 * node.js commonjs规范 exports或module.exports require导入 > exports是一个变量,默认指向 module.exports 这个对象的地址 > > 你可以通过在exports对象上增加属性暴露接口(在exports增加属性其它就是在module.exports上增加), > > 但是不能将exports指向一个新的对象 (如果指向新的对象,那么exports不再指向module.exports,就不能再暴露接口 ) > > //通过require引用模块 它会将引入的模块中的module.exports对象赋值给变量 如下 > const user=require("./user.js") > > ![image-20230420092842409](E:/workspace/JavaScriptDemo/assets/image-20230420092842409.png) # Vue ## 介绍 Vue (发音为 /vjuː/,类似 **view**) 是一款用于**构建用户界面**的 JavaScript 框架。(渐进式的框架 ) 并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 * 声明响应式对象 对象的内容变化 页面 跟着自动渲染 * 组件化 (一段html css js的组合 ) 复用 渐进式的框架 * 项目中一部分功能开始使用vue * 使用vue中提供的一部分功能 javascript进行dom操作------jQuery (js类库) 前端框架: * vue 作者 中国人 借鉴了google Angular * react * Angular ## 版本 ### Vue2 vue2 采用选项式配置 在vue2中 Vue是一个构造函数,创建实例如下: ~~~javascript const app=new Vue({ el:"#app",//vue渲染的模板 data:{ name:"张三" } }); ~~~ ### Vue3 * 选项式 * 组合式 #### 全局构建版本 该版本的所有顶层 API 都以属性的形式暴露在了全局的 `Vue` 对象上。 ~~~javascript const {createApp}=Vue; ~~~ #### 使用 ES 模块构建版本 ~~~javascript import {createApp} from './js/vue.esm-browser.js' ~~~ ## 应用 * 容器 所有vue选项或语法 只有在容器内才能使用 * 创建vue实例 createApp ({}) * 将容器与实例关联起来 调用vue实例的mount()方法 ,挂载到容器上 组件实例选项在vue实例上,都有对应的 $选项名称, 定义响应对象时避免使用$开头 ## 选项 * data 是一个函数 返回一个普通 的对象 ,由vue转换为响应式对象 (代理对象) > 访问时,可以通过vue实例 app.$data.属性名 或者app.属性名 ## 方法 * app.mount() 将应用实例挂载在一个容器元素中。 里面接收一个参数 DOM 元素或一个 CSS 选择器 * setup 函数中返回的对象会暴露给模板和组件实例。其他的选项也可以通过组件实例来获取 `setup()` 暴露的属性 钩子:回调函数 ## SAP应用 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。 ## 基础语法 ### 模板语法 响应式: * ref(val) =======> {"value":val} 基本数据类型 包装成响应对象 在模板中会自动解包,可以直接访问响应式对象 * reactive() 将引用类型转换为响应式对象 接收 引用类型: object 数组 ,不能包装基本类型 模板插值: {{}} html : v-html指令 ### 属性绑定 * v-bind:属性名="响应对象的属性" * 简化 (省略v-bind) :属性="响应对象的属性" * 绑定多个属性: v-bind="响应式对象" 响应式对象是含有多个属性的对象 布尔类型的属性绑定:渲染时如果为true会增加该属性,为false会移除该属性. ### 计算属性 * 只读的 computed() 该函数接收一个 无参的 带有返回值的函数 * 可写 的 computed() 接收一个对象做为参数 该对象有两个属性: get set 都 是函数 **计算属性值会基于其响应式依赖被缓存**,如果响应式对象没有发生变化,计算属性不会执行,直接取 缓存 ### 样式绑定 * 对象绑定 {样式名:布尔表达式} 表达式为true样式生效 * 三元表达式 "exp?样式1:样式2 " (建议写在 [exp?样式1:样式2]) * 数组绑定 :class="[响应式对象]" 动态绑定样式 ### 条件 渲染 v-if与v-show的区别: * v-if 是惰性的 条件成立 才会插入html , v-show始终会渲染html,只是通dispaly属性来切换 显示 * v-if 初始开销比较小 ,v-show初始开销大 * 如果是频繁切换,v-if是不段的插入与销毁,效率低; 而v-show只是切换状态 适合频繁切换 * v-if有 else elseif 多重判断 ,v-show只有一种情况 * v-if可以在template上使用,而v-show不可以 ### 列表渲染 遍历数组 * item in items item是迭代变量 items是数组 * (item,index) in items index 代表循环的索引 遍历对象: * value in object value迭代变量,代表对象属性的值 object是对象 * (value,name) in object value是值 name属性名 * (value,name,index) index索引 key属性: 数据在发生变化时,为了提高效率,vue默认是就地更新,但是如果渲染的是组件或复杂结构,通常设置一个唯一的key值,告诉vue数据变化时重新渲染 ### 事件 语法: * v-on:事件类型= "方法" * @事件类型="方法" 方法传递: * 传递方法名 如果方法定义时有参数,参数类型为事件对象 * 调用方法 (调用时没有传参) 而方法定义时有参数,参数的值为undefined * 调用方法时,可以显式的传递事件参数 $event ### 表单绑定 v-model: 属性绑定与事件相结合 * 复选框 > 1. 只有一个复选框 v-model绑定的是一个布尔类型的值 > 2. 多个复选框 v-model绑定的是一个数组类型的 - 文本类型的 `` 和 `