let和const关键字
| let | let用来声明变量(可变的量) 变量不能重复声明 但是你可以重新赋值 let只能在当前作用域中进行修改变化 作用域外边的不受影响 【以后项目声明变量都写let就可以了】 |
|---|---|
| const | const是用来声明常量(不变的量) 【声明数组和对象的时候使用const】 值不能修改的量称为常量 一定要赋初始值 一般常量使用大写(潜规则) 常量的值不能修改 也是块级作用域 对于数组和对象的元素修改,不算对常量的修改,不会报错 |
解构赋值
| 解构赋值可以对数组或者是对象进行提取值 并且对变量进行赋值 这种形式称之为解构赋值 | |
|---|---|
| 1 数组解构 【用得少】 | 只要等号两边的模式相同 我们就可以对等号左边的变量进行赋值 例如 let [a,b,c]=[1,2,3] console.log(a) const F4 = [‘小沈阳’, ‘刘能’, ‘赵四’, ‘宋小宝’]; let [xiao, liu, zhao, song] = F4; |
| 2 对象解构【用得多】 | 对象解构与数组解构不太一样 数组中的元素是按照顺序来排列 变量的取值由它的位置决定 对象的属性没有顺序 变量必须与属性名一致 才能进行赋值 例如: let {name, age}={name: “zhangsan”, age: 15} console.log(name) console.log(age) const zhao = { name:’赵本山’, age:’68’, xiaopin:function () { console.log(“卖拐”); } }; let { name, age, xiaopin } = zhao; console.log(name); console.log(age); console.log(xiaopin); xiaopin(); let { xiaopin } = zhao; xiaopin() |
| 3 字符串解构 | 字符串也可以解构赋值 这是因为 字符串被转换成了一个类似数组的对象 例如 const [a,b,c]=”123” console.log(a) console.log(b) console.log(c) |
| 4 函数参数解构 | 函数的参数可以使用解构赋值 例如 function demo([x,y]) { console.log(x,y) } demo([1,2]) |
| 5 默认值 | 解构赋值允许指定默认值 例如: let [a,b=1] = [1] console.log(b) |
模板字符串
| 声明 | let str=我也是一个字符串哦!;console.log(str,typeof str); |
|---|---|
| 内容中可以直接出现换行符 | let str = <ul><br /> <li>沈腾</li><br /> <li>玛丽</li><br /> <li>魏翔</li><br /> <li>艾伦</li><br /> </ul>; |
| 变量拼接 | let lovest=’魏翔’; let out= ${lovest}是我心目中最搞笑的演员!!; |
箭头函数 =>
| 1.this是静态的,this始终指向函数声明时所在作用域下的this值 | function getName( ){ console.log(this.name); } let getName2=( ) =>{ console.log(this.name); } |
|---|---|
| 2.不能作为构造实例化对象 | let Person =(name,age)=>{ this.name=name; this.age=age; } let me=new Person(‘xiao’,30); console.log(me); //报错 |
| 3.不能使用arguments变量 | let fn=()=>{ console.log(arguments); } fn(1,2,3); //报错 |
| 4.箭头函数的简写 | 1)省略小括号,当形参有且只有一个的时候 const 变量名=a=> { } 2)省略花括号,当代码体只有一条语句的时候,此时return必须省略,而且语句的执行结果就是函数的返回值 let pow = n =>nn; console.log(pow(8)); *需求:从数组中返回偶数的元素 cost result=arr.filter(item=>item%2===0); console.log(result); |
| (适合于this无关的回调,定时器、数组的方法回调) (不适合与this有关的回调,事件回调、对象的方法) |
参数默认值
| 1.形参初始值,具有默认值的参数,一般位置要靠后(潜规则) | function add(a,c=10,b) { return a+b+c; } let result=add(1,2); console.log(result); |
|---|---|
| 2.与解构赋值结合 | function connect({ host = “127.0.0.1”, username,passname, port }) { console.log(host); console.log(username); console.log(password); console.log(port); } connect({ host: ‘atguigu.com’, username: ‘root’, password: ‘root’, port: 3306 }) |
rest参数
| rest参数必须要放到参数最后 | function fn(a,b,…args) { console.log(a); console.log(b); console.log(args); } fn(1,2,3,4,5,6); |
|---|---|
spread扩展运算符
| 声明一个函数 | const tfboys=[‘易烊千玺’,’王源’,’王俊凯’]; |
|---|---|
| 声明一个数组 | function chunwan(){ console.log(arguments); } chunwan(…tfboys); |
| 拓展运算符的应用 const kuaizi=[‘王太利’,’肖央’]; const fenghuang=[‘曾毅’,’玲花’]; |
|
| 数组的合并 | //const zuixuanpingguo=kuaizi.concat(fenghuang); const zuixuanpingguo=[…kuaizi,…fenghuang]; console.log(zuixuanpingguo); |
| 数组的克隆 | const sanzhihua=[‘E’,’G’,’M’]; const sanyecao=[…sanzhihua]; console.log(sanyecao); |
| 将伪数组转为真正的数组 | const divs=document.querySelectorAll(‘div’); const divArr=[…divs]; console.log(divArr); |
Symbol
| 一种新的数据类型,表示独一无二的值,类似字符串 1)Symbol值是唯一的,用来解决类名冲突的问题 2)Symbol值不能与其他数据进行运算 3)Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名 |
|
|---|---|
| 1.创建Symbol | let s = Symbol(‘你好’); let s2 = Symbol(‘你好’); s不等于s2 ———————————————————————- Symbol.for创建 let s3 = Symbol.for(‘你好’); let s4 = Symbol.for(‘你好’); s3===s4 ———————————————————————- USONB //you are so niubility 数据类型总结 u undefind s string symbol o object n null number b boolean |
| 2.给对象添加Symbol类型属性 | // 第一种方法—————————————————————- let game = { name: “LOL”, }; let methods = { up: Symbol(), down: Symbol() }; game[methods.up] = function () { console.log(“我可以改变形状”); } game[methods.down] = function () { console.log(“我可以快速下降”); } console.log(game); // 第二种方法—————————————————————- let youxi = { name: “狼人杀”, [Symbol(‘say’)]: function () { console.log(“我可以发言”); }, [Symbol(‘zibao’)]: function () { console.log(“我可以自爆”); } } console.log(youxi); |
Symbol 内置值
| 除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。 | |
| Symbol.hasInstance | 当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法 class Person { static Symbol.hasInstance { console.log(param); console.log(“我被用来检测类型了”); return false; } } let o = {}; console.log(o instanceof Person); |
| Symbol.isConcatSpreadable | 等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。 // 控制值是否可以被展开 const arr = [1, 2, 3]; const arr2 = [4, 5, 6]; arr2[Symbol.isConcatSpreadable] = false; console.log(arr.concat(arr2)); |
| Symbol.unscopables | 该对象指定了使用with关键字时,哪些属性会被with环境排除。 |
| Symbol.match | 当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。 |
| Symbol.replace | 当该对象被str.replace(myObject)方法调用时,会返回该方法的返回值。 |
| Symbol.search | 当该对象被str.search (myObject)方法调用时,会返回该方法的返回值 |
| Symbol.split | 当该对象被 str.split (myObject)方法调用时,会返回该方法的返回值。 |
| Symbol.iterator | 对象进行 for…of循环时,会调用Symbol.iterator方法,返回该对象的默认遍历器 |
| Symbol.toPrimitive | 该对象被转为原始类型的值时,会调用这个方法,返回 |
| symbol.toStringTag | 在该对象上面调用toString方法时,返回该方法的返回值 |
| Symbol.species | 创建衍生对象时,会使用该属性 |
迭代器
| 迭代器(lterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署lterator接口,就可以完成遍历操作。 |
|---|
| 工作原理 a)创建一个指针对象,指向当前数据结构的起始位置 b)第一次调用对象的next方法,指针自动指向数据结构的第一个成员 c)接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员 d)每调用next方法返回一个包含value和 done 属性的对象 |
| const xiyou = [‘唐僧’, ‘孙悟空’, ‘猪八戒’, ‘沙僧’]; // 打印的是键值 for (let v of xiyou) { console.log(v); } // 打印的是键名 for (let v in xiyou) { console.log(v); } ——————————————————————————————— let iterator = xiyouSymbol.iterator; // 调用对象的next方法 console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next()); |
| 注:需要自定义遍历数组的时候,要想到迭代器 |
///////////////////////////迭代器自定义遍历对象/////////////////////////// 声明一个对象const banji = {name: "终极一班",stus: ['小明','小宁','小田','小花'],[Symbol.iterator]() {let index = 0;let _this = this;return {next: function () {if (index < _this.stus.length) {const result = { value: _this.stus[index], done: false };index++;return result;} else {return { value: undefined, done: true };}}}}}// 遍历这个对象for (let v of banji) {console.log(v);}
生成器
生成器的函数参数
| |
| function* gen(arg) {
console.log(arg);
let one = yield 111;
console.log(one);
let two = yield 222;
console.log(two);
let three = yield 333;
console.log(three);
}
//执行获取迭代器对象
let iterator = gen(‘AAA’);
console.log(iterator.next());
//next方法可以传入实参
console.log(iterator.next(‘BBB’));
console.log(iterator.next(‘CCC’));
console.log(iterator.next(‘DDD’)); | |
|
|
生成器函数实例1
|
| —- |
| //异步编程 文件操作 网络操作(ajax,request) 数据库操作
//1s后控制台输出111 2s后控制台输出222 3s后输出 333 |
////////回调地狱////////////////////////////////////////////////////////////setTimeout(() => {console.log(111);setTimeout(() => {console.log(222);setTimeout(() => {console.log(333);}, 3000);}, 2000);}, 1000);///////////解决了回调地狱////////////////////////////////////////////////////function one() {setTimeout(() => {console.log(111);iterator.next();}, 1000)}function two() {setTimeout(() => {console.log(222);iterator.next();}, 2000)}function three() {setTimeout(() => {console.log(333);iterator.next();}, 3000)}function* gen() {yield one();yield two();yield three();}let iterator = gen();iterator.next();
生成器函数实例2
| | —- | | //模拟获取 用户数据 订单数据 商品数据 |
function getUsers() {setTimeout(() => {let data = '用户数据';iterator.next(data);}, 1000);}function getOrders() {setTimeout(() => {let data = '订单数据';iterator.next(data);}, 1000);}function getGoods() {setTimeout(() => {let data = '用商品数据';iterator.next(data);}, 1000);}function*gen() {let users = yieldgetUsers();let orders = yieldgetOrders();let goods = yieldgetGoods();}let iterator = gen();iterator.next();
promise【重要】
| Promis是ES6引入的异步编程的新解决方案。语法上 Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。解决回调地狱 1) Promise 构造函数: Promise (excutor) { } 2) Promise.prototype.then方法 3) Promise.prototype.catch方法 |
|---|
Promise基本语法
//实例化Promise对象const p = new Promise(function (resolve, reject) {setTimeout(function () {// let data = '数据库中的用户数据';// resolve(data);let err = '获取数据失败';reject(err);}, 1000);});//调用promise对象中的then方法p.then(function (value) {console.log(value);}, function (reason) {console.error(reason);})
Promise读取文件
| 1.引入fs模块 | const fs=require(‘fs’); |
|---|---|
| 2.调用方法读取文件 | fs.readFile(‘./论文.md’,(err,data)=>{ if(err) throw err; console.log(data.toString( )); }); |
| 3.使用Promise 封装 | const p = newPromise(function (resolve, reject) { fs.readFile(“.论文.md”, (errr, data) => { //判断如果失败 if (err) reject(err); //如果成功 resolve(data); }); }); p.then(function (value) { console.log(value.toString()); }, function (reason) { console.log(“读取失败!!!”); }); |
Promise读取多个文件
//地域回调的方法-------------------------------------------------------------------------// 引入fs模块const fs = require('fs');fs.readFile('./论语第一则.md', (err, data1) => {fs.readFile('./论语第二则.md', (err, data2) => {fs.readFile('./论语第三则.md', (err, data3) => {let result = data1 + '\r\n' + data2 + '\r\n' + data3;console.log(result);});});});//使用promise实现------------------------------------------------------------------------const p = new Promise((resolve, reject) => {fs.readFile("./论语第一则.md", (err, data) => {resolve(data);});});p.then(value => {return new Promise((resolve, reject) => {fs.readFile("./论语第二则.md", (err, data) => {resolve([value, data]);});})}).then(value => {return new Promise((resolve, reject) => {fs.readFile("./论语三则.md", (err, data) => {//压入value.push(data);resolve(value);});})}).then(value => {console.log(value.join('\r\n'));})
Promise封装AJAX
//原生ajax
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var data = xhr.responseText; // 后台接口返回的后台数据
}
}
xhr.open("get", url, true) // true表示异步请求 false表示同步请求
xhr.send()
//接口地址:https://api.apiopen.top/getJoke
const p = new Promise((resolve, reject) => {
// 1.创建对象
const xhr = new XMLHttpRequest();
// 2.初始化
xhr.open("GET", "https://api.apiopen.top/getJoke");
// 3.发送
xhr.send();
// 4.绑定事件,处理响应结果
xhr.onreadystatechange = function () {
//判断
if (xhr.readyState === 4) {
//判断响应状态码 200-299
if (xhr.status >= 200 && xhr.status < 300) {
//表示成功
console.log(xhr.response);
} else {
//如果失败
console.error(xhr.status);
}
}
}
})
//指定回调
p.then(function (value) {
console.log(value);
}, function (reason) {
console.error(reason);
});
Promise-then方法
// 1.创建 promise对象
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('用户数据');
// reject('出错了');
}, 1000)
});
//调用 then 方法 then方法返回的结果是 Promise对象对象返回状态由回调函数的执行结果决定
//1.如果回调函数中返回的结果是, 非promise 类型的属性,状态为成功,返回值为对象的成功值
const result = p.then(value => {
console.log(value);
// 1.非 promise 类型的数据
// return 'iloveyou';
// 2.是promise 对象
}, reason => {
console.warn(reason);
});
console.log(result);
//链式调用
p.then(value => {
}).then(value => {
});
Promise-chatch方法
//创建Promise对象
const p = new Promise((resolve, reject) => {
setTimeout(() => {
//设置p对象的状态为失败,并设置失败的值
reject("出错了!");
}, 1000)
})
// p.then(function (value) { }, function (reason) {
// console.error(reason);
// });
p.catch(function (reason) {
console.warn(reason);
})
Set集合
| 声明一个set | let s =new Set( ); let s2 =new Set([‘喜羊羊’, ‘美羊羊’, ‘懒羊羊’, ‘灰太狼’]); |
|---|---|
| 元素个数 | console.log(s2.size); |
| 添加新的元素 | s2.add(‘红太狼’); |
| 删除元素 | s2.delete(‘灰太狼’); |
| 检测 | console.log(s2.has(‘沸羊羊’)); |
| 清空 | s2.clear( ); |
| 循环 | for (let v of s2) { console.log(v); } |
| 集合实践 let arr = [9, 3, 4, 5, 5, 3, 3, 1, 0, 8]; let arr2 = [4, 5, 6, 7, 8]; |
|
| 数组去重 | let result = […new Set(arr)]; console.log(result); |
| 交集 | let result = […new Set(arr)].filter(item => { let s2 = new Set(arr2); if (s2.has(item)) { return true; } else { return false; } }); console.log(result); |
| 交集简化 | let result2 = […new Set(arr)].filter(item => new Set(arr2).has(item)); console.log(result2); |
| 并集 | let union = […new Set([…arr, …arr2])]; console.log(union); |
| 差集 | let diff = […new Set(arr)].filter(item => !(new Set(arr2).has(item))); console.log(diff); |
Map方法
| 声明Map | let m = new Map( ); |
|---|---|
| 添加元素 |
m.set(‘name’, ‘尚硅谷’); m.set(‘change’, function ( ) { console.log(“我们可以改变你!!”); }); let key = { achool:’ATGUIGU’ }; m.set(key, [‘北京’, ‘上海’, ‘深圳’]); |
| 返回长度 | console.log(m.size); |
| 删除 | m.delete(‘name’); |
| 获取 | console.log(m.get(‘change’)); console.log(m.get(key)); |
| 清空 | m.clear(); |
| 遍历 | for (letvofm) { console.log(v); } console.log(m); |
class类
///////////////////es5构造函数实现的语法///////////////////////////////////////
************语法糖***********
//手机
function Phone(brand, price) {
this.brand = brand;
this.price = price;
}
//添加方法
Phone.prototype.call = function () {
console.log("我可以打电话!!");
}
//实例化对象
let Huawei = new Phone('华为', 5999);
Huawei.call();
console.log(Huawei);
//////////////////class///////////////////////////////////////////////////////
class Phone {
constructor(brand, price) {
this.brand = brand;
this.price = price;
}
call() {
console.log("我可以打电话!!");
}
}
let onePlus = new Phone("1+", 1999);
console.log(onePlus);
get 和 set
//get对对象的动态属性封装,set用来判断是否合法,
class Phone {
get price() {
console.log('价格属性被读取了');
return 'iloveyou';
}
set price(newVal) {
console.log('价格属性被修改了');
}
}
// 实例化对象
let s = new Phone();
console.log(s.price);
s.price = 'free';
类的静态成员
function Phone() {
}
Phone.name = '手机';
Phone.change = function () {
console.log("我可以改变世界");
}
Phone.prototype.size = '5.5inch';
let nokia = new Phone();
console.log(nokia.name);
console.log(nokia.size);
/////////////////////////////////////////////////////
class Phone {
//静态对象
static name = '手机';
static change() {
console.log("我可以改变世界");
}
}
let nokia = new Phone();
console.log(nokia.name); //undefined
console.log(Phone.name);
类继承
es5构造函数继承
//父级构造函数
//手机
function Phone(brand, price) {
this.brand = brand;
this.price = price;
}
Phone.prototype.call = function () {
console.log('我可以打电话');
}
//智能手机
function SmartPhone(brand, price, color, size) {
Phone.call(this, brand, price);
this.color = color;
this.size = size;
}
//设置子级构造函数的原型
SmartPhone.prototype = new Phone;
SmartPhone.prototype.constructor = SmartPhone; //矫正
SmartPhone.prototype.photo = function () {
console.log('我可以拍照');
}
SmartPhone.prototype.playGame = function () {
console.log('我可以玩游戏');
}
const chuizi = new SmartPhone('锤子', 2499, '黑色', '5.5inch')
console.log(chuizi);
类继承
class Phone {
//构造方法
constructor(brand, price) {
this.brand = brand;
this.price = price;
}
//父类成员属性
call() {
console.log("我可以打电话!!");
}
}
class SmartPhone extends Phone {
//构造方法
constructor(brand, price, color, size) {
super(brand, price); //Phone.call(this,brand,price)
this.color = color;
this.size = size;
}
photo() {
console.log("拍照");
}
playGame() {
console.log("玩游戏");
}
}
const xiaomi = new SmartPhone('小米', 799, '黑色', '4.7inch');
console.log(xiaomi);
xiaomi.call();
xiaomi.photo();
xiaomi.playGame();
数值扩展
axios ajax请求库
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
| 特点: | - 从浏览器中创建 XMLHttpRequests - 从 node.js 创建 http 请求 - 支持 Promise API - 拦截请求和响应 - 转换请求数据和响应数据 - 取消请求 - 自动转换 JSON 数据 - 客户端支持防御 XSRF |
|---|---|
| 安装使用: | 1.nom安装 npm i axios 2.cdn外部引用 |
| 请求方式: | axios.request(config) axios.get(url[, config]) axios.delete(url[, config]) axios.head(url[, config]) axios.post(url[, data[, config]]) axios.put(url[, data[, config]]) axios.patch(url[, data[, config]]) |
//常用请求方式 一般使用get post
get***
格式:
axios.get("url", {
params: {
参数名1: 参数值1,
参数名2: 参数值2,
...
}
}).then(res=> {
// 成功回调
}).catch(err=> {
// 失败回调
})
post***
格式:
axios.post("url", {
参数名1: 参数值1,
参数名2: 参数值2,
...
}).then(res=> {
// 成功回调
}).catch(err=> {
// 失败回调
})
///////////////////////////////////////////////////////////////////////////////
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
axios.get("https://cnodejs.org/api/v1/topics", {
params: {
page: 1,
limit: 10,
tab: "good"
}
}).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
function rei() {
axios.post("http://localhost:3000/register", {
admin: "lisi",
password: 123456
}).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
}
</script>
import export 导出导入
| es6语法中模块导入和输出 模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能 在一个模块中如果只需要输入一个需要使用 export default 变量或者方法 如果一次需要输出多个需要使用 export {变量1, 变量2, …} |
|---|
格式:
如果需要输出的是一个变量的时候
输出文件 a.js
let a=123
let b=456
export default a;
需要使用的文件 b.js
import a from "路径"
console.log(a)
如果需要输出的是多个变量时候
a.js
export {变量1, 变量2}
b.js
import {变量1, 变量2} from "路径"
如果b.js文件中已经声明相同变量 这个时候为了避免冲突 我们可以使用as别名
import {变量1 as 新的变量名1, 变量2 as 新的变量名2} from "路径"
如果输出多个变量 但是在引入时候只要其中一个 我们可以直接在引入的文件中只写一个
——————————————————————————————-
es6数组方法
| 【item 表示数组中每一项 index下标索引 array原数组】 | |
|---|---|
| some | 当一个数组中只要有一个元素能够匹配,则返回true,反之返回false 格式: 数组.some((item, index, array)=> { return 条件 }) |
| every | 当一个数组中所有的元素都匹配,则返回true,反之返回false 格式: 数组.every((item, index, array)=> { return 条件 }) |
| filter | 【对数组进行筛选 返回符合条件的 新数组】 const arr= [1, 2, 5, 4, 84, 88, 99, 80]; const result= arr.filter(item => item %2==0); console.log(result); |
| map | 根据现有数组生成一个长度相同的 新数组 格式: 数组.map((item, index, array)=> { return 条件 }) |
| find | 对当前数组进行查询 找到符合条件的元素 格式: 数组.find((item, index, array)=> { return 条件 }) |
| findIndex | 对当前数组进行查询 找到符合条件的元素下标索引 格式: 数组.findIndex((item, index, array)=> { return 条件 }) |
| forEach | 对当前数组进行循环遍历 只要for循环能够遍历的 forEach都可以 格式: 数组.forEach((item, index, array)=> { console.log(item) }) |
4 扩展运算符 [rest参数] |
扩展运算符是三个点(…) 【数组扩展】 格式: var arr=[1,2,3] var newArr=[4] […newArr, …arr] // [4,1,2,3] 对数组的操作 1 复制了一下数组 const a=[1,2] const b=[…a] console.log(b) 2 合并数组 const a=[1,2] const b=[3] console.log([…a,…b]) 【对象扩展】 es6允许在大括号里边 直接写入变量和函数 作为对象的属性和方法 例如: let age=15 let name=”zhangsan” let sex=”nan” const stus={ name, // name: name sex, age } console.log(stus) 将伪数组转换为真正的数组 constdivs= document.querySelectorAll(“div”); constdivArr= […divs]; console.log(divArr); |
|---|---|
| 5 箭头函数 | (适合于this无关的回调,定时器、数组的方法回调) (不适合与this有关的回调,事件回调、对象的方法) 如果函数有参数 1 只有一个参数 则当前参数外边小括号可以省略 const 变量名=a=> { } 2 如果有多个参数 则参数外层的小括号不能省略 const 变量名=(b,c)=> { console.log(b,c) } 3 如果当前一个函数 有返回值 并且返回值只有一个 则外层花括号和return 都可以省略 const x=x=> x*x |
| 6 class类 | |
| 7 promise | |
| 8 axios async await | |
| 9 import export |
—————————————————————————-
面向对象
特征:封装性、继承性、多态性
| 面向过程 | 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。 缺点:没有面向对象易维护、易复用、易扩展 面向对象更贴近我们的实际生活,可以使用面向对象描述现实世界事物.但是事物分为具体的事物和抽象的事物。 手机——抽象的(泛指的) 具体的(特指的) 面向对象的思维特点: 1.抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板) 2.对类进行实例化,获取类的对象 面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点不断的创建对象,使用对象指挥对象做事情. |
|---|---|
| 面向对象 | 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点:性能比面向过程低 |
| 用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。 |
| 创建类 | 使用 |
|---|---|
| 类constructor构造函数 | //创建类class创建了一个明星类 class Star { constructor(uname) { this.uname = uname; } } //2.利用类创建对象 new var ldh = newStar(‘刘德华’); console.log(ldh.name); |
| 类中添加方法 | class Star { constructor(uname) { this.uname = uname; } sing(song) { console.log(this.uname+song) } } //2.利用类创建对象 new var ldh = newStar(‘刘德华’); ldh.sing(‘冰雨’); |
| 类的继承 | class Father { constructor(x, y) { this.x = x; this.y = y; } sum() { console.log(this.x + this.y); } } class Son extends Father { constructor(x, y) { super(x, y); } } var son = newSon(1, 2); var son1 = newSon(11, 22); son.sum(); son1.sum(); |
| 子类独有的减法操作 | class Son { constructor(x, y) { this.x = x; this.y = y; } subtract( ) { console.log(this.x - this.y); } } var son = newSon(5, 3); son.subtract( ); |
cnode切换和分页
<script>
const content=document.querySelector(".content")
const page=document.querySelector("#page")
const getList=(tab='all',page=1)=> {
let str=""
fetch(`https://cnodejs.org/api/v1/topics?page=${page}&tab=${tab}&limit=20`).then(res=> res.json()).then(res1=> {
console.log(res1)
for(let i=0; i<res1.data.length; i++) {
str+=`
<p>${res1.data[i].title}</p>
`
}
content.innerHTML=str
}).catch(err=> {
console.log(err)
})
}
getList()
document.querySelector("#tab").onclick=()=> {
console.log(event.target.innerHTML)
getList(event.target.innerHTML=="全部"?"all":"good")
localStorage.setItem('tab',event.target.innerHTML=="全部"?"all":"good")
}
page.onclick=()=> {
getList(localStorage.getItem("tab")?localStorage.getItem('tab'):"all", event.target.innerHTML)
}
</script>
