ES6规范

一、简介

js由三部分组成:ES+DOM(文档对象模型)+ BOM(浏览器对象模型)

ES作为核心,是一套标准,规范了语言的组成部分:语法、类型、语句、关键字、保留字。定义了数据结构和语法,定义了函数和对象的实现,包括原型链和作用域链的机制和实现。

JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象;

DOM 描述了处理网页内容的方法和接口;

BOM 描述了与浏览器进行交互的方法和接口;

关于ES6详细的介绍请查看:《ECMAScript 6标准入门》

二、let使用说明

let 是 ES6 新引入的声明变量的方式,特点:

1. 不能重复声明

let star = '123';
let star = '123';//Identifier 'star' has already been declared

2. 块级作用域,仅在代码块内生效。var是全局作用域

3. 不存在变量提升

console.log(name);let name = '世界你好';// Cannot access 'name' before initialization

三、const使用说明

const 相当于常量

1.一定要赋初始值

const A = 1

2. 一般常量要大写

const A = 100;
console.log(A)

3.常量的值不能修改

A = 200//Assignment to constant variable.

4.const也是块级作用域

{
const PLAYER = '李四';
}
console.log(PLAYER);//PLAYER is not defined

5.对数组和对象的对象修改,不算对常量的修改,不会报错,建议用 const声明数组和对象

const FOOL = ['苹果','西瓜','水蜜桃','李子'];
FOOL.push('草莓');
console.log(FOOL);

四、变量的解析赋值

ES6允许按照一定的模式从数组或对象中提取值,对变量进行赋值,称之为变量的解析赋值

1.数组的结构

const F4 = ['刘能','赵四','小沈阳','宋小宝'];
let [liu,zhao,xiao,song] = F4;
console.log(liu);
console.log(zhao);
console.log(xiao);
console.log(song);

2.对象的结构

const Person = {name: '张三',age: 12,learn: function(){console.log('努力学习,找到好工作');}
}let {name, age, learn} = Person;
console.log(name);
console.log(age);
console.log(learn);
learn();

六、简化对象写法

ES6允许在大括号里,直接写入变量和函数,作为对象的属性和方法。

let name = '张三';
let learn = function(){console.log('张三在学习');
}const person = {name,learn,dosometing(){console.log('做点什么比较好');}
}console.log(person);
person.dosometing();
person.learn();

七、箭头函数的使用

ES6允许使用箭头 => 定义函数

  • 箭头函数适合与this无关的回调,定时器,数组方法回调
  • 不适合与this有关的回调。事件回调,对象的方法

原始函数的声明:

let fn = function (a,b){xxxxxxreturn xxx;
}

使用箭头函数声明:

let fn = (a,b) =>{return a + b;
}
// 函数调用
let result = fn(3,3)
console.log(result)

使用规范:

1. this 是静态的。this始终指向函数声明时所在作用域下的 this 的值

function getName(){console.log(this.name);
}
let getName2 = ()=>{console.log(this.name);
}window.name = 'hello ES6';
const dog = {name: "你好"
}
//直接调用
getName();
getName2();//call方法调用
getName.call(dog);
getName2.call(dog);

2. 不能作为构造函数实例化对象

let person = (name,age) => {this.name = name;this.age = age;
}
let someone = new person('zhangsan',12);
console.log(someone);//Uncaught TypeError: person is not a constructor

3. 不能使用 argument 变量

let fn = () =>{console.log(arguments);
}
fn(1,2,3);

4. 箭头函数简写

1

2

3

4

5

6

7

8

9

//1)省略小括号,当形参只有一个的时候

let add = n => {

    return n+n;

}

console.log(add(10))

//2)省略花括号,当代码只有一条执行语句时,此时return必须省略,而且语句的执行结果就是返回值

let pow = n => n*n

console.log(pow(12))

八、函数参数默认值

ES6允许函数参数赋值初始值

1. 形参初始值 具有默认值的参数,一般位置靠后(约定俗成)

function add (a,b,c=10){return a + b + c;
}
let result =add(1,2)
console.log(result)

2. 与解构赋值结合,也可以进行初始化赋值

function connect ({host = '127.0.0.1',username,password,port}){console.log(host);console.log(username);console.log(password);console.log(port);
}
connect({// host:'localhost',username:'root',password:'root',port:3306
})

九、rest参数

ES6引入 rest 参数,用于获取函数的实参,用来代替argument

1. ES5获取实参的方式

function data (){console.log(arguments)//arguments是一个对象
}
data('dog','cat','pig')

2. ES6的 rest 参数,是一个数组,可以使用数组相关的api如:filter some every map

function data (...args){console.log(args)
}
data('dog','cat','pig')

3. rest 参数必须放到参数最后

function data (...args){console.log(args)
}
data('dog','cat','pig')

十、spread扩展运算符

... 扩展运算符能将【数组】转化为逗号分隔的【参数序列】

声明数组

const F4 = ['刘能','赵四','小沈阳','宋小宝'];

声明函数

function paozao(){console.log(arguments);
}
paozao(...F4)//相当于paozao('刘能','赵四','小沈阳','宋小宝')

扩展运算符的应用

1.数组的合并

const hello = ['h','e','l','l','o'];
const word = ['w','o','r','d'];
const helloword = hello.concat(word);
console.log(helloword)

2. 数组的克隆

const copy = ['c','o','p','y'];
const copy2 = [...copy]
console.log(copy2)

3. 将伪数组转化为真正的数组

const divs = document.querySelectorAll('div');
console.log(divs);
const divAll = [...divs];
console.log(divAll);

十一、symbol基本用法

Symbol是一种新的原始数据类型,表示独一无二的值,时javascript语言的第七种数据类型,是一种类似于字符串的数据类型。

​ 1. Symbol的值是唯一的,用来解决命名冲突的问题

​ 2. Symbol值不能与其他的数据进行运算

​ 3.Symbol定义的对象属性不能使用 for...in 遍历循环,但是可以使用 Reflect.ownKeys 来获取对象的所有键名。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

let s1 = Symbol();

console.log(s1,typeof s1);

let l1 = 'hello';

let l2 = 'hello';

console.log(l1 === l2);//true

let s2 = Symbol('hello');

let s3 = Symbol('hello');

console.log(s2 === s3);//false

Symbol.for创建

let s4 = Symbol.for('nihao');

let s5 = Symbol.for('nihao');

console.log(s4,typeof s4);

不能与其他数据进行运算

let result = s1 + 100;//Cannot convert a Symbol value to a number
let result = s1 > 100;//Cannot convert a Symbol value to a number
let result = s1 + '123';//Cannot convert a Symbol value to a string
let result = s1 + s1;//Cannot convert a Symbol value to a number

js常见数据类型总结:USONB: you are so niubility

  • U:undefined
  • S:string
  • O:object
  • B:boolean

声明对象

let methods = {up:Symbol(),down: Symbol()
};game[methods.up] = function(){console.log('我可以上升')
}game[methods.down] = function(){console.log('我可以下降')
}
console.log(game)let lol = {name:"英雄联盟",[Symbol('yasuo')]:function(){console.log("快乐风男");},[Symbol('jiansheng')]:function(){console.log("无极剑圣")}
}
console.log(lol)

Symbol内置属性,提供了11种内置属性

十二、迭代器

是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署iterator接口就可以完成遍历操作

  1. ES6提供了一种新的遍历命令 for...of 循环,iterator接口主要为 for...of 服务

  2. 原生具备 Iterator接口的数据(可用 for of遍历)

  • ​ Array
  • ​ Arguments
  • ​ Set
  • ​ Map
  • ​ String
  • ​ TypedArray
  • ​ NodeList

3.工作原理

​ a.创建一个指针对象,指向当前数据结构的起始位置

​ b.第一次调用对象的next方法,指针自动指向数据结构的第一个成员

​ c.接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员

​ d.每调用next方法返回一个包含 value和done属性的对象

注:需要自定义遍历数据的时候,要想到迭代器。

const person = ['张三','李四','王五'];
for(let v of person){console.log(v);//'张三','李四','王五'
}
for(let v in person){console.log(v);//0,1,2
}
for...of保存的键值,for...in保存的键名let iterator = person[Symbol.iterator]();
//调用对象的next方法
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

迭代器自定义遍历对象

const banji = {name:"终极一班",stus:['xiaoming','xiaohong','xiaotian','xioahu'],[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...of遍历,且返回的为对象中数组的成员
for(let v of banji){console.log(v)
}

十三、生成器

生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同实际上就是一种特殊的函数,进行异步编程

声明方式,在function后面加 *,调用时调用next()方法执行

生成器实现了iterator属性带有 next() 方法

yield语句函数代码的分隔符

function * gen(){console.log("hello generator")console.log(111);yield '一只没有耳朵';console.log(222);yield '一直没有尾巴';console.log(333);yield '真奇怪';console.log(444);
}let iterator = gen();
// console.log(iterator)
iterator.next();
iterator.next();
iterator.next();
iterator.next();//遍历
for(let v of gen()){console.log(v);
}//生成器函数参数
function * gen(args){console.log(args)let one = yield 111;console.log(one);yield 222;yield 333;
}let iterator = gen('AAA');
console.log(iterator.next());
//next()方法可以传入实参,参数作为上一个yield语句返回结果
console.log(iterator.next('BBB'));
console.log(iterator.next());
console.log(iterator.next());

异步编程(js是单线程执行的,操作需要异步执行) 文件读取 网络操作(ajaxrequest) 数据库操作

生成器函数示例-1

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()},1000)
}function three (){setTimeout(() =>{console.log(333);iterator.next()},1000)
}function * gen (){yield one();yield two();yield three();
}let iterator = gen();
iterator.next();

生成器函数示例-2

模拟获取(依次获取) 用户数据 订单数据 商品数据

function getUsers (){setTimeout(() =>{let data = '获取用户数据'// 调用next()方法,并将数据传入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 = yield getUsers();console.log(users);let orders = yield getOrders();console.log(orders);let goods = yield getGoods();console.log(goods);
}let iterator = gen();
iterator.next()

十四、promise

Promise是ES6引入的异步编程的新解决方案。语法上 Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果

  1. Promise构造函数: Promise( executor){}

  2. Promise.prototype.then 方法

  3. Promise.prototype.catch 方法

使用方法

//实例化对象
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);
})

1. Promise封装读取文件

const fs = require('fs');const p = new Promise(function(resovle,reject){fs.readFile("./resources/test.txt",(err,data)=>{// 判断失败if (err) reject(err);// 成功resovle(data);});
});p.then(function(value){console.log(value.toString());
},function(reason){console.error('操作失败');
})

2. Promise发送ajax请求

const p = new Promise((resolve,reject) => {// 1.创建对象const xhr = new XMLHttpRequest();// 2.初始化xhr.open("GET","https://api.apiopen.top");// 3.发送xhr.send();// 4.绑定事件,处理响应结果xhr.onreadystatechange = function (){// 处理逻辑if(xhr.status >= 200 && xhr.status < 300){// 响应成功resolve(xhr.response);}else{// 响应失败reject(xhr.status);}}
})
// 指定回调函数
p.then(function(value){console.log(value)
},function(reason){console.log(reason)
})

3. Promise的then()方法

1

2

3

4

5

const p = new Promise((resolve,reject) =>{

    setTimeout(() =>{

        resolve('用户数据');

    },1000);

});

then指定回调函数,then方法的返回结果是 Promise对象,对象状态由回调函数的执行结果决定

如果回调函数中返回的结果是非 promise类型的属性,状态为成功,返回值为对象的成功的值

const result = p.then(value =>{console.log(value);1.非Promise类型的属性return "good";2.Promise类型的属性return new Promise((resolve,reject) =>{resolve('ok');// reject('error');});3.抛出异常throw new Error('出错了!');
},reason =>{console.warn(reason);
});console.log(result);

then()方法支持链式调用,链式调用可以解决回调地狱的问题

p.then(value=>{},reason=>{}).then(value={},reason=>{})

4. Promise-读取多个文件

const fs = require('fs');使用回调地狱的方式实现
fs.readFile('./resources/test.txt', (err, data1) => {fs.readFile('./resources/test1.txt', (err, data2) => {fs.readFile('./resources/test3.txt', (err, data3) => {let result = data1 + '\r\n' + data2 + '\r\n' + data3;console.log(result);});});});// 采用Promise对象的方式实现多文件读取,采用链式调用的方式进行拼接操作
const p = new Promise((reslove,reject)=>{fs.readFile('./resources/test.txt',(err,data)=>{reslove(data);});
});p.then(value=>{return new Promise((reslove,reject)=>{fs.readFile('./resources/test1.txt',(err,data)=>{reslove([value,data]);});});
}).then(value=>{return new Promise((reslove,reject)=>{fs.readFile('./resources/test3.txt',(err,data)=>{value.push(data);reslove(value);});});
}).then(value=>{console.log(value.join('\r\n'));
})

Promise的 catch() 方法,用于指定Promise对象失败时的回调是语法糖,相当于没有指定value参数的 then() 方法

const p = new Promise((reslove,reject)=>{setTimeout(() => {reject('出错啦!');}, 1000);
});// 通过then()方法的reason指定失败时的操作
p.then(value=>{},reason=>{console.error(reason);
});
//通过catch()方法获取Promise对象的异常
p.catch(reason=>{console.warn(reason);
})

十五、集合与相关的API

ES6提供了新的数据结构Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了 Iterator接口,所以可以使用扩展运算符...和 for...of... 进行遍历,

集合的属性和方法:

  1. size 返回集合的元素个数

  2. add 增加一个新元素,返回当前集合

  3. delete 删除元素,返回 boolean值

  4. has 检测集合中是否包含某个元素,返回 boolean值

//声明一个set
let s = new Set();
let s2 = new Set([12,13,14,15,21,12]);
// console.log(s ,typeof s);
console.log(s2);
// 1) size   返回集合的元素个数
console.log(s2.size);
// 2) add    增加一个新元素,返回当前集合
s2.add(100);
console.log(s2);
// 3) delete 删除元素,返回 boolean值
s2.delete(15);
console.log(s2);
// 4) has    检测集合中是否包含某个元素,返回 boolean值
console.log(s2.has(100));
// 5) clear  清空集合
s2.clear();
console.log(s2);
// 6)for..of..遍历
for(v of s2){console.log(v);
}//set集合的使用
let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let arr2 = [4,5,6,5,6];
//1.数组去重
let result = [...new Set(arr)];
console.log(result);
//2.交集
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 result = [...new Set(arr)].filter(item => new Set(arr2).has(item));
console.log(result);
//3.并集
let union = [...new Set([...arr,...arr2])];
console.log(union); 
//4.差集
let diff = [...new Set(arr)].filter(item => !(new Set(arr2).has(item)));
console.log(diff);

十七、Class类

ES6提供了更接近传统语言的写法,引入了class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

基本上,ES6的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,

新的 class写法只是让对象原型的写l法更加清晰、更像面向对象编程的语法而己。

知识点:

  1. class 声明类

  2. constructor 定义构造函数初始化

  3. extends 继承父类

  4. super 调用父级构造方法

  5. static 定义静态方法和属性

         6.父类方法可以重写

//使用class()声明类
class Computer {// 构造方法,名字不可修改,会在实例化对象的时候自动调用,可以没有constructor(brand, price) {this.brand = brand;this.price = price;}// 定义方法,不能使用ES5的方式声明start() {console.log('欢迎使用')}
}
// 实例化对象
let lenovo = new Computer('lenovo', 5499);
console.log(lenovo)
lenovo.start();

class中的静态成员,属于类而不属于实例化对象

class Phone {// 静态属性static name = '手机'
// 静态方法
static call() {console.log('我能打电话');}
}let huawei = new Phone;
console.log(huawei.name);//undifined
console.log(Phone.name);//手机
Phone.call();//我能打电话
huawei.call();//huawei.call is not a function

使用构造函数实现继承

//父类对象
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);this.color = color;this.size = size;}photo() {console.log('拍照');}playGame() {console.log('玩游戏');}// 子类重写父类的方法call() {console.log('视频通话');}
}const xiaomi = new SmartPhone('小米6', 1999, '白色', '5.15inch');
console.log(xiaomi);
// 子类不能调用父类的同名方法
xiaomi.call();
xiaomi.photo();
xiaomi.playGame();

class中get和set方法

class Phone{// get对动态属性进行封装get price (){console.log('get方法被执行');return 'get get get'}// set属性可以进行属性的判断和封装,需要设置形参set price (newVal){console.log('set方法执行');console.log('新的价格为' + newVal);}
}
let p = new Phone();
console.log(p.price);
p.price = 100;

十八、数值扩展

1. Number. EPSILON 是 JavaScript表示的最小精度EPSILON属性的值接近于2.2264466492503136884726361816E-16 多用于浮点数运算,用于解决浮点数计算误差问题

function equals(a, b) {if (Math.abs(a - b) < Number.EPSILON) {return true;} else {return false;}
}
console.log(0.1 + 0.2 === 0.3);
console.log(equals(0.1 + 0.2, 0.3));

2. 二进制和八进制

let b = 0b1010;//二进制
let o = 0177;//八进制
let d = 0x123;//16进制
console.log(b);
console.log(o);
console.log(d);

3. Number.isFinite 检测一个数值是否为有限数

console.log(Number.isFinite(100));//true
console.log(Number.isFinite(100/0));//false

4. Number.isNaN 检测一个数值是否为 NaN

console.log(Number.isNaN(2));//false
console.log(Number.isNaN(NaN));//true

5. Number.parseInt Number.parserFloat 字符串转整数

onsole.log(Number.parseInt('1323.1dcsdcd'));//1323
console.log(Number.parseFloat('13231.12dcsdcd'));//13231.12

6. Number.isInteger 判断一个数是否为整数

console.log(Number.isInteger(213.3));//false
console.log(Number.isInteger(213));//true

7.Math.trunc 将数字的小数部分抹掉

console.log(Math.trunc(12.3));

8. Math.sign 判断一个数到底为正数 负数 还是零

1

2

3

console.log(Math.sign(10));//1

console.log(Math.sign(0));//0

console.log(Math.sign(-10));//-1

  

十九、对象方法扩展

1. Object.is 判断两个值是否完全相等,类似于 === 但是可以判断 NaN 是否相等

console.log(Object.is(110,110));//true
console.log(Object.is(110,10));//false
console.log(Object.is(NaN,NaN));//true
console.log(NaN === NaN);//false

2. Object.assign 对象的合并

const config1 = {host: '127.0.0.1',port:'3306',user: 'user',password: '123456',test: 'test'
}
const config2 = {host: '49.123.124.5',port:'3306',user: 'root',password: 'root',enviroment: 'dev'
}
console.log(Object.assign(config1,config2));

3.Object.setPrototypeof Object.getPrototypeof

const school = {name: 'SDUT'
}
const city = {student: ['山东', '河北', '内蒙', '贵州', '杭州']
}Object.setPrototypeOf(school, city);
console.log(Object.getPrototypeOf(school));
console.log(school);

二十、ES6的模块化

模块化:将大的程序文件,拆分成很多小的文件(模块),然后将小的文件组合起来

好处:防止命名冲突 代码复用 便于维护.

ES6模块化语法:

模块功能主要由两个命令构成: export 和 import

export 命令用于规定模块的对外接口

Import 命令用于输入其他模块提供的功能

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ES6模块化测试</title>
</head><body><!-- 标签引入m1.js模块 --><script type="module">//1.通用导入方式// 引入m1.js模块import * as m1 from "./js/m1.js";console.log(m1);console.log(m1.learn());// 引入m2.js模块import * as m2 from "./js/m2.js";console.log(m2);console.log(m2.study());// 引入m3.js模块import * as m3 from "./js/m3.js";console.log(m3);m3.default.change();//2.解构赋值import {name,learn} from './js/m1.js';console.log(name);console.log(learn);// as使用别名的方式应用import{name as lisi,study} from './js/m2.js';console.log(lisi);console.log(study);// 引入默认暴露import {default as m3} from './js/m3.js';console.log(m3);//3.简便形式,只针对默认暴露import m3 from './js/m3.js';console.log(m3);</script><!-- 外部引入模块 --><script src="./js/app.js" type="module"></script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BlogPark测试报告

目录 一&#xff0c;项目背景 二&#xff0c;项目功能 三&#xff0c;测试计划 3.1 测试用例的设计 3.2 功能测试 1.正常登录 2.正常写博客测试 &#xff08;输入完整的标题和内容&#xff09; 3.发布博客之后跳转到详情页观察是否有刚发布的博客 4.删除博客观察列表的…

漫漫数学之旅004

文章目录 经典格言数学习题古今评注根号的故事数学家小传(一)乔治波利亚(二) 克里斯托弗鲁登道夫经典格言 数学包括用最迂回曲折的方式证明最显而易见的事实。——乔治波利亚(Gorge Polya) 乔治波利亚(George Polya)的这句名言揭示了数学证明的本质和魅力。在数学中,…

非工程师指南: 训练 LLaMA 2 聊天机器人

引言 本教程将向你展示在不编写一行代码的情况下&#xff0c;如何构建自己的开源 ChatGPT&#xff0c;这样人人都能构建自己的聊天模型。我们将以 LLaMA 2 基础模型为例&#xff0c;在开源指令数据集上针对聊天场景对其进行微调&#xff0c;并将微调后的模型部署到一个可分享的…

华为 1+X《网络系统建设与运维(高级)》认证模拟实验上机试题

华为 1X《网络系统建设与运维&#xff08;高级&#xff09;》认证模拟实验上机试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案(非常重要) 三、考试正文3.1注意事项3.2校区内&#xff08;LAN&#xff09;3.2.1任务 1&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店&#xff0c;多门店的管理模式下&#xff0c;去做一个上门洗衣洗鞋小程序&#xff0c;需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一&#xff0c;加盟店…

Qt5插件开发入门+示例

目的 1、为什么用插件 现在大家最讲模块化开发了,怎么算模块化,分成不同的类,分成不同的文件夹,高内聚,低耦合,这个当然算是。 从高层次讲,它们是在一起的,只是逻辑上的模块化,不是物理上的模块化,或者说不是彻底的模块化,彻底的模块化应该像一个辆自行车一样,车…

【React源码 - Fiber架构之Renderer】

前言 本文主要将的是Fiber架构三核心中渲染器Renderer&#xff0c;在Reconciler调度器中“归”过程回到rootfiber节点并执行完之后会调用commitroot并传入fiberRootNode来进入到Renderer阶段(commit阶段)&#xff0c;在commit阶段会遍历effectList来进行DOM操作&#xff0c;在…

计算机毕业设计-----ssm+mysql医药进销存系统

功能介绍 医药进销存系统&#xff0c;主要功能包括&#xff1a; 公告管理&#xff1a;发布公告、公告列表&#xff1b; 生产管理&#xff1a;订单列表、增加生产、订单日志&#xff1b; 分店采购&#xff1a;分店审核、采购&#xff1b; 总店仓库&#xff1a;出库管理、仓库列…

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

市域治理一体化综合指挥平台解决方案:PPT全文42页,附下载

关键词&#xff1a;市域社会治理&#xff0c;智慧网格&#xff0c;市域社会治理现代化&#xff0c;智慧网格综合管理平台&#xff0c;市域治理 一、市域治理&#xff08;智慧网格&#xff09;一体化建设需求分析 1、职能部门需求&#xff1a;职能部门在市域治理中发挥着主导作…

关于谷歌浏览器如何将背景换为黑色,字体换为白色

一.关于chorme浏览器如何换色 #跟着我一起来看一下吧 操作步骤 步骤 1.在谷歌的搜索框里搜索此网址——chrome://flags/ 如图 2.访问此网址 如图 3.我们在搜索框搜索:Auto Dark Mode for Web Contents 如图 4.开启Web内容的自动暗模式 选择enbled 5.确认重新启动 选择…

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP

2.2.3机器学习—— 判定梯度下降是否收敛 + α学习率的选择

2.2.3 判定梯度下降是否收敛 α学习率的选择 2.1、 判定梯度下降是否收敛 有两种方法&#xff0c;如下图&#xff1a; 方法一&#xff1a; 如图&#xff0c;随着迭代次数的增加&#xff0c;J(W,b)损失函数不断下降当 iterations 300 之后&#xff0c;下降的就不太明显了 / …

赋能智慧农业生产,基于YOLOv3开发构建农业生产场景下油茶作物成熟检测识别系统

AI赋能生产生活场景&#xff0c;是加速人工智能技术落地的有利途径&#xff0c;在前文很多具体的业务场景中我们也从实验的角度来尝试性地分析实践了基于AI模型来助力生产生活制造相关的各个领域&#xff0c;诸如&#xff1a;基于AI硬件实现农业作物除草就是一个比较熟知的场景…

paddle指定运行gpu

在PaddlePaddle中指定使用GPU进行运行非常简单。首先&#xff0c;确保你的机器上已经安装了CUDA和cuDNN&#xff0c;并且正确配置了GPU环境。然后&#xff0c;按照以下步骤进行操作&#xff1a; 导入PaddlePaddle库&#xff1a; import paddle设置使用的设备为GPU&#xff1a…

【数字图像处理】水平翻转、垂直翻转

图像翻转是常见的数字图像处理方式&#xff0c;分为水平翻转和垂直翻转。本文主要介绍 FPGA 实现图像翻转的基本思路&#xff0c;以及使用紫光同创 PGL22G 开发板实现数字图像水平翻转、垂直翻转的过程。 目录 1 水平翻转与垂直翻转 2 FPGA 布署与实现 2.1 功能与指标定义 …

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…

ChatGPT知名开源项目有哪些

ChatGPT-Next-Web&#xff1a;基于ChatGPT API的私有化部署网页聊天系统 主要功能&#xff1a; 只需在 1 分钟内即可在 Vercel 上一键免费部署&#xff0c;支持私有服务器快速部署&#xff0c;支持使用私有域名支持ChatGPT3.5、4等常见模型Linux/Windows/MacOS 上的紧凑型客户…

Ribbon学习思维导图

参考资料 1、OpenFeign与Ribbon源码分析总结与面试题 2、万字剖析OpenFeign整合Ribbon实现负载均衡的原理 3、扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理 4、OpenFeign原来是这么基于Ribbon来实现负载均衡的

第18集《佛法修学概要》

戊五、结示法要 请大家打开讲义第四十四页。我们讲因果同时&#xff0c;借缘显现。 从因果转变的角度&#xff0c;佛教是说“罪从心起将心忏&#xff0c;心若灭时罪亦亡。”那么我们要知道&#xff0c;业是怎么来的&#xff1f;怎么会有业&#xff1f;为什么苹果掉下来&#x…