# 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
>
> 
>
> 常用原型方法:
>
> * toFixed 指定小数点的位数 四舍五入
> * toPrecision 指定整数和小数的位数 四舍五入
> * toLocaleString 格式化数字
>
>
引用类型
对象: ----json对象
对象是一组属性的无序集合 ,每个属性都是名值对组成,名称是字符串类型,可以是空字符串,值可以是任何js类型
## 对象

## 数组
队列: FIFO
* push shift
* unshift pop
栈: FILO
* push pop
* unshift shift
## 回调函数
将函数做为参数传递的函数,就是回调函数
## 断点调式
* 在指定的代码处 加上关键字 debugger
* 在开发者工具中的 source找到源文件 单击回断点
## 闭包
闭包就是能够读取其他函数内部变量的函数。
## 箭头函数

作用:
* 简化函数的定义
* 当我们使用箭头函数的时候,箭头函数(词法作用域)会默认帮我们绑定外层 this 的值,所以在箭头函数中 this 的值和外层的 this 是一样的。
java中for each: for(String s : 数组)
## DOM BOM
* DOM document object model
> 将html元素转换为dom对象
* BOM 浏览器对象模型
## 本地存储

## 事件对象
* 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

### 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

创建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")
>
> 
# 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绑定的是一个数组类型的
- 文本类型的 `` 和 `