当前位置: 首页 > news >正文

前端架构师之02_ES6_高级

1 类和继承

1.1 class类

JavaScript 语言中,生成实例对象的传统方法是通过构造函数。

// ES5 创建对象
// 创建一个类,用户名 密码
function User(name,pass){// 添加属性this.name = name;this.pass = pass;
}
// 用 原型 添加方法
User.prototype.showName=function(){// 输出名字alert(this.name);
}
User.prototype.showPass=function(){alert(this.pass);
}
// new 出来一个对象,用户名是admin,密码是123
var u1 = new User('admin','123');
u1.showName();
u1.showPass();

上面这种写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习这门语言的程序员感到困惑。

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

新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的class改写,就是下面这样。

// ES6 创建对象
class User {// constructor 构造函数// 构造器:等价于es5中的构造函数constructor (name,pass){this.name = name;this.pass = pass;}// 注意,定义方法的时候,前面不需要加上function这个关键字// 直接把函数定义放进去了就可以了。// 另外,方法与方法之间不需要逗号分隔,加了会报错。showName() {alert('my name is ' + this.name);}showPass() {alert('my password is ' + this.pass);}
}var u1 = new User('admin','123');
u1.showName();
u1.showPass();

ES6 的类,完全可以看作构造函数的另一种写法。

// 类的数据类型就是函数,类本身就指向构造函数
class User {// ...
}typeof User // "function"
User === User.prototype.constructor // true

使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。

构造函数的prototype属性,在 ES6 的“类”上面继续存在。

事实上,类的所有方法都定义在类的prototype属性上面。

constructor 方法

constructor()方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。

一个类必须有constructor()方法,如果没有显式定义,一个空的constructor()方法会被默认添加。

class User {
}// 等同于
class User {constructor() {}
}

注:实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。

1.2 static静态方法

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。

如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

class Box{static a(){return "我是Box类中的,实例方法,无须实例化,可直接调用!"}
}
// 通过类名直接调用
// 我是Box类中的,实例方法,无须实例化,可直接调用!
console.log(Box.a());

注意:静态方法只能在静态方法中调用,不能在实例方法中调用

class Box {static a() {return "我只允许被静态方法调用哦!"}static b() {// 通过静态方法b来调用静态方法aconsole.log(this.a());}
}
// 输出:我只允许被静态方法调用哦
Box.b();

1.3 继承

Class 可以通过extends关键字实现继承,让子类继承父类的属性和方法。extends 的写法比 ES5 的原型链继承,要清晰和方便很多。

// ES5继承
// 创造一个VIP用户,继承User普通用户
function User(name,pass){this.name=name;this.pass=pass;
}
User.prototype.showName=function(){alert(this.name);
}
User.prototype.showPass=function(){alert(this.pass);
}// 继承用户
function VipUser(name,pass,level){User.call(this,name,pass);this.level=level; // VipUser 的属性
}
// 接收User里面的原型对象
VipUser.prototype=new User();
// 创建VipUser自己的原型对象
VipUser.prototype.showLevel=function(){alert(this.level);
}
// 传入参数,用户名,密码,等级
var v1=new VipUser('zs','111','3');
v1.showName();
v1.showPass();
v1.showLevel();
// ES6中的继承
class User {constructor (name,pass){this.name=name;this.pass=pass;}showName(){return this.name;}showPass(){alert(this.pass);}
}// extends 继承,扩展
class VipUser extends User{// constructor 创建属性 子类也有自己的类,也有自己的属性(继承的属性在前,新创建的在后)constructor(name,pass,level){// 调用父类的 constructor(x, y)super(name,pass);// 自己的属性this.level=level;}// 方法在这里不需要继承原来的方法了,因为super已经把父级的方法都继承过来了// 直接添加新东西就行了showName(){return this.name + ' ' + super.showName();}showLevel(){alert(this.level);super.show}
}
// 直接调用就可以了
var v1=new VipUser('zs','111','3');v1.showName();
v1.showPass();
v1.showLevel();

super在这里表示父类的构造函数,用来新建一个父类的实例对象。

子类必须在constructor()方法中调用super(),否则就会报错。

为什么子类的构造函数,一定要调用super()?

  • 原因就在于 ES6 的继承机制,与 ES5 完全不同。
  • ES5 的继承机制,是先创造一个独立的子类的实例对象,然后再将父类的方法添加到这个对象上面,即“实例在前,继承在后”。
  • ES6 的继承机制,则是先将父类的属性和方法,加到一个空的对象上面,然后再将该对象作为子类的实例,即“继承在前,实例在后”。
  • 这就是为什么 ES6 的继承必须先调用super()方法,因为这一步会生成一个继承父类的this对象,没有这一步就无法继承父类。
  • 注意,这意味着新建子类实例时,父类的构造函数必定会先运行一次。
  • 另外,在子类的构造函数中,只有调用super()之后,才可以使用this关键字,否则会报错。
  • 这是因为子类实例的构建,必须先完成父类的继承,只有super()方法才能让子类实例继承父类。

2 Promise对象

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。

在使用ES5的时候,在多层嵌套回调时,写完的代码层次过多,很难进行维护和二次开发,ES6认识到了这点问题,现在promise的使用,完美解决了这个问题。

2.1 回调地狱

现在有6个div,我想给每个div都添加一个移动的动画,并且先执行第一个,再执行第二个,再执行第三个,以此类推。

// 回调地狱 : 回调函数多层嵌套
$(".scene p").eq(0).animate({marginTop: '-200px'
}, 1000, function () {$(".scene p").eq(1).animate({marginTop: '200px'}, 1000, function () {$(".scene p").eq(2).animate({width: '200px'}, 1000, function () {$(".scene p").eq(3).animate({height: '200px'}, 1000, function () {$(".scene p").eq(4).animate({marginLeft: '-200px'}, 1000, function () {$(".scene p").eq(5).animate({marginTop: '200px'},1000)})})})})
})

虽然可以实现效果,但是需要嵌套很多层的回调函数,如果需求量增多,回调层级会更多,我们把这种多次的回调称之为 “回调地狱”。

promise用来解决回调地狱的问题,把异步的代码用同步的方式来实现。

2.2 基本使用

Promise对象是一个构造函数,用来生成Promise实例。

const promise = new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve(value);} else {reject(error);}
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

Promise执行多步操作非常好用,那我们就来模仿一个多步操作的过程。

比如,早上起床上课分了几个步骤:

  1. 起床洗漱
  2. 食堂吃饭
  3. 教室上课
let state = 1;
function step1(resolve, reject) {console.log('起床洗漱');if (state == 1) {resolve('洗漱完成');} else {reject('洗漱失败');}
}function step2(resolve, reject) {console.log('食堂吃饭');if (state == 1) {resolve('吃饭完成');} else {reject('吃饭失败');}
}function step3(resolve, reject) {console.log('教室上课');if (state == 1) {resolve('上课完成');} else {reject('上课失败');}
}new Promise(step1).then(function (val) {console.log(val);return new Promise(step2);
}).then(function (val) {console.log(val);return new Promise(step3);
}).then(function (val) {console.log(val);return val;
});

2.3 promise方法

promise的all方法和race方法

  • all:当两个异步操作都成功完成后,再执行的逻辑
  • race:比赛;谁快获取谁;最先得到的异步操作,即执行下面的业务逻辑
  • all()和race()中的参数必须是promise实例
// all和race的区别
// all:100个人跑步跑步:等100个跑到终点才结束
// race:只要第一个跑到终点就结束,后面的99个就不管了
Promise.all([new Promise(step1), new Promise(step2)]).then(function (res) {console.log(res);
});Promise.race([new Promise(step1), new Promise(step2)]).then(function (res) {console.log(res);
});

3 Proxy预处理

当我们在操作一个对象或者方法时会有几种动作,比如:在运行函数前初始化一些数据,在改变对象值后做一些善后处理。这些都是预处理函数,也叫做钩子函数。

Proxy的存在就可以让我们给函数加上这样的钩子函数,你也可以理解为在执行方法前预处理一些代码。你可以简单的理解为他是函数或者对象的生命周期。

声明Proxy

我们用new的方法对Proxy进行声明。可以看一下声明Proxy的基本形式。

new Proxy({},{});

这里有两个花括号,第一个花括号就相当于我们方法的主体,后边的花括号就是Proxy代理处理区域,相当于我们写钩子函数的地方。

实现一个Proxy函数

var pro = new Proxy({add: function (val) {return val + 10;},name: 'Hello World!'
}, {get:function(target,key,property){console.log('调用Get方法');return target[key];}
});console.log(pro.name);
// 先输出了come in Get。相当于在方法调用前的钩子函数。

get属性

get属性是在你得到某对象属性值时预处理的方法,他接受三个参数

  • target:目标对象
  • key:属性名
  • property:proxy 实例本身

set属性

set属性是值你要改变Proxy属性值时,进行的预先处理。它接收四个参数

  • target:目标对象
  • key:属性名
  • value:属性值
  • receiver:Proxy 实例本身
var pro = new Proxy({add: function (val) {return val + 10;},name: 'Hello World!'
}, {get: function (target, key) {console.log('调用Get方法');return target[key];},set: function (target, key, value, receiver) {console.log(`调用Set方法,设置值 ${key} = ${value}`);return target[key] = value;}
});console.log(pro.name);
pro.name = '你好世界!';
console.log(pro.name);

4 初识模块化开发

模块化是软件的一种开发方式,利用模块化可以把一个非常复杂的系统结构细化到具体的功能点,每个功能点看作一个模块,然后通过某种规则把这些小的模块组合到一起,构成模块化系统。

我们从一开始学习前端,我们没有使用模块化,主要在我们对应的js这里的代码。我们就是把相关功能放在我们对应的js中,在页面中引入js来完成相关的功能。

4.1 传统JavaScript开发的弊端

传统浏览器端JavaScript在使用的时候存在的两大问题

  • 文件依赖
    • 在JavaScript中文件的依赖关系是由文件的引入先后顺序决定的。在开发过程中,一个页面可能需要多个文件依赖,但是仅从代码上是看不出来各个文件之间的依赖关系,这种依赖关系存在不确定性。如果更改文件的引入先后顺序,就很有可能导致程序错误。
  • 命名冲突
    • 在JavaScript中,文件与文件之间是完全开放的,并且语法本身不严谨,如果在后续引入的文件中声明了一个同名变量,则后面文件的变量会覆盖前面文件中的同名变量,这样会导致程序存在潜在的不确定性。

4.2 模块化的概念

**现实生活中手机的模块化 **

从生产角度来看,模块化是一种生产方式,体现了以下两个特点:

  • 生产效率高:灵活架构,焦点分离;多人协作互不干扰;方便模块间组合、分解。
  • 维护成本低:可分单元测试;方便单个模块功能调试、升级。

软件中的模块化开发

从程序开发角度,模块化是一种开发模式,有以下两个特点:

  • 生产效率高:方便代码重用,别人开发好的模块功能可以直接拿过来使用,不需要重复开发类似的功能。
  • 维护成本低:软件开发周期中,由于需求经常发生变化,最长的阶段并不是开发阶段,而是维护阶段,使用模块化开发的方式更容易维护。

5 模块成员的导入和导出

5.1 exports和require()

在模块化开发中,一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到。

如何得到模块内部定义的变量和函数呢?

Node.js为开发者提供了一个简单的模块系统,exports是模块公开的接口,require()用于从外部获取一个模块的接口,即获取模块的exports对象。

如何在一个文件模块中获取其他文件模块的内容?

  • 首先需要使用require()方法加载模块;
  • 然后在被加载的模块中使用exports或者module.exports对象向外开放变量、函数等;require()函数的作用是加载文件并获取该文件中的module.exports对象接口。
// 新建info.js文件作为被加载模块
// 声明一个add()函数用来实现加法功能
const add = (n1, n2) => n1 + n2;
// exports对象向模块外开放add()函数
exports.add = add;// 新建b.js文件,实现在b.js模块中导入info.js模块
// 模块导入时,模块的后缀.js可以省略
const info = require('./info');
// 结果为:30
console.log(info.add(10, 20));// 打开命令行工具,切换到b.js文件所在的目录,并输入“node b.js”命令。

总结Node.js的模块化开发的步骤:

  • 通过exports对象对模块内部的成员进行导出。
  • 通过require()方法对依赖的模块进行导入操作。

5.2 module.exports

// 新建info.js文件作为被加载模块
// 声明一个greeting()函数用于实现打招呼功能
const greeting = name => `hello ${name}`;
// 使用module.exports对象向模块外开放greeting()函数
module.exports.greeting = greeting;// 新建a.js文件,实现在a.js模块中导入info.js模块
// 模块导入时,模块的后缀.js可以省略
const a = require('./info');
// 输出模块中函数的值:hello zhangsan
console.log(a.greeting('zhangsan'));// 打开命令行工具,切换到a.js文件所在的目录,并输入“node a.js”命令。

5.3 exports和module.exports的区别

exports和module.exports都可以对外开放变量或函数,那么它们之间有什么区别?

exports和module.exports的区别

  • Node.js提供的exports对象是module.exports对象的别名(地址引用关系),导出对象最终以module.exports对象为准。
  • 在使用上,module.exports对象可以单独定义返回数据类型,而exports对象只能是返回一个object对象。
  • 默认情况下,exports和module.exports指向同一个对象,也就是说指向同一个内存空间;
  • 当exports和module.exports指向两个不同对象时,导出对象最终以module.exports对象的导出为准。

exports和module.exports指向同一个对象的情况

// 新建info.js文件作为被加载模块
const greeting = name => `hello ${name}`;
const x = 100;
// 使用exports对象导出x变量
exports.x = x;
// 使用module.exports对象导出greeting()函数
module.exports.greeting = greeting;// 新建a.js文件,实现在a.js模块中导入info.js模块
// 模块导入时,模块的后缀.js可以省略
const a = require('./info');
// 输出模块中函数的值
console.log(a);// 打开命令行工具,切换到a.js文件所在的目录,并输入“node a.js”命令。

当exports和module.exports指向同一个对象时,以下两种写法是等价的:

  • exports.属性名 = 属性值;
  • module.exports.属性名 = 属性值;

exports和module.exports指向不同对象时的情况

// 新建info.js文件作为被加载模块
const greeting = name => `hello ${name}`;
const x = 100;
exports.x = x;
module.exports.greeting = greeting;
// 使用module.exports重新指向一个属性名为name,值为zhangsan的对象
module.exports = {name: 'zhangsan',
};// 新建a.js文件,实现在a.js模块中导入info.js模块
// 模块导入时,模块的后缀.js可以省略
const a = require('./info');
// 输出模块中函数的值
console.log(a);// 打开命令行工具,切换到a.js文件所在的目录,并输入“node a.js”命令。

当exports和module.exports指向不同对象时,以module.exports对象的导出结果为准。

6 模块化操作

在ES5中我们要进行模块华操作需要引入第三方类库,随着前后端分离,前端的业务日渐复杂,ES6为我们增加了模块化操作。

现在前端开发的主角,是基于ESM(ES6 Module),利用ESM操作,可以让我们更方便的进行模块化开发。

模块化操作主要包括两个方面。

  • export:负责进行模块化,也是模块的输出。
  • import:负责把模块引,也是模块的引入操作。

想要使用ES6语法需要给script标签添加上 type="module" 属性,但是这个方式只适合测试使用,因为兼容性比较差,建议项目中使用插件解决对应的转化,可以使用nodejs解决。

基本用法

export可以让我们把变量,函数,对象进行模块话,提供外部调用接口,让外部进行引用。

注:关键词 export {} 后面的花括号不能少。

//temp.js
export var a = 'Hello World!';// 然后在index.js中以import的形式引入。
// index.js
import { a } from './temp.js';
console.log(a);

注:引入进来的内容必须用{}包括起来,路径中必须用必须添加./或者…/或者/ 否则会报错。

这就是一个最简单的模块的输出和引入。

多变量输出

声明3个变量,需要把这3个变量都进行模块化输出,这时候我们给他们包装成对象就可以了。

var a = '你好世界';
var b = 'HelloWorld';
var c = 'H5website';export {a,b,c}

函数的模块化输出

export function add(a,b){return a + b;
}

as的用法

有些时候我们并不想暴露模块里边的变量名称,而给模块起一个更语义话的名称,这时候我们就可以使用as来操作。

var a = '你好世界';
var b = 'HelloWorld';
var c = 'H5website';export {a as x,b as y,c as z
}import * as abc from './地址';

导入时使用 星号 表示全部

default的使用

加上default相当是一个默认的入口。在一个文件里export default只能有一个。

默认入口导入时不需要再加大括号,因为只可能对应一个默认的。

我们来对比一下export和export default的区别。

export var a ='HelloWorld';
export function add(a,b){return a+b;
}// 对应导入方式
import { a,add } form './temp';//也可以分开写
let a = 'HelloWorld';
export default a;// 对应导入方式
import str from './temp';

相关文章:

前端架构师之02_ES6_高级

1 类和继承 1.1 class类 JavaScript 语言中,生成实例对象的传统方法是通过构造函数。 // ES5 创建对象 // 创建一个类,用户名 密码 function User(name,pass){// 添加属性this.name name;this.pass pass; } // 用 原型 添加方法 User.prototype.sho…...

VScode多文件编译/调试配置

之前都是在Visual Studio写C/C,最近想换到VScode,折腾半天把launch.json和tasks.json配好了(虽然不懂为什么,但确实能用了),在此做个记录。 参考资料:1,2,3 环境&#…...

K折交叉验证——cross_val_score函数使用说明

在机器学习中,许多算法中多个超参数,超参数的取值不同会导致结果差异很大,如何确定最优的超参数?此时就需要进行交叉验证的方法,sklearn给我们提供了相应的cross_val_score函数,可对数据集进行交叉验证划分…...

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题,并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…...

React简介

react作为前端主流框架之一,因其语法接近原生JavaScript语法而广受欢迎。其生态丰富,常用的就有react-router、react-redux等插件,还有与其匹配的UI组件库antd。而且其还有用于移动端开发的react-native库,因此,react值…...

链表经典面试题(一)

面试题 1.反转链表的题目2.反转链表的图文分析3.反转链表的代码实现 1.反转链表的题目 2.反转链表的图文分析 我们在实现反转链表的时候,是将后面的元素变前面,前面的元素变后面,那么我们是否可以理解为,用头插法的思想来完成反转链表呢&…...

体验亚马逊的 CodeWhisperer 感觉

CodeWhisperer 是亚马逊推出的辅助编程工具,在程序员写代码时,它能根据其内容生成多种代码建议。 CodeWhisperer 目前已支持近10几种语言,我是用 java 语言,用的开发工具是 idea,说一下我用的情况。 亚马逊云科技开发…...

6、行内元素和块元素

6、行内元素和块元素 一、块元素 无论内容多少,该元素独占一行 如p标签、标题标签(h1-h6…) 二、行内元素 内容撑开宽度、左右都是行内元素的可以排在一行 一些元素如果能够摆放在一行都可以用行内元素,但是如果需要换行就需…...

LeetCode 面试题 08.01. 三步问题

文章目录 一、题目二、Java 题解 一、题目 三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。 示例1: 输入&…...

[CSCCTF 2019 Qual]FlaskLight 过滤 url_for globals 绕过globals过滤

目录 subprocess.Popen FILE warnings.catch_warnings site._Printer 这题很明显就是 SSTI了 源代码 我们试试看 {{7*7}} 然后我们就开始吧 原本我的想法是直接{{url_for.__globals__}} 但是回显是直接500 猜测过滤 我们正常来吧 {{"".__class__}} 查看当前…...

1分钟快速实现Redis数据对比

在上篇「Redis高效、安全的不停机数据迁移方案」的文章中,介绍了NineData在Redis迁移场景下的性能和优势。因为数据在主备、多云和多区域环境之间的迁移流动,难免会产生数据一致性的问题,而结构与数据不一致往往是导致故障的原因之一。所以&a…...

ASUS华硕天选4笔记本电脑FX507VV原厂Windows11系统

下载链接:https://pan.baidu.com/s/1W9tedHI3iFjaHju5eLkQ6g?pwd8dl2 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华硕电脑管家、奥创控制中心等预装程序 由于时间关系,绝大部分资料没有上传,不是想要的型号,请联系客服获取。...

Vue3配置路由

文章目录 一、创建index.js二、main.js的配置三、在App.vue中引入 一、创建index.js 在src文件夹中创建router文件夹,并在其中创建index.js文件 //引入路由对象 import { createRouter,createWebHistory } from vue-router import PufMac from "../views/puf…...

力扣 -- 97. 交错字符串

解题步骤: 参考代码: class Solution { public:bool isInterleave(string s1, string s2, string s3) {int ms1.size();int ns2.size();//先判断s1的长度s2的长度是否等于s3的长度,如果不等,则s1和s2不可能拼接成s3if(mn!s3.size…...

【剑指Offer】4.二维数组中的查找

题目 在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该…...

独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”

各位CSDN的uu们你们好呀,今天依旧是小雅兰的51单片机的内容,内容主要是:独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位,下面,让我们进入51单片机的世界吧!&a…...

chrome extensions mv3通过content scripts注入/获取原网站的window数据

开发插件的都知道插件的content scripts和top window只共享Dom不共享window和其他数据,如果想拿挂载在window的数据还有点难度,下面会通过事件的方式传递cs和top window之间的数据写一个例子 代码 manifest.json 这里只搞了2个js,content.…...

震坤行API接口聚合解析,实现根据ID取商品详情

震坤行是一个工业品服务平台,提供了API接口供开发者使用。要根据ID获取商品详情,您需要使用震坤行API接口并进行相应的请求。 以下是使用震坤行API接口根据ID获取商品详情的示例代码(使用Python编写): import reques…...

mencpy和strcpy的区别?

今天刷题时遇到了这个问题,记录一下。 strcpy比较简单,就是拷贝字符串,遇到\0时结束拷贝。 memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100],b[50]; memcpy(b, a, sizeof(b)); 总结…...

机器人过程自动化(RPA)入门 8. 异常处理、调试和日志记录

有时,自动化程序可能无法执行。为了处理此类情况,我们使用异常处理活动。在本章中,我们将从UiPath中可用的各种类型的异常处理方法、您可能遇到的异常以及如何处理它们开始。我们还将学习日志记录。本章涉及的一个重要主题是调试,以检查工作流是否正常工作,并更正任何错误…...

tomcat总结笔记

文章目录 Tomcat1、什么是tomcat?2、rpm安装jre环境3、源码安装jdk环境4、安装tomcat --源码安装5、相关目录文件webappsTomcat 配置文件目录介绍(conf)tomcat的相关管理命令在$prefix/bin目录下 实战1、:配置nginx动静分离实战2、配置基于t…...

中断向量控制器(NVIC)

1. 什么是中断 在处理器中,中断是一个过程,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中止当前程序的执行,转而去为处理紧急的事件,待处理完毕后再返回被打断的程序处继续往下执行…...

QT配置FFmpeg出现错误原因

文章目录 QT配置ffmpeg出现: undefined reference to "avcodec_version"没有配置环境变量QT和FFmpeg的版本不对应直接添加FFmpeg的头文件没有在.pro文件添加路径 QT 程序异常退出没有在debug文件里面存放dll库 QT配置ffmpeg出现: undefined re…...

列出使用Typescript的一些优点?

使用Typescript有以下优点: 类型安全:Typescript是一种静态类型语言,它要求在编码阶段明确定义变量和函数的类型。这种类型安全可以减少在运行时出现错误的可能性,并提高代码的可读性和可维护性。代码可读性和可维护性&#xff1…...

如何做好测试?(四)集成测试(Integration Testing, IT)

1. 集成测试的详细介绍: 集成测试(Integration Testing, IT),是一种软件测试方法,旨在验证不同组件、模块或子系统之间的交互和集成是否正常工作。它侧重于测试系统的组件之间的接口和数据传递,以确保它们…...

二叉树前序、中序、后序遍历(递归法、迭代法)

前序遍历:(练习题) 迭代法一: int TreeSize(struct TreeNode* root){return rootNULL?0:TreeSize(root->left)TreeSize(root->right)1; }int* preorderTraversal(struct TreeNode* root, int* returnSize){if(rootNULL){*…...

npm ,yarn 更换使用国内镜像源,淘宝源

背景 文章首发地址 在平时开发当中,我们经常会使用 Npm,yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的,如果没有梯子的话。下载速度会特别慢。那有没有方法解决呢? 其实是有的,设置国内镜像即可&#x…...

真正理解浏览器渲染更新流程

浏览器渲染更新过程 文章目录 浏览器渲染更新过程帧维度解释帧渲染过程一些名词解释Renderer进程GPU进程rendering(渲染) vs painting(绘制)⭐位图纹理Rasterize(光栅化) 1. 浏览器的某一帧开始:vsync2. Input event handlers3. requestAnimationFrame4. 强制重排(可…...

市场调研的步骤与技巧:助你了解市场需求

在当今快速发展的市场中,进行有效的市场研究对于了解消费者的行为、偏好和趋势至关重要。适当的市场研究可以帮助公司获得对目标受众的有价值的见解,创造更好的产品和服务,并提高客户满意度。今天,小编和大家一起讨论一下怎么做市…...

ansible的个人笔记使用记录-个人心得总结

1.shell模块使用,shell模块------执行命令,支持特殊符 ansible all -m shell -a yum -y install nginx ansible all -m shell -a systemctl restart nginx ansible all -m shell -a systemctl stop nginx && yum -y remove nginx2. file模块…...

一个专门做标题的网站/推广业务

我目前正在浏览URL并在访问/抓取网站时抓取数据 .有时一个网站将有一个不合理的长加载时间,没有错误,但不会完全加载,以允许chromedriver / urlopen完成/继续脚本,只是保持不稳定 .动态测试元素的存在在这种情况下不起作用&#x…...

如何对网站进行管理/有哪些网站可以免费推广

算法提高 三角形面积 时间限制:1.0s 内存限制:256.0MB 问题描述   由三角形的三边长,求其面积。   提示:由三角形的三边a,b,c求面积可以用如下的公式:   s(abc)/2    输入格式   由空…...

深圳建设工程造价管理站/百度论坛

2019独角兽企业重金招聘Python工程师标准>>> 10 月 23 日,EGO 北京分会会员、PingCAP 联合创始人兼 CTO 黄东旭作为 EGO 线上分享第二季嘉宾,与超过 400 位 EGO 会员交流了自己在开源软件和创业方面的感悟。本文为根据口述内容整理的实录。 口…...

黑料社2023/搜索引擎优化的核心本质

https://www.qikqiak.com/...

wix建设网站教程/泉州关键词快速排名

2019独角兽企业重金招聘Python工程师标准>>> 最大熵原理 最大熵原理是在1957 年由E.T.Jaynes 提出的,其主要思想是,在只掌握关于未知分布的部分知识时,应该选取符合这些知识但熵值最大的概率分布。因为在这种情况下,符…...

wordpress报表/微信拓客的最新方法

什么是路由? 根据不同的url展示不同的页面或者数据。 分类:路由分为前端路由和后端路由。 前端路由:主要用于单页面的开发,根据用户请求的地址来渲染不同的页面。前端路由不会经过后端,而是根据hash值的变化进行页面数…...