ES6语法教程

news2024/11/16 21:58:15

简介:

ECMA

European Computer Manufactures Association

欧洲计算机制造商协会,该组织的目标是评估、开发、和认可电信和计算机标准,94年后该组织改名为Ecma国标。

ECMAScript是由Ecma国际通过ECMA-262标准化的脚本程序设计语言

Ecma国际制定了许多标准,而ECMA-262只是其中一个

  • 语法简洁 功能丰富
  • 框架开发应用
  • 前端开发职位要求 Vue React Angular
  • 版本变动内容最多,具有里程碑意义
  • 加入许多新的语法特性,编程实现更简单高效
  • 是前端发展的趋势,就业必备技能

注:从ES6开始,每年发布一个版本,版本号比年份最后一位大1

目录

1、let变量声明以及声明特性:

2、Const

3、变量的解构赋值

4、ES6引入新的声明字符串的方式,模版字符串

 5、简化对象写法

6、箭头函数以及声明特点

7、箭头函数的实践与应用场景

8、箭头函数的默认设置

9、rest参数

10、扩展运算符的介绍

​编辑 11、扩展运算符的应用

12、Symbol的介绍与创建

js7总数据类型总结:

13、对象添加symbol类型的属性

14、Symbol的内置属性

15、iterator迭代器介绍

16、迭代器应用-自定义遍历数据

17、 Promise介绍与基本使用

18、Promise.prototype.then

19、Promise实践-连续读取多个文件

20、Promise对象catch方法 

21、Set集合介绍与API

22、Set集合实践

23、Map的介绍与API

24、Class类的介绍

25、Class静态成员

26、ES5构造函数继承

27、ES6 Class类的继承

28、getter和setter

29、数值扩展

30、对象方法扩展

31、模块化介绍、优势

32、浏览器使用ES6模块化


1、let变量声明以及声明特性:

1、变量不能重复声明

2、块级作用域(全局、函数、eval)

{

let girl = ‘aa’;

}

Console.log(girl;) // Uncaught ReferenceError: girl is not defined

  1. 不存在变量提升
  2. 不影响作用域链

2、Const
  1. 声明常量,一定要赋初始值
  2. 一般常量使用大写(潜规则)
  3. 常量的值不能修改
  4. 块级作用域
  5. 对于数组和对象的元素修改,不算对常量的修改,不会报错

3、变量的解构赋值

ES允许按照一定模式从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。

//1、数组的解构
const F4 = ['小沈阳', '刘能', '赵四', '宋小宝'];
let [xiao, liu, zhao, song] = F4;
console.log(xiao);
console.log(liu);
console.log(zhao);
console.log(song);


//2、对象的解构
const zhao = {
name: '赵本山',
age: '不详',
xiaopin: function () {
console.log('我可以');
}
}
//相当于声明了三个变量并且赋值
// let { name, age, xiaopin } = zhao;
console.log(name);
console.log(age);
console.log(xiaopin);
// xiaopin();

let {xiaopin} = zhao;
//下面的代码存在大量的重复,这时候可以考虑对象的解构赋值来简化代码
// zhao.xiaopin();
// zhao.xiaopin();
// zhao.xiaopin();

xiaopin();
xiaopin();
xiaopin();
4、ES6引入新的声明字符串的方式,模版字符串
// ES6引入新的声明字符串的方式[``](模版字符串,使用反引号) '' ""
//1、声明
let str = `我是一个字符串`;
console.log(str);

//2、内容中可以直接出现换行符
let str2 = `<ul>
<li>沈腾</li>
<li>玛丽</li>
<li>艾伦</li>
</ul>`;
//3、变量拼接
let lovest = '魏翔';
let out = `${lovest}是我心目中最搞笑的演员`;
console.log(out);
 5、简化对象写法
// ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法
//这样书写更加简洁
let name = 'hello'
let change = function() {
console.log('我们可以改变世界');
}
const shchool = {
name,
change,
// improve: function(){
// console.log('我们可以提高你的技能');
// }
improve() {
console.log('我们可以提高你的技能');
}
}
6、箭头函数以及声明特点
/ES6允许使用箭头=> 定义函数
// 声明一个函数
let fn = function () { } //之前写法

let fn2 = (a, b) => {
//代码体
return a + b;
} // 简洁写法
//调用函数
let result = fn2(1, 2);
console.log(result);

//1、this是静态的,this始终指向函数声明时所在的作用域下的this的值
function getName() {
//直接调用,普通函数this指向window
console.log(this.name);
}
let getName2 = () => {
//箭头函数在全局作用域下声明的this指向window
console.log(this.name);
}
// 设置window对象的name属性
window.name = '哈哈';
const school = {
name: "HAHA"
}
//直接调用,普通函数this指向window
// getName();
// getName2();

//call方法调用,是可以改变函数内部this的值的
getName.call(school);//HAHA
getName2.call(school);//哈哈

//2、不能作为构造函数实例化对象
let Person = (name, age) => {
this.name = name;
this.age = age;
}
let me = new Person('xiao', 18)
console.log(me);//demo.html:51 Uncaught TypeError: Person is not a constructor
//3、不能使用arguments变量(我们都知道在函数内部有一个特殊的变量arguments来保存实参)
let fn3 = function () {
console.log(arguments);
}
fn3(1, 2, 3);


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

//4、箭头函数的简写
//1)省略小括号,当形参有且只有一个的时候
// let add=(n) => {
// return n + n;
// }
let add = n => {
return n + n;
}
console.log(add(9));
//2)省略花括号,当代码体只有一条语句的时候,此时return必须省略,而且语句的执行结果就是函数的返回值
// let pow = (n) => {
// return n * n;
// }
let pow = (n) => n * n;
console.log(pow(9));
7、箭头函数的实践与应用场景
//需求1:点击div 2s 后颜色变成粉色
//获取元素
let ad = document.getElementById('ad');
//绑定事件
ad.addEventListener('click', function () {
//保存this的值
//把当前函数作用域下的this保存,当前函数作用域下this指向的正是ad
let _this = this;
//定时器
// setTimeout(function() {
// //修改背景色 this
// console.log(this);
// _this.style.background = 'pink';
// //在当前作用域下找不到_this,就会往外层作用域下去找
// }, 2000);
setTimeout(() => {
//修改背景色 此时this指向时间源ad
console.log(this);
this.style.background = 'pink';
}, 2000);
})


//需求2:从数组中返回偶数的元素
const arr = [1,6,9,10,100,25];
const result = arr.filter(function(item) {
if (item % 2 === 0) {
return true;
} else {
return false;
}
});
console.log(result);

const result = arr.filter(item => item % 2 === 0)
//需求2:从数组中返回偶数的元素
const arr = [1, 6, 9, 10, 100, 25];
// const result = arr.filter(function(item) {
// if (item % 2 === 0) {
// return true;
// } else {
// return false;
// }
// });
const result = arr.filter(item => item % 2 === 0)
console.log(result);
// 箭头函数适合与this无关的回调,数组方法的回调
//箭头函数不适合与this有关的回调,事件回调,对象的方法
8、箭头函数的默认设置
//ES6允许给函数参数赋初始值
//1.形参初始值,传了就用没传就用默认值,具有默认值的参数一般位置要靠后
function add(a, b, c = 10) {
return a + b + c;
}
let result = add(1,2);
console.log(result);

//2、与解构赋值结合
// function connect(options) {
// let host = options.host;
// let username = options.username;
// let password = options.password;
// let port = options.port;
// }
function connect({ host, username, password, port }) {
console.log(host + username + password + port);
//localhostroot1234568000
}
connect({
host: 'localhost',
username: 'root',
password: '123456',
port: '8000'
})
9、rest参数
/ ES6引入rest参数,用于获取函数的实参,用来代替arguments
// ES5获取实参的方式
function date() {
console.log(arguments);
}
date('白芷', '阿娇', '思慧')


//rest参数
function date(...args) {
console.log(args);
//可以使用数组特有的方法:filter every map some
}
date('白芷', '阿娇', '思慧')

//rest参数必须放到参数最后

function fn(a, b, ...args) {
console.log(a);
console.log(b);
console.log(args);
}
fn(1, 2, 3, 4, 5, 6);

10、扩展运算符的介绍
/ ES6 ... 扩展运算符能将数组转换为逗号分隔的参数序列
//声明一个数组
const tfboys = ['千禧', '王源', '王俊凯'];
//声明一个函数
function chunwan() {
console.log(arguments);
}
chunwan(tfboys);

chunwan(...tfboys);//chunwan('千禧', '王源', '王俊凯')
//与rest参数的区别:
//...args放在了函数形参的位置
//... 扩展运算符放在了调用的位置,实参里面

 11、扩展运算符的应用
/1、数组的合并
const kuaizi = ['王太利', '肖央'];
const fenghuang = ['增益', '玲花'];
// const zuixuanxiaopingguo = kuaizi.concat(fenghuang);
const zuixuanxiaopingguo = [...kuaizi, ...fenghuang];
console.log(zuixuanxiaopingguo);//2、数组的克隆
const sanzhihua = ['E', 'G', 'M'];
const sanyecao = [...sanzhihua];//['E','G','M'],如果拷贝的里面有引用类型的元素的话为浅拷贝,如果没有引用类型的元素是直接完全复制出一个新数组
//3、将伪数组转为真数组
const divs = document.querySelectorAll('div');
console.log(divs);

const divArr = [...divs];
console.log(divArr);

12、Symbol的介绍与创建

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。

Symbol特点:

  1. Symbol的值是唯一的,用来解决命名冲突的问题
  2. Symbol值不能与其他数据进行运算

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

// 创建Symbol
let s1 = Symbol();
console.log(s1, typeof s1);// Symbol() 'symbol'

//添加标识的symbol
let s2 = Symbol('哈哈'); //Symbol是一个函数,通过调用Symbol()函数来创建symbol
let s2_2 = Symbol('哈哈');
console.log(s2 === s2_2);//false

let s3 = Symbol.for('哈哈');//Symbol是一个对象,通过调用对象的for方法来创建symbol,函数对象
let s4 = Symbol.for('哈哈');
console.log(s3 === s4); // true

//不能与其他数据运算
let result = s + 100;



//不能与其他数据运算
let result = s + 100;
js7总数据类型总结:
  1. USONB you are so niubility
  2.  u undefined
  3.  s string symbol
  4.  o object
  5.  n null number
  6.  b boolean
13、对象添加symbol类型的属性
//向对象中添加方法 up down
let game = {
name: '俄罗斯方块',
up() { },
down() { }
}

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);
14、Symbol的内置属性

除了定义自己使用的symbol值以外,es6还提供了11个内置的symbol值,指向语言内部使用方法。

Symbol.hasInstance

当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法

Symbol.isConcatSpreadable

对象的Symbol.isConcatSpreadable属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开

Symbol.unscopables

该对象指定了使用with关键字时,哪些属性会被with环境排除

Symbol.match

当执行str.match(myObject)时,如果该属性存在会调用它,返回该方法的返回值。

Symbol.replace

当该对象被str.replace(myObject)方法调用时会返回该方法的返回值

Symbol.search

当该对象被str.search(myObject)方法调用时会返回该方法的返回值

class Person {
static [Symbol.hasInstance](param) {
console.log(param);
console.log('我被用来检测类型了');
return true;
}
}

let o = {};
console.log(o instanceof Person);// true 此时可以把对象o传递到到static方法,由你来决定下一步操作

const arr = [1, 2, 3];
const arr2 = [4, 5, 6];
arr2[Symbol.isConcatSpreadable] = false;//控制arr2数组中的值是否展开
console.log(arr.concat(arr2));


15、iterator迭代器介绍

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

  1. ES6创造了一种新的遍历命令for...of 循环,iterator接口主要提供for...of消费
  2. 原生具备iterator接口的数据可用for...of 遍历
  1. Array
  2. Arguments
  3. Set
  4. Map
  5. String
  6. TypedArray
  7. NodeList

 

onst xiyou = ['唐僧', '孙悟空', '猪八戒'];
//使用for ... of 遍历数组
for (let v of xiyou) {
console.log(v);//保存的是键值

}

for (let v in xiyou) {
console.log(v);//保存的是键名

}




const xiyou = ['唐僧', '孙悟空', '猪八戒'];
console.log(xiyou);

 

16、迭代器应用-自定义遍历数据
const banji = {
name: "终极一班",
students: [
'小明',
'小宁',
'小高',
'小李'
],
[Symbol.iterator]() {
//索引变量
let index = 0;
let _this = this;
return {
next: function () {
if (index < _this.students.length) {
const result = { value: _this.students[index], done: false };
//下标自增
index++;
//返回结果
return result;
} else {
return { value: undefined, done: true }
}
}
};
}
}
//遍历对象
for (const v of banji) {
console.log(v);
}

17、 Promise介绍与基本使用

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

  1. Promise构造函数:Promise(excutor) {}
  2. Promise.prototype.then
  3. Promise.prototype.catch
    const p = new Promise((resolve, reject) => { 
    const xhr = new XMLHttpRequest();
    xhr.open('GET', "");
    xhr.send();
    xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
    if (xhr.status >= 200 && xhr.status < 300) {
    resolve(xhr.response);
    } else {
    reject(xhr.status);
    }
    }
    }
    
    })
    //把要处理的逻辑放在p.then之后写,没用Promise之前网络请求和逻辑处理的代码只能写一块,导致代码很乱
    p.then(function (value) { 
    }, function (err) { 
    })
    18、Promise.prototype.then
    const p = new Promise((resolve, reject) => {
    setTimeout(() => {
    resolve('用户数据');
    // reject('出错了');
    }, 1000);
    })
    
    //调用then方法,then方法的返回结果是Promise对象,对象状态由回调函数的执行结果决定
    // 1、如果回调函数中返回的结果是非Promise类型的属性,状态为成功,返回值为对象的成功值
    const result = p.then(value => {
    console.log(value);
    // return '1';
    }, reason => {
    console.warn(reason);
    });
    console.log(result);
    
    // 链式调用,可以避免回调地狱
    p.then(value => {
    
    }).then(value => {
    });
    19、Promise实践-连续读取多个文件

如果是连续多次异步操作用Promise.then()可以使代码看起来更加简洁,有条理,避免陷入回调地狱

//引入fs模块
const { rejects } = require("assert");
const fs = require("fs");
const { resolve } = require("path");

fs.readFile('', (err, data1) => { 
fs.readFile('', (err, data2) => { 
fs.readFile('', (err, data3) => {
let result = data1 + data2 + data3;
console.log(result);
});
}) 
})

//使用Promise 实现
const p = new Promise((resolve, reject) => {
fs.readFile('', (err, data) => { 
resolve(data)
})
});
p.then(value => { 
return new Promise((resolve, reject) => { 
fs.readFile('', (err, data) => { 
resolve([value, data])
})
})
}).then(value => { 
return Promise((resolve, reject) => { 
fs.readFile('', (err, data) => {
value.push(data);
resolve(value)
})
})
}).then(value => { 
console.log(value);
20、Promise对象catch方法 
p.catch(function (reason) {

});
21、Set集合介绍与API

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

  1. size 返回集合的元素个数
  2. add 增加一个新元素,返回当前集合
  3. delete 删除元素,返回Boolean值
  4. has 检测集合中是否包含某个元素,返回Boolean值
    let s = new Set(['a', 'a', 'b', 'c']);
    console.log(s);//自动去重
    
    
    for (const v of s) {
    console.log(v);
    }
    
    22、Set集合实践
    let arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 7];
    //1.数组去重
    let result = new Set(arr);//使用扩展运算符展开
    console.log(result);
    
    let result = [...new Set(arr)];//使用扩展运算符展开
    console.log(result);
    
    
    
    //2.交集
    let arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 7];
    let arr2 = [4,5,6,6,5];
    let result = [...new Set(arr)].filter(item => new Set(arr2).has(item))
    
    //3.并集
    let arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 7];
    let arr2 = [4, 5, 6, 6, 5];
    let union = [...arr, ...arr2];
    let result = [...new Set(union)];
    
    //4.差集
    let arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 7];
    let arr2 = [4, 5, 6, 6, 5];
    let result = [...new Set(arr)].filter(item => !new Set(arr2).has(item))
    
    23、Map的介绍与API

ES6提供了Map数据结构,它类似于对象,也是键值对的集合,但是键的范围不限于字符串,各种类型的值(包括对象)都可以当做键。Map也实现的iterator接口,所以也可以使用扩展运算符和for...of进行遍历。

  1. size 返回元素的个数
  2. set 增加一个新元素,返回当前Map
  3. get 返回键名对象的值
  4. has 检测Map中是否包含某个元素,返回Boolean值
  5. clear 清空集合,返回undefined
    //Map其实就是升级版的对象,key由原来只能是字符串变成现在可以是对象
    let m = new Map();
    
    //添加元素
    m.set('name','哈哈');
    m.set('change', function() {
    console.log("我们可以改变你!");
    });
    let key = {
    school: "heda"
    }
    m.set(key,['郑州','开封明伦'])
    
    //删除
    m.delete('name');
    //获取
    m.get('change');
    //清空
    m.clear();
    for (const v of m) {
    console.log(v);
    }
    24、Class类的介绍

ES6提供了更接近传统语法(java ,c 都有类的概念)的写法,引入了class(类)这个概念,作为对象的模板,通过class关键字可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

  • class声明类
  • constructor定义构造函数初始化
  • extends继承父类
  • super调用父级构造方法
  • static 定义静态方法和属性
  • 父类方法可以重写
//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);

// ES6 写法
class Phone {
// 构造方法 名字固定 无法修改
// 在使用new 关键字 创建对象时自动调用
constructor(brand, price) {
this.brand = brand;
this.price = price;
}
// 方法必须使用该语法,不能使用ES5的对象完整形式
// call: function (params) {
// }
call() {
console.log('我可打电话');
}
}

let OnePlus = new Phone("1+",1999);
OnePlus.call();
 25、Class静态成员
class Phone {
// 静态属性 属于类不属于对象
static name = '手机';
static change() {
console.log('我可以改变世界');
}
}
let nokia = new Phone();
console.log(nokia.name);//undefined
console.log(Phone.name);//手机
26、ES5构造函数继承
unction Phone(brand, price) {
this.brand = brand;
this.price = price;
}

Phone.prototype.call = function () {
console.log('我可打电话');
}

function SmartPhone(brand, price, color, size) {
//此处this指向smartPhone 
Phone.call(this, brand, price);
this.color = color;
this.size = size;
}
//设置子级构造函数的原型
SmartPhone.prototype = new Phone;
// 声明子类的方法
SmartPhone.prototype.photo = function() {
console.log('我可以拍照');
}
SmartPhone.prototype.play = function() {
console.log('我可以玩游戏');
}
const chuizi = new SmartPhone('锤子',2499,'黑色','5.5inch');
console.log(chuizi);
27、ES6 Class类的继承
//ES6类的继承
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('小米',1099,'黑色','4.7inch');
xiaomi.call();
xiaomi.photo();
xiaomi.playGame();
28、getter和setter
//get 和 set
class Phone {
get price() {
console.log('价格属性被读取了');
}
set price(value) {
console.log('价格属性被赋值了');
}
}
// 实例化对象
let s = new Phone();
console.log(s.price);
29、数值扩展
Number.EPSILON // 是JavaScript表示的最小精度
console.log(0.1 + 0.2 === 0.3);
function equal(a, b) {
if (Math.abs(a - b) < Number.EPSILON) {
return true;
} else {
return false;
}
}
// 二进制和八进制
let b = 0b1010;
let o = 0o1010;
let d= 100;
let x = 0x10;
Number.isFinite //检测一个数值是否为有限数
console.log(Number.isFinite(100));
Number.isNaN //检测一个数值是否为NaN
console.log(Number.isNaN(100));
Number.parseInt // 字符串转证书
Number.parseInt('435')
Number.isInteger // 判断一个数是否为整数
Math.trunc // 将数字的小数部分抹掉
Math.trunc(3.5)
Math.sign // 判断一个数到底为正数 负数 还是零
30、对象方法扩展
//1. Object.is 判断两个值是否完全相等
console.log(Object.is(120, 120)); //跟===全等号很像,但有区别
console.log(Object.is(NaN, NaN)); // true
console.log(NaN === NaN); //false
//2. Object.assign 对象的合并
const config1 = {
host: 'localhost',
port: 2200,
name: 'admin',
password: '123',
haha: 'fvdvgb'
}
const config2 = {
host: 'https://baidu.com',
port: 5000,
name: 'ceshi',
password: '123456',
}
console.log(Object.assign(config1, config2));//此时config2会覆盖config1重名的属性值
//3. Object.setPrototypeOf 设置原型对象 Object.getPrototypeOf
const school = {
name: "heda"
}
const cities = {
xiaoqu: ['郑州', '开封']
}
Object.setPrototypeOf(school, cities);
console.log(Object.getPrototypeOf(school));

console.log(school);
31、模块化介绍、优势

模块化是指将一个大的程序文件,拆分成许多小问阿金,然后将小文件组合起来。

模块化的好处:

  • 防止命名冲突
  • 代码复用
  • 高维护性
32、浏览器使用ES6模块化

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

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

  • 分别暴露
  • 统一暴露
  • 默认暴露

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

  1. 通用方式 import * as m1 from “xxx.js”
  2. 简便形式 import m3 from “xx.js” 只能针对默认暴露
  3. 解构赋值形式:
    import {school as heda, teach} from “xxx.js”
    import {default as m3} from “xx.js”
    import {school, teach} from “xxx.js

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

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

相关文章

【设计模式】JAVA Design Patterns——Abstract-document

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

九州金榜|如果孩子胆小懦弱,如何家庭教育?

在孩子成长的过程中&#xff0c;孩子可能会出现胆小懦弱的表现&#xff0c;当孩子出现这个问题是&#xff0c;势必会对孩子成长造成影响&#xff0c;可能会影响孩子的社交&#xff0c;学习以及日常生活等。对此很多家长不明白哪地方出现了问题&#xff0c;就会着急。面对这种情…

速度背!24上软考信管“经典100道母题来了”!

距离软考考试的时间越来越近了&#xff0c;趁着这两周赶紧准备起来 今天给大家整理了——信息系统管理工程师经典100道母题&#xff08;含解析&#xff09;&#xff0c;有PDF版&#xff0c;可打印&#xff0c;每天刷一点。 1、微机系统中&#xff0c;&#xff08; &#xff09…

一键自动化博客发布工具,用过的人都说好(cnblogs篇)

cnblogs和其他的博客平台相比会比较复杂&#xff0c;需要设置的项目也比较多一些&#xff0c;弄懂了cnblogs的实现方式&#xff0c;那么你应该对selenium的整个框架使用已经烂熟于心了。 除了正常的标题&#xff0c;内容&#xff0c;摘要之外&#xff0c;cnblogs还需要设置个人…

操作系统原理与实验——实验十三多道批处理作业调度(作业不可移动)

关键代码 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{int hour;//当前小时int min;//当前分钟 }time; struct node{char name[20];//进程名time arrive;//到达就绪队列时间int zx;//执行时间(预期时间)int size;int ta…

用栈实现队列——leetcode刷题

题目要求我们只用栈的基本操作 push to top 入栈&#xff0c;peek from top 返回栈顶元素&#xff0c;pop from top 移除并返回栈顶元素&#xff0c;size 栈的大小&#xff0c;is_empty 判断栈是否为空&#xff0c;这几个函数来实现队列&#xff0c;也就是说&#xff0c;我们在…

建议收藏!如何选择高低温冲击试验箱厂家?

高低温冲击试验箱是实验室中不可或缺的重要设备之一&#xff0c;它在许多领域都发挥着关键作用。因此选择合适的高低温冲击试验箱厂家是非常关键的&#xff0c;因为正规厂家的正规产品能直接影响到产品实验的准确性和效率。下面我们一起来了解一下关于选择高低温冲击试验箱厂家…

从源头把控风险:集团多主体合规管理实战技巧分享

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 集团合规管理中&#xff0c;为了规避内外部利益冲突&#xff0c;需要对员工、供应商、经销商、客户、黑名单企业等多主体及其关联主体之间&#xff0c;进行多维度、多层级的关系挖掘与排查&#xff0c;避免利益…

OpenHarmony 实战开发(南向)-Docker编译环境搭建

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。 基于HPM的Docker…

react、vue 把要渲染的元素挂到指定节点。

react、vue 把要渲染的元素挂到指定节点。 文章目录 vue3 的 Teleportreact 的 createPortal 在日常工作中&#xff0c;需要封装一些定制的浮动模态框&#xff0c;但是每个弹框在不同的父级元素中&#xff0c;那弹框的层级我们是没有办法控制到的&#xff0c;所有有必要把它统一…

2024年钉钉直播回放怎么永久保存

钉钉群直播回放下载工具我已经打包好了&#xff0c; 钉钉群直播回放下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.再继续解压M3U8逍遥一仙下载器 3.进入M3U8逍遥一仙下载器文…

Pytorch快速上手

Pytorch快速上手 一、加载数据集 &#xff08;Dataset&#xff09; 加载数据集需要继承Dataset&#xff0c;通常情况下需要实现__init__方法、__getitem__方法以及__len__方法。 案例一&#xff1a; import osimport torch from torch.utils.data import Dataset from PIL …

SqlDeveloper字体大小设置

菜单栏字体&#xff1a; C:\Users\xxx\AppData\Roaming\SQL Developer\system19.2.1.247.2212\o.sqldeveloper 下的ide.properties 修改 Ide.FontSize.Aqua30 编辑器字体&#xff1a;

特定消谐技术:SHEPWM调制方法

简介 特定消谐技术是通过计算PWM波的开关时刻&#xff0c;消除特定的低阶谐波。其基本理论是恰当地控制逆变器脉宽调制电压的波形&#xff0c;通过脉宽平均法把逆变器输出的方波电压转换成等效的正弦波&#xff0c;以消除某些特定的谐波。本文对特定谐波消除方法的基本原理进行…

SpringBoot启动流程源码解析

目录 一、SpringApplication构造方法解析 1. web应用类型 2. BootstrapRegistryInitializer 3. ApplicationContextInitializer 4. ApplicationListener 5. 推断Main方法所在类 二、SpringApplication.run(String... args)方法解析 1.创建DefaultBootstrapContext 2.获…

算法day02

1、202. 快乐数 如上题所述&#xff1a; 在该题意规则下&#xff0c;所有的数字变化会有两种情况&#xff0c;其一最后是有的会变化成恒为1的数&#xff1b;其二是有的数会变化会呈现成有规律的环&#xff0c;分别如下图所示&#xff1a; 可以近似的理解为图一就是一个环&#…

Oracle 23ai rpm安装配置及问题处理

1.安装介质下载 Oracle 23ai 免费版本已经正式发布&#xff0c;Oracle官网提供免费的下载试用&#xff08;无需账号&#xff09;地址如下 官网下载和试用地址 Oracle Database 23ai Free&#xff1a; https://www.oracle.com/database/free/get-started 三种安装方式可选…

Cheetah3D for Mac - 轻松打造专业级3D作品

对于追求专业级3D作品的设计师来说&#xff0c;Cheetah3D for Mac无疑是一款不可多得的工具。 这款软件拥有强大的建模、渲染和动画功能&#xff0c;能够满足您在3D设计方面的各种需求。通过简单的操作&#xff0c;您可以轻松构建出复杂的3D模型&#xff0c;并为其添加逼真的材…

js自定义实现类似锚点(内容部分滚动)

场景&#xff1a; 效果图如上&#xff0c;类似锚点&#xff0c;但是屏幕不滚动。高度计算我不是很熟练。for循环写的比较麻烦。element plus 和Ant Design有类似组件效果。 html&#xff1a; <template><div><div style"height: 400px;" class&q…

新手如何便捷使用HTTP代理

便捷地使用HTTP代理主要涉及到设置和使用两个步骤。下面是在不同环境和使用场景下如何设置和使用HTTP代理的详细介绍: 1.浏览器设置: 打开浏览器的设置菜单&#xff0c;找到网络设置或代理设置的选项。在代理设置中&#xff0c;填写代理服务器的地址和端口号。不同的浏览器设…