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());
注:需要自定义遍历数组的时候,要想到迭代器
  1. ///////////////////////////迭代器自定义遍历对象/////////////////////////
  2. // 声明一个对象
  3. const banji = {
  4. name: "终极一班",
  5. stus: [
  6. '小明',
  7. '小宁',
  8. '小田',
  9. '小花'
  10. ],
  11. [Symbol.iterator]() {
  12. let index = 0;
  13. let _this = this;
  14. return {
  15. next: function () {
  16. if (index < _this.stus.length) {
  17. const result = { value: _this.stus[index], done: false };
  18. index++;
  19. return result;
  20. } else {
  21. return { value: undefined, done: true };
  22. }
  23. }
  24. }
  25. }
  26. }
  27. // 遍历这个对象
  28. for (let v of banji) {
  29. console.log(v);
  30. }

生成器

生成器其实就是一个特殊函数
异步编程 纯回调函数 node fs ajax mongodh
function* gen() {
console.log(“hello generator”);
}
let iterator = gen( );
iterator.next( );
function * gen( ) {
console.log(111);
yield ‘一只没有耳朵’;
console.log(222);
yield ‘一只没有尾巴’;
console.log(333);
yield ‘真奇怪’;
console.log(444);
}
let iterator = gen();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

生成器的函数参数

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

  1. ////////回调地狱////////////////////////////////////////////////////////////
  2. setTimeout(() => {
  3. console.log(111);
  4. setTimeout(() => {
  5. console.log(222);
  6. setTimeout(() => {
  7. console.log(333);
  8. }, 3000);
  9. }, 2000);
  10. }, 1000);
  11. ///////////解决了回调地狱////////////////////////////////////////////////////
  12. function one() {
  13. setTimeout(() => {
  14. console.log(111);
  15. iterator.next();
  16. }, 1000)
  17. }
  18. function two() {
  19. setTimeout(() => {
  20. console.log(222);
  21. iterator.next();
  22. }, 2000)
  23. }
  24. function three() {
  25. setTimeout(() => {
  26. console.log(333);
  27. iterator.next();
  28. }, 3000)
  29. }
  30. function* gen() {
  31. yield one();
  32. yield two();
  33. yield three();
  34. }
  35. let iterator = gen();
  36. iterator.next();

|

生成器函数实例2

| | —- | | //模拟获取 用户数据 订单数据 商品数据 |

  1. function getUsers() {
  2. setTimeout(() => {
  3. let data = '用户数据';
  4. iterator.next(data);
  5. }, 1000);
  6. }
  7. function getOrders() {
  8. setTimeout(() => {
  9. let data = '订单数据';
  10. iterator.next(data);
  11. }, 1000);
  12. }
  13. function getGoods() {
  14. setTimeout(() => {
  15. let data = '用商品数据';
  16. iterator.next(data);
  17. }, 1000);
  18. }
  19. function*gen() {
  20. let users = yieldgetUsers();
  21. let orders = yieldgetOrders();
  22. let goods = yieldgetGoods();
  23. }
  24. let iterator = gen();
  25. iterator.next();

promise【重要】

Promis是ES6引入的异步编程的新解决方案。语法上 Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。解决回调地狱
1) Promise 构造函数: Promise (excutor) { }
2) Promise.prototype.then方法
3) Promise.prototype.catch方法

Promise基本语法

  1. //实例化Promise对象
  2. const p = new Promise(function (resolve, reject) {
  3. setTimeout(function () {
  4. // let data = '数据库中的用户数据';
  5. // resolve(data);
  6. let err = '获取数据失败';
  7. reject(err);
  8. }, 1000);
  9. });//调用promise对象中的then方法
  10. p.then(function (value) {
  11. console.log(value);
  12. }, function (reason) {
  13. console.error(reason);
  14. })

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读取多个文件

  1. //地域回调的方法-------------------------------------------------------------------------
  2. // 引入fs模块
  3. const fs = require('fs');
  4. fs.readFile('./论语第一则.md', (err, data1) => {
  5. fs.readFile('./论语第二则.md', (err, data2) => {
  6. fs.readFile('./论语第三则.md', (err, data3) => {
  7. let result = data1 + '\r\n' + data2 + '\r\n' + data3;
  8. console.log(result);
  9. });
  10. });
  11. });
  12. //使用promise实现------------------------------------------------------------------------
  13. const p = new Promise((resolve, reject) => {
  14. fs.readFile("./论语第一则.md", (err, data) => {
  15. resolve(data);
  16. });
  17. });
  18. p.then(value => {
  19. return new Promise((resolve, reject) => {
  20. fs.readFile("./论语第二则.md", (err, data) => {
  21. resolve([value, data]);
  22. });
  23. })
  24. }).then(value => {
  25. return new Promise((resolve, reject) => {
  26. fs.readFile("./论语三则.md", (err, data) => {
  27. //压入
  28. value.push(data);
  29. resolve(value);
  30. });
  31. })
  32. }).then(value => {
  33. console.log(value.join('\r\n'));
  34. })

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>