JavaScript青少年简明教程:面向对象编程入门
JavaScript青少年简明教程:面向对象编程入门
JavaScript 支持多种编程范式(programming paradigms),即支持多种不同的编程风格和方法。
前面介绍的编程方式,主要是面向过程编程(Procedural Programming)它关注于通过过程(或称为函数、子程序)来组织程序的逻辑。面向过程编程强调将程序分解成多个过程,这些过程以顺序执行的方式处理数据和操作。它的核心思想是将程序分成多个模块(过程)来处理特定任务,常常涉及到数据和操作的分离。它是命令式编程(Imperative Programming)的一种具体风格。
【命令式编程(Imperative Programming)是一个广泛的范式,关注如何通过一系列的步骤来改变程序的状态。
面向过程编程(Procedural Programming)是命令式编程的一种具体实现,强调通过过程(函数)来组织和管理程序的逻辑。】
JavaScript还支持面向对象编程(Object-Oriented Programming, OOP)、函数式编程(Functional Programming)、事件驱动编程(Event-Driven Programming)等。
【面向对象编程通过封装数据和行为到对象中来组织代码。
事件驱动编程基于事件的触发和处理,常用于用户界面的交互和异步操作。
函数式编程将计算视为函数的应用,注重避免副作用和状态改变,函数是头等公民。
通过支持多种编程风格和方法,允许开发者选择最适合他们问题的解决方案,或混合使用这些范式,以创建高效、可维护的代码。】
初学者开始重点学习关注的编程范式,一般而言是面向过程编程和面向对象编程。本节简要介绍JavaScript 面向对象编程知识。
JavaScript 的面向对象编程特性与传统的面向对象编程语言(如 Java 或 C++)有一些不同,但它提供了足够的功能来实现复杂的面向对象设计。
在 JavaScript 中,几乎所有的数据类型都是对象,或可以看作是对象。对象是具有属性(键-值对)和方法(函数)的数据结构。
JavaScript 使用原型链而不是类来实现继承。每个对象都有一个内部链接指向另一个对象,称为它的原型。ES6 引入了 class 关键字,提供了一种更接近传统 OOP 语言的语法糖,但底层仍然基于原型。
特别提示:一些讲解资料对Property和attribute翻译,有点太随意或混乱,为避免误解,特此予先说明。在 Web 开发中,attribute 通常指 HTML 元素的属性,而 property 则更多指 DOM 元素的属性。在 JavaScript 中,将 Property 译为属性、attribute 译为特性是比较常见的做法。 关于JavaScript的Property 权威链接 https://developer.mozilla.org/en-US/docs/Glossary/Property/JavaScript
也可以参看,编程语言中的Class、Object、Property、attribute、field、Method、Event https://blog.csdn.net/cnds123/article/details/106031884
JavaScript 的对象
对象(Object) 是 JavaScript 的一种数据类型。它用于存储各种键值集合和更复杂的实体。可以通过 Object() 构造函数或者使用对象字面量的方式创建对象。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object
对象则用来存储键值(key: value)对也称为名称-值(name-value)对的集合,其中的值可能是数据或函数。键和值之间用冒号分隔,键值对之间用逗号分隔,整个对象被大括号包围。也有人说,对象是属性(properties)的无序集合,每个属性都有一个名称和一个值。
例如:
let obj = {name: 'John',age: 30
};
在这个例子中,'name’和’age’是对象的键,'John’和30是对应的值。
【对象可以被看作是属性(键值对)的集合,其中每个属性都有一个名称和一个对应的值。这些值可以是数据类型(比如字符串、数字、布尔值等),也可以是函数(称为方法)。对象中的属性是无序的,可以通过属性名来访问和操作对应的值。
对象的表示方式是使用大括号 {} 包围键值对,每个键值对之间使用逗号 , 分隔。键和值之间使用冒号 : 分隔。】
JavaScript 对象是动态的——属性(properties)通常可以添加和删除。这一点和C++、Java这类传统的面向对象编程语言需要先定义类再定义对象的做法不同,直到ES6(ECMAScript 6,ECMAScript 2015 )发布之前 JavaScript没有定义类的语法。
可以使用以下方式添加属性:
使用点(.)操作符:obj.property = value;
使用方括号([])操作符:obj["property"] = value;
可以使用以下方式删除属性:
使用delete关键字:delete obj.property;
使用delete关键字和方括号操作符:delete obj["property"];
例如:
let person = {name: "John",age: 20
};person.gender = "Male"; // 添加属性
console.log(person); // {name: "John", age: 20, gender: "Male"}delete person.age; // 删除属性
console.log(person); // {name: "John", gender: "Male"}
注意,访问不存在的属性将返回undefined。
JavaScript对象除了维护自己的属性集,还继承另一个对象的属性,即它的“原型”(prototype)。这种“原型继承”是 JavaScript 的一个关键特性(特征、feature)。JavaScript中区分直接在对象上定义的属性和从原型对象继承的属性是很重要的。JavaScript 使用术语“自有属性”来指代非继承属性。
原型链是 JavaScript 中实现继承的核心概念。当访问一个对象的属性时,JavaScript 引擎首先在该对象本身查找,如果找不到,它会沿着原型链向上查找,直到找到该属性或到达原型链的末端。
原型链的顶端是 Object.prototype,所有对象都直接或间接地继承自它。当你使用 new 操作符创建一个新对象时,这个对象的内部属性 [[Prototype]] 会指向其构造函数的原型对象。这样,所有实例对象都会连接到同一个原型对象,形成一个原型链。
可以使用hasOwnProperty()方法来区分自有属性和继承属性。
例如:
function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log("Hello, " + this.name + "!");
};let person = new Person("John");
person.sayHello(); // 输出:Hello, John!console.log(person.hasOwnProperty("name")); // 输出:true
console.log(person.hasOwnProperty("sayHello")); // 输出:false
在上面的例子中,Person是一个构造函数,person是通过该构造函数创建的对象。name属性是在对象上直接定义的,因此它是一个自有属性。sayHello方法是定义在原型对象上的,因此它是一个继承属性。
前面提到过,JavaScript中的对象类型包括:
1、普通对象(Plain objects):是指用户自定义的对象类型。这些对象通常是通过使用构造函数或类来定义的。在JavaScript中,有多种方式可以创建对象。在ES6及以后的版本中,JavaScript引入了类(class),这是一种创建和定义对象的新方法。
2、数组(Arrays):例如let arr = [1, 2, 3]; 数组对象有一些特殊的属性和方法,如length、push、pop等。
3、函数(Functions):函数也是对象,它们可以有属性和方法。例如:
function sayHello() {
console.log('Hello');
}
sayHello.myProperty = 'This is a property of the function.';
4、日期(Dates):例如let date = new Date();
5、正则表达式(RegExp,Regular expressions):例如let regex = /ab+c/;
6、其他内置对象,如Math,Set,Map等。
【在JavaScript中,数组和函数确(详见以前的节)实是特殊类型的对象,也就是说,它们也是键值对的集合,但是它们的行为和普通对象有所不同。
数组:数组是一种特殊的对象,它的键是基于零的数字索引,而且它有一些额外的属性和方法,如length属性和push方法,这使得数组在处理有序的数据集合时更加方便。但是,你也可以给数组添加其他类型的键和值,就像给普通对象一样:
let arr = [1, 2, 3];
arr['myKey'] = 'myValue';
console.log(arr['myKey']); // 输出:'myValue'
函数:函数也是一种特殊的对象,它们可以有自己的属性和方法。这意味着你可以将函数赋值给变量,将它们作为其他函数的参数,或者将它们作为对象的属性。函数的键是它的属性名,值可以是任何类型的数据:
function sayHello() {
console.log('Hello');
}
sayHello.myProperty = 'This is a property of the function.';
console.log(sayHello.myProperty); // 输出:'This is a property of the function.'
所以,虽然数组和函数在JavaScript中是特殊类型的对象,但它们仍然是键值对的集合。】
在JavaScript中,有多种方式可以创建对象,常用的创建的方式有
1.利用字面量创建对象
对象字面量:就是花括号 { } 里面包含了表达这个具体事物(对象)的属性和方法。
{ } 里面采取键值对的形式表示
键:相当于属性名
值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)。
例如:
let star = {name : 'pink',age : 18,sex : '男',sayHi : function(){alert('大家好啊~');}
};
2.利用new Object创建对象
Object() :第一个字母大写
new Object() :需要 new 关键字
使用的格式:对象.属性 = 值;
例如:
let andy = new Obect();
andy.name = 'pink';
andy.age = 18;
andy.sex = '男';
andy.sayHi = function(){alert('大家好啊~');
}
3.利用构造函数创建对象
构造函数 :是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些==公共的属性和方法==抽取出来,然后封装到这个函数里面。
使用构造函数要时要注意以下两点:
构造函数用于创建某一类对象,按约定其首字母要大写
构造函数要和 new 一起使用才有意义。
例如:
function Person(name, age, sex) {this.name = name;this.age = age;this.sex = sex;this.sayHi = function() {alert('我的名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + this.sex);}
}
let bigbai = new Person('大白', 100, '男');
let smallbai = new Person('小白', 21, '男');
console.log(bigbai.name);
console.log(smallbai.name);
4.在ES6及以后的版本中,JavaScript引入了类(class),这是一种创建和定义对象的新方法。它们与传统的构造函数类似,但是提供了更简洁的语法和更多的功能。在JavaScript中,可以使用class关键字创建一个类,然后使用new关键字实例化该类。JavaScript 中的类(class)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Classes
例如:
class Person {constructor(name, age) {this.name = name;this.age = age;}sayHello() {console.log(`我的名字叫${this.name},年龄${this.age}岁。`);}
}let person1 = new Person("Alice", 30);
person1.sayHello(); // 输出:我的名字叫Alice,年龄30岁。
下面重点介绍这种方式。
JavaScript 中的类和对象
JavaScript 作为一种面向对象的编程语言,也支持类和对象的概念。尽管在早期的版本中,JavaScript 主要通过原型继承实现面向对象编程,但自 ECMAScript 6(ES6)起,JavaScript 引入了类语法,使得面向对象编程更加直观和易用。与传统的基于原型的继承不同,ES6 的类语法更加简洁和易于理解,但本质上仍然是基于原型的。这使得 JavaScript 在支持面向对象编程的同时,仍保留了其灵活的原型继承机制。
以下是对 JavaScript 中类和对象的介绍。
类(Class)
类 是创建对象的蓝图或模板,定义了对象的属性和方法。
定义类的语法:
class ClassName {
// 构造函数
constructor(parameter1, parameter2) {
this.attribute1 = parameter1;
this.attribute2 = parameter2;
}
// 实例方法
method1() {
// 方法体
}
// 静态方法
static staticMethod() {
// 方法体
}
}
对象(Object)
对象 是类的实例,通过类的构造函数创建。每个对象都有自己独特的属性和方法。
创建对象的语法:
const objectName = new ClassName(arguments);
类和对象的属性和方法说明
实例属性:在构造函数中定义,用 this 引用。每个对象都有自己独立的实例属性。
实例方法:在类内部定义的方法,用 this 引用实例属性。
静态方法:也称为类属性,使用 static 关键字定义,不依赖于具体实例,通常用于实现与实例无关的功能。通过类名来访问,而不是通过实例,格式:MyClass.myStaticProperty
JavaScript 类中主要成员的用途和注意事项:
☆构造函数(Constructor)
用途:
初始化新创建的对象
设置对象的初始属性
注意事项:
使用 constructor 关键字定义
创建对象时自动调用
每个类只能有一个构造函数
如:
class Person {constructor(name, age) {this.name = name;this.age = age;}
}
☆实例属性(Instance Properties)
用途:
存储对象的特定数据
注意事项:
通常在构造函数中使用 this 关键字定义
每个实例可以有不同的值
如:
class Car {constructor(make, model) {this.make = make;this.model = model;}
}
☆实例方法(Instance Methods)
用途:
定义对象的行为
操作对象的数据
注意事项:
可以访问实例属性和其他实例方法
使用 this 关键字引用当前实例
如:
class Rectangle {constructor(width, height) {this.width = width;this.height = height;}getArea() {return this.width * this.height;}
}
☆静态方法(Static Methods)
用途:
实现与类相关但不依赖于实例的功能
注意事项:
使用 static 关键字定义
通过类名调用,不能通过实例调用
不能直接访问实例属性或方法
如:
☆静态属性(Static Properties)
用途:
存储类级别的数据
所有实例共享的常量或配置
注意事项:
在类定义外使用 ClassName.propertyName 定义(早期语法)
在新的提案中,可以在类内部使用 static 关键字定义
通过类名访问,不能通过实例访问
如:
class Config {static API_URL = 'https://api.example.com';
}console.log(Config.API_URL);
☆Getter 和 Setter
用途:
控制属性的访问和修改
实现计算属性
注意事项:
使用 get 和 set 关键字定义
看起来像属性,但实际上是方法
可以进行值的验证或转换
如:
class Circle {constructor(radius) {this._radius = radius;}get diameter() {return this._radius * 2;}set radius(value) {if (value > 0) {this._radius = value;}}
}
☆私有字段(Private Fields)
用途:
封装内部状态
防止外部直接访问和修改
注意事项:
使用 # 前缀定义,是 ECMAScript 的新特性
只能在类内部访问
如:
class BankAccount {#balance = 0;deposit(amount) {this.#balance += amount;}getBalance() {return this.#balance;}
}
特别提示,JavaScript类的成员类型和概念很多,一次性全部掌握是有难度的。实际使用时有些部分不一定出现,选择合适的类型可以使您的代码更加清晰和高效。初学时,不需要一次掌握所有内容,可以先集中精力关注最常用的部分,您随着您编写更多的JavaScript代码,这些概念会变得越来越清晰。
下面给出一个简单而比较完整示例:
class Dog {constructor(name, age) {this.name = name; // 实例属性this.age = age;}bark() { // 实例方法return `${this.name} says woof!`;}static species() { // 静态方法return 'Canis familiaris';}
}const dog1 = new Dog('Buddy', 3);
console.log(dog1.bark()); // 输出: Buddy says woof!
console.log(Dog.species()); // 输出: Canis familiaris
下面介绍封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)等内容,很重要,但涉及内容广泛,在此仅作简要介绍,作为初学者可以先作为了解内容。
继承(Inheritance)
继承允许一个类(子类)继承另一个类(父类)的属性和方法。
定义子类的语法:
class SubClass extends ParentClass {
// 子类定义
}
示例:
class Animal {constructor(name) {this.name = name;}speak() {return `${this.name} makes a sound.`;}
}class Dog extends Animal {constructor(name, age) {super(name);this.age = age;}speak() {return `${this.name} says woof!`;}
}const dog = new Dog('Buddy', 3);
console.log(dog.speak()); // 输出: Buddy says woof!
多态(Polymorphism)
多态性允许子类在继承父类的方法时提供自己的实现。子类继承父类,并重写父类的方法。
示例:
class Animal {speak() {console.log("动物发出声音");}
}class Dog extends Animal {speak() {console.log("汪汪!");}
}class Cat extends Animal {speak() {console.log("喵喵~");}
}const animal = new Animal();
const dog = new Dog();
const cat = new Cat();animal.speak(); // 输出: 动物发出声音
dog.speak(); // 输出: 汪汪!
cat.speak(); // 输出: 喵喵~
封装(Encapsulation)
指的是将数据(属性)和操作数据的方法(函数)封装在一个对象内部,从而隐藏内部实现细节,提供一个清晰的接口来与对象进行交互。
在现代 JavaScript 中(从 ES2022 开始),可以使用 # 前缀来定义私有属性和方法。这种方式提供了严格的封装,确保属性和方法只能在类内部访问。示例:
class Person {#name; // 私有属性#age;constructor(name, age) {this.#name = name;this.#age = age;}getName() {return this.#name;}getAge() {return this.#age;}
}const person = new Person('Alice', 30);
console.log(person.getName()); // 输出: Alice
console.log(person.getAge()); // 输出: 30
// console.log(person.#name); // 会报错,无法直接访问私有属性
Getter 和 Setter
JavaScript 中的 Getter 和 Setter可以使用 get 和 set 关键字定义。
Getter 和 Setter 是特殊的方法,允许你以更灵活的方式读取(get)和写入(set)对象的属性。它们提供了一种方式来定义“伪属性”,这些属性看起来像普通属性,但实际上是通过方法来访问和修改的。
Getter(获取器):
使用 get 关键字定义
不接受参数
用于读取属性值
Setter(设置器):
使用 set 关键字定义
接受一个参数(要设置的新值)
用于写入属性值
示例:
class Circle {constructor(radius) {this._radius = radius; // 约定使用下划线前缀表示内部属性}// Getterget radius() {return this._radius;}// Setterset radius(value) {if (value <= 0) {throw new Error("半径必须为正数");}this._radius = value;}// Getterget area() {return Math.PI * this._radius ** 2;}
}const circle = new Circle(5);console.log(circle.radius); // 输出: 5
circle.radius = 10; // 使用 setter
console.log(circle.radius); // 使用 getter,输出: 10
console.log(circle.area); // 使用 getter,输出: 约 314.16circle.radius = -1; // 抛出错误:半径必须为正数
在这个例子中:
radius 有一个 getter 和 setter:
获取 radius 时,实际上调用了 get radius() 方法。
设置 radius 时,调用 set radius(value) 方法,允许我们在设置值之前进行验证。
area 只有一个 getter:
它是一个只读属性,每次访问时都会计算面积。
在使用时,getter 和 setter 看起来就像普通属性:
circle.radius = 10; // 使用 setter
console.log(circle.radius); // 使用 getter,输出: 10
console.log(circle.area); // 使用 getter,输出: 约 314.16
进一步学习可见:
JavaScript早期(ES6之前)对象及其的属性和方法的访问介绍 https://blog.csdn.net/cnds123/article/details/125406135
JavaScript面向对象编程再讲https://blog.csdn.net/cnds123/article/details/129982056
面向对象编程基本概念 https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object-oriented_programming
相关文章:
JavaScript青少年简明教程:面向对象编程入门
JavaScript青少年简明教程:面向对象编程入门 JavaScript 支持多种编程范式(programming paradigms),即支持多种不同的编程风格和方法。 前面介绍的编程方式,主要是面向过程编程(Procedural Programming&am…...

电话号的标准
点击标题下「蓝色微信名」可快速关注 最近碰到个电话号码的问题,除了常规数字,可能还会有国内国际的区号,例如中国,86、086、86,这些好像都见过,但什么是标准的?谁来定义的? 国际电信…...

项目实战_表白墙(升级版)
你能学到什么 表白墙(升级版)Mybatis的一些简单应用 正文 前⾯的案例中, 我们写了表⽩墙, 但是⼀旦服务器重启, 数据就会丢失. 要想数据不丢失, 需要把数据存储在数据库中,接下来咱们借助MyBatis来实现数据库的操作。 数据准备 如果我们…...

创意无限:11个设计圈热议的UI设计灵感网站集锦
无论你是一个经验丰富的UI设计师还是一个新的UI设计师,拥有一些高质量、可靠的UI设计网站灵感库都能加速你的设计过程。借助灵感资源,您可以更快、更有效地启动该项目。与此同时,优秀的UI设计网站也能帮助您探索新的设计解决方案,…...
C# Solidworks二次开发------综合小设计-1
一、内容 本文对前面所提及的相关信息做一些小设计 二、代码 public void Open_File(string FileNmae) {Process.Start("explorer.exe", FileNmae); }public void Connect_Excel() {string connectionString "ProviderMicrosoft.Jet.OLEDB.4.0;Data Source&q…...
nginx rtmp服务器搭建
参考链接:https://blog.csdn.net/bitcsljl/article/details/125826323...

打卡第31天------贪心算法
每天抓紧时间刷题,争取尽快上岸,不能再耽误一分一秒了,2024年已经过去大半年了。这个算法编程题是我的痛点。要尽快弥补。 卡尔在讲算法题的时候,思路比较清晰,通俗易懂,以前看见算法题就害怕,因为啥都不会,看懵了,跟了一个月了,每天坚持刷题,偶尔会回顾思路,也会…...

jenkins服务器重启,构建记录消失
1、进入系统管理查看系统运行日志,发现报保存构建日志失败 jenkins module java.base does not "opens java.lang.ref" to unnamed module 5276d6ee Java平台模块系统对类的可见性和访问权限进行了严格的控制。在Java 9及以上版本中,java.la…...
Linux系统部分问题处理方案
目录 一:crontab输出结果控制 二:telnet很慢/ssh很慢 三:Read-onlyfilesystem 四:⽂件删了磁盘空间没释放 五:获取不了⽹关mac地址 六: http服务⽆法启动⼀例 七:ibdata1和mysql-bin致磁盘空间问题 一:crontab输出结果控制 问题: /var/spool/clientmqueue⽬录…...

C语言指针与数组
在上一篇对指针介绍的文章当中,我们初次了解到了指针,并且知道了地址和内存间的关系,懂得了如何取地址和对指针的解引用,算是对指针有了一个初步的了解。而今天让我们对指针进行更深一步的了解吧~ 一、指针与数组名 我们知道&am…...

Stream 33
package Array.collection;import java.util.*; import java.util.stream.Stream;public class stream1 {public static void main(String[] args) {//、如何茯取List集合的Stream流?List<String> names new ArrayList<>();Collections. addAll(names,"方法…...
【Python Loguru】实现日志工具和日志饶接
【Python Loguru】实现日志工具和日志饶接 说明 代码使用第三方库Loguru实现了logging工具,可以直接改名字后就使用,并实现了日志绕接,使用前需要先安装loguru工具。 Code import os import json from loguru import logger# config_file…...

【Linux】-----进度条小程序
目录 前言 基本知识 Ⅰ、回车和换行 Ⅱ、缓冲区 两个有意思的现象 简单定义 刷新缓冲区 简易倒计时程序 进度条代码 多文件下makefile写法 一代(无任何场景) procs1.h代码 procs1.c代码 主函数main1.c 一代运行结果: 二代 (搭配下载场景) procs2.c代…...

普通人有必要学Python吗?学了之后能做什么?
目录 首先来说一下极其推荐的方向: 1、数据分析 2、科学计算 3、大数据框架 4、脚本开发 5、爬虫 6、Web框架 总结: 如果你还没有开始使用Python,答应我,把这个回答看完,如果你真的学习并深入使用过Python&…...

2023-2024年 Java开发岗面试题经验分享
在各行各业中,面试前我们总会思索一个问题:究竟什么样的求职者能获得面试官的青睐?作为求职者,我们又该如何准备,以应对各种面试官的挑战?在这激烈的竞争里,如何才能让自己从众多应聘者中脱颖而…...
JavaScript中URL和Blob
JavaScript中URL和Blob 常用于处理文件数据、图像数据、音频数据等。Blob对象通常用于在客户端处理文件,如上传文件、下载文件、处理图像等操作。Blob对象可以通过Blob构造函数创建,也可以通过其他方式获取,比如从File对象中获取。 使用场景…...
平舌、翘舌音学习: z、c、s--zh、ch、sh
平舌音翘舌音不分怎么办? 尝试整理了,如下一些材料: 一、 策略篇: 一年级拼音如何区分掌握:平舌音和翘舌音? 喜马拉雅, 平舌音翘舌音教学:普通话声母zh以及zh ch sh与z c s的发音练…...

Windows(Win10、Win11)本地部署开源大模型保姆级教程
目录 前言1.安装ollama2.安装大模型3.安装HyperV4.安装Docker5.安装聊天界面6.总结 点我去AIGIS公众号查看本文 本期教程用到的所有安装包已上传到百度网盘 链接:https://pan.baidu.com/s/1j281UcOF6gnOaumQP5XprA 提取码:wzw7 前言 最近开源大模型可谓闹…...

快速排序(下)
快速排序(下) 前言 在上一篇文章中我们了解了快速排序算法,但那是Hoare的版本,其实还有别的版本:一种是挖坑法,它们的区别主要在于如何找基准值。霍尔的版本思路难理解但代码好理解,挖坑法则是…...

LazyLLM:长上下文场景下提高LLM推理效率
LazyLLM旨在优化大型语言模型(LLM)在处理长文本语境下的推理效率。传统上,LLM的推理过程分为预填充和解码两个阶段,其中预填充阶段负责计算并存储输入提示的所有token的键值(KV)缓存,这一步骤在…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...