diff --git "a/06 \351\231\210\345\277\227\344\274\237/20231205 JS\350\277\233\351\230\2662.md" "b/06 \351\231\210\345\277\227\344\274\237/20231205 JS\350\277\233\351\230\2662.md" new file mode 100644 index 0000000000000000000000000000000000000000..a149104fd52e3d4af8aaffd003b3ac07747a1f6b --- /dev/null +++ "b/06 \351\231\210\345\277\227\344\274\237/20231205 JS\350\277\233\351\230\2662.md" @@ -0,0 +1,374 @@ +#### 一.深入对象 + +**构造函数**:是一种特殊的函数,主要用来初始化对象 + +使用场景:==多个对象有相同属性,封装成一个构造函数== + +~~~ javascript +// 创建一个构造函数,首字母要大写 +function Pig(uname,age){ + this.uname = uname + this.age = age +} +// 创建对象 +const p1 = new Pig('佩奇',6) +const p2 = new Pig('乔治',4) +~~~ + +实例成员:通过构造函数创建的对象称之为实例对象,==实例对象中==的属性和方法称之为==实例成员==(实例属性和实例方法) + +- 为构造函数传入参数,创建结构相同但值不同的对象 +- 构造函数创建的实例对象彼此独立互不影响 + +静态成员:构造函数的属性和方法被称为静态成员(静态属性和静态方法) + +- 静态成员只能构造函数访问 +- 静态方法中 this 指向构造函数 + +~~~ javascript +// 静态成员 +function Pig(name){ + this.name = name +} +Pig.eyes = 2 // 静态属性 +Pig.sayHi = function(){ + log(this) +} +Pig.sayHi() // 指向构造函数 +log(Pig.eyes) // 2 +~~~ + +#### 二.内置构造函数 + +其实字符串。数值。布尔等基本数据类型也都有专门的构造函数,称为包装类型 + +**Object** + +object 是内置的构造函数,用于创建普通对象 + +三个常用静态方法: + +- **Object.keys** 获取对象中的所有属性(键),返回数组 +- **Object.keys** 获取对象中的所有属性值(值),返回数组 +- **Object.assign** 常用于对象拷贝 + +~~~ javascript +const o = {uname: 'pink',age: 18} +log(Object.keys(o)) // [uname,age] +log(Object.values(o)) // ['pink',18] +// 拷贝 +const oo = {} +Object.assign(oo,o) // 将 o 对象拷贝给 oo 对象 +// 给对象追加属性 +Object.assign(o,{sex: '男'}) +log(o) // [uname: 'pink',age: 18,sex: '男'] +~~~ + +**Array** + +Array 是内置构造函数,用于创建数组 + +常用实例方法: + +| 方法 | 作用 | 说明 | +| ----------- | -------- | ---------------------------------------------------- | +| **forEach** | 遍历数组 | 不返回数组,经常用于==查找遍历数组元素== | +| **filter** | 过滤数组 | ==返回新数组==,返回==筛选满足条件==的数组元素 | +| **map** | 迭代数组 | ==放回新数组==,返回==处理之后==的数组元素 | +| **reduce** | 累计器 | 返回累计处理的结果,经常用于求和等 | +| **find** | 查找元素 | 返回符合条件的第一个数组元素值,没则有返回undefined | +| **every** | 检查数组 | 检查数组中所有元素,都满足某个条件,返回 true或false | +| **some** | 检查数组 | 检查数组中所有元素,有元素满足条件,返回 true或false | +| **concat** | 合并数组 | 合并两个数组,返回一个新数组 | +| **sort** | 排序数组 | 对原数组单元值进行排序 | +| **reverse** | 反转数组 | 将数组反转 | + +~~~ javascript +// 数组 reduce 方法 +const arr = [1,5,8] +//1. 没有初始值 +const total = arr.reduce(function(prev,current){ + return prev + current //上一次的值 + 当前的值 +}) +log(total) // 14 +//2. 有初始值 +const total = arr.reduce(function(prev,current){ + return prev + current //上一次的值 + 当前的值 +}.10) +log(total) // 24 +//3. 箭头函数写法 +const total = arr.reduce((prev,current) => prev + current, 10) +~~~ + +案例:有一个员工数组对象,计算当月支出多少薪资 + +~~~ javascript +const arr =[ + { + uname: '张三', + salary: 10000 + }, { + uname: '李四', + salary: 10000 + }, { + uname: '王五', + salary: 10000 + } +] +//一定要有初始值,否则默认第一个对象为初始值 +const total = arr.reduce((prev,current) => prev + current.salary, 0) +log(total) // 30000 +~~~ + +静态方法 **Array.from(数组)** 将伪数组转换为真数组 + +~~~ javascript +const lis = document.querySelectorAll('ul li') +const liArr = Array.from(lis) +~~~ + +**String** + +常见实例方法1: + +| 方法 | 说明 | +| --------------------------------------- | --------------------------------------------- | +| **split(’分隔符’)** | 将字符串转换为数组,和 join() 相反 | +| **substring(起始索引,结束索引)** | 截取字符串 | +| **startswith(检查字符串,检测开始索引)** | 检测是否以某字符开头,返回布尔值,endwith相反 | +| **includes(搜索的字符串,位置索引)** | 判断一个字符串是否包含某个字符 | + +**Number** + + **toFixed()** 设置保留小数位的长度 + +~~~ javascript +const num = 10.923 +log(num.toFixed(1)) //10.9 +log(num.toFixed(2)) //10.92 +log(num.toFixed()) //11 四舍五入 +~~~ + + + +### 作业 + +**综合案例** + +~~~ html + +~~~ + +**购物车** + +~~~ html + +~~~ \ No newline at end of file diff --git "a/06 \351\231\210\345\277\227\344\274\237/20231206 Ajax\351\242\204\344\271\240.md" "b/06 \351\231\210\345\277\227\344\274\237/20231206 Ajax\351\242\204\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..813fa70062225013e49a33076458cc657e641d9e --- /dev/null +++ "b/06 \351\231\210\345\277\227\344\274\237/20231206 Ajax\351\242\204\344\271\240.md" @@ -0,0 +1,100 @@ +### Ajax + +```html +//test.josn的代码 +{ + "reply":"我收到啦!" +} + +const xhr = new XMLHttpRequest(); +xhr.onreadystatechange = () => { + if (xhr.readyState !== 4) return; + if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { + console.log(xhr.responseText); + } +}; +xhr.open('GET', 'text.json', true); +xhr.send(null); + +// “replay” : {"我收到啦!",“”} +``` + +1.创建xhr对象 + +```js +const xhr = new XMLHttpRequest(); +``` + +2.利用onreadystatechange属性,封装一个函数,用于监听 readyState的变化。 + +```js +xhr.onreadystatechange = () => { +if (xhr.readyState !== 4) return; +if (xhr.status >= 200 && xhr.status < 300 ){ + console.log(xhr.responseText); + } +}; +``` + +2.1在xhr对象执行收发数据的时候,它会经历五种状态: + + +| Ajax状态码 | 状态 | +| ---------- | ------------------------------------------------------------ | +| 0 | (**未初始化**)未启动 | +| 1 | (**启动**)已经调用 open(),但尚未调用 send() | +| 2 | (**发送**)发送状态,已经调用 send(),但尚未接收到响应 | +| 3 | (**接收**)已经接收到部分响应数据 | +| 4 | (**完成**)已经接收到全部响应数据,而且已经可以在浏览器中使用了 | + +2.2判断HTTP状态码是否为200-299 + +Ajax状态码为4是不够的,这仅仅表明收到服务器端响应的全部数据,并不能保障数据都是正确的。 + +所以,我们还需要判断HTTP的状态码,判断xhr对象的status属性值是否在200到300之间(200-299 用于表示请求成功) + +```js +if (xhr.status >= 200 && xhr.status < 300 ){ + console.log(xhr.responseText); +} +``` + +所以要想请求成功完成,必须要满足上面两个条件。 + +3.准备发送请求 + +```js +xhr.open('GET','text.json', true); +``` + +参数1:选用"GET"或者“POST”的请求方式 + +参数2:发送请求的地址 + +参数3:是否异步 + +4.发送请求 + +```js +xhr.send(null) +``` + + 注意:send() 的参数是通过请求体携带的数据,而GET请求是通过请求头携带数据的,所以要把send的参数置为null + +```html + +``` +