【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(二)

news2024/9/22 7:37:51

目录

1 -> 基础数据类型

1.1 -> 条件语句

1.1.1 if语句

1.2 -> 分支语句 

 1.2.1 -> switch语句

1.3 -> 循环语句

1.3.1 -> while循环

1.3.2 -> continue

1.3.3 -> break

1.3.4 -> for循环

1.4 -> 数组

1.4.1 -> 创建数组

1.4.2 -> 获取数组元素

1.4.3 -> 新增数组元素

1.4.4 -> 删除数组中的元素

2 -> 函数

2.1 -> 语法格式

2.2 -> 关于参数个数

2.3 -> 函数表达式

3 -> 作用域

4 -> 作用域链

5 -> 对象

5.1 -> 基本概念

5.2 -> 使用字面量创建对象

5.3 -> 使用new Object创建对象

5.4 -> 使用构造函数创建对象

5.5 -> new关键字

6 -> JavaScript的对象和Java的对象的区别


1 -> 基础数据类型

1.1 -> 条件语句

1.1.1 if语句

基本语法格式

条件表达式为true,则执行if的{}中的代码。

// 形式1

if (条件) {

    语句

}

// 形式2

if (条件) {

    语句1

}

else {

    语句2

}

// 形式3

if (条件1) {

    语句1

}

else if (条件2) {

    语句2

}

else if .... {

    语句...

}

else {

    语句N

}

练习案例

代码示例1:判定一个数字是奇数还是偶数。

var num = 10;
if (num % 2 == 0) {
    console.log("num 是偶数");
} 
else {
    console.log("num 是奇数");
}

注意:

不能写成num % 2 == 1就是奇数。负的奇数 % 2结果可能是-1。

代码示例2:判定一个数字是正数还是负数。

var num = 10;
if (num > 0) {
    console.log("num 是正数");
}
else if (num < 0) {
    console.log("num 是负数");
} 
else {
    console.log("num 是 0");
}

代码示例3:判定某一年份是否为闰年。

var year = 2000;
if (year % 100 == 0) {
    // 判定世纪闰年
    if (year % 400 == 0) {
        console.log("是闰年");
    }
    else {
        console.log("不是闰年");
    }
} 
else {
    // 普通闰年
    if (year % 4 == 0) {
        console.log("是闰年");
    } 
    else {
        console.log("不是闰年");
    }
}

三元表达式

是if else的简化写法。

条件 ? 表达式1 : 表达式2

条件为真,返回表达式1的值。条件为假,返回表达式2的值。

注意:

三元表达式的优先级是比较低的。

1.2 -> 分支语句 

 1.2.1 -> switch语句

更适合多分支的场景。

switch (表达式) {

    case 值1:

        语句1;

        break;

    case 值2:

        语句2;

        break;

    default:

        语句N;

}

练习案例

代码示例1:用户输入一个整数,提示今天是星期几。 

var day = prompt("请输入今天星期几: ");
switch (parseInt(day)) {
    case 1:
        console.log("星期一");
        break;
    case 2:
        console.log("星期二");
        break;
    case 3:
        console.log("星期三");
        break;
    case 4:
        console.log("星期四");
        break;
    case 5:
        console.log("星期五");
        break;
    case 6:
        console.log("星期六");
        break;
    case 7:
        console.log("星期日");
        break;
    default:
        console.log("输入有误");
}

1.3 -> 循环语句

重复执行某些语句。

1.3.1 -> while循环

while (条件) {

    循环体;

}

执行过程:

  • 先执行条件语句。
  • 条件为true,执行循环体代码。
  • 条件为false,直接结束循环。

练习案例

代码示例1:打印1-10。 

var num = 1;
while (num <= 10) {
    console.log(num);
    num++;
}

代码示例2:计算5的阶乘。

var result = 1;
var i = 1;
while (i <= 5) {
    result *= i;
    i++;
}
console.log(result)

1.3.2 -> continue

结束这次循环。

练习案例

代码示例1: 吃五个李子,发现第三个李子里有一只虫子,于是扔掉这个,继续吃下一个李子。

test.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="style.js"></script>

</body>
</html>

style.js

var i = 1;
while (i <= 5) {
    if (i == 3) {
        i++;
        continue;
    }
    console.log("我在吃第" + i + "个李子");
    i++;
}

展示结果:

代码示例2:找到100-200中所有3的倍数。

var num = 100;
while (num <= 200) {
    if (num % 3 != 0) {
        num++; // 这里的 ++ 不要忘记! 否则会死循环. 
        continue;
    }
    console.log("找到了 3 的倍数, 为:" + num);
    num++;
}

1.3.3 -> break

结束整个循环。

练习案例

代码示例1:吃五个李子,发现第三个李子里有虫子,于是剩下的也不吃了。 

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="style.js"></script>

</body>
</html>

style.js

var i = 1;
while (i <= 5) {
    if (i == 3) {
        break;
    }
    console.log("我在吃第" + i + "个李子");
    i++;
}

展示结果:

代码示例2:找到100-200中第一个3的倍数。

var num = 100;
while (num <= 200) {
    if (num % 3 == 0) {
        console.log("找到了 3 的倍数, 为:" + num);
        break;
    }
 num++;
}

1.3.4 -> for循环

for (表达式1; 表达式2; 表达式3) {

    循环体

}

  • 表达式1:用于初始化循环变量。
  • 表达式2:循环条件。
  • 表达式3:更新循环变量。

执行过程:

  1. 先执行表达式1,初始化循环变量。
  2. 再执行表达式2,判定循环条件。
  3. 如果条件为true,则执行循环体代码;如果条件为false,结束循环。
  4. 执行表达式3,更新循环变量。

练习案例

代码示例1:打印数字1-10。 

for (var num = 1; num <= 10; num++) {
    console.log(num);
}

代码示例2:计算5的阶乘。

var result = 0;
for (var i = 1; i <= 5; i++) {
    result *= i;
}
console.log("result = " + result);

1.4 -> 数组

1.4.1 -> 创建数组

使用new关键字创建。

// Array 的 A 要大写

var arr = new Array();

使用字面量方式创建。

var arr = [];
var arr2 = [1, 2, 'One Piece', false]; // 数组中保存的内容称为 "元素"

注意:

JS的数组不要求元素是相同类型

这点和C/C++、Java等静态类型的语言差别很大。但是Python、PHP等动态类型语言也是如此。

1.4.2 -> 获取数组元素

使用下标的方式访问数组元素(从0开始)。

var arr = ['路飞太郎', '索隆十郎', '山五郎'];
console.log(arr);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
arr[2] = '海侠甚平';
console.log(arr);

如果下标超出范围读取元素,则结果为undefined。

console.log(arr[3]);   // undefined
console.log(arr[-1]);  // undefined

注意:

不要给数组名直接赋值,此时数组中的所有元素都没了。

相当于本来arr是一个数组,重新赋值后变成字符串了。

var arr = ['路飞太郎', '索隆十郎', '山五郎'];
arr = '海侠甚平';

1.4.3 -> 新增数组元素

1. 通过修改length新增

相当于在末尾新增元素。新增的元素默认值为undefined。 

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="style.js"></script>

</body>
</html>

style.js

var arr = [9, 5, 2, 7];
arr.length = 6;
console.log(arr);
console.log(arr[4], arr[5]);

展示结果:

2. 通过下标新增

如果下标超出范围赋值元素,则会给指定位置插入新元素。

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="style.js"></script>

</body>
</html>

style.js

var arr = [];
arr[2] = 10;
console.log(arr);

展示结果:

3. 使用push进行追加元素

代码示例1:给定一个数组,把数组中的奇数放到一个newArr中。

var arr = [9, 5, 2, 7, 3, 6, 8];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
    if (arr[i] % 2 != 0) {
        newArr.push(arr[i]);
    }
}
console.log(newArr);

1.4.4 -> 删除数组中的元素

使用splice方法删除元素。

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="style.js"></script>

</body>
</html>

style.js

var arr = [9, 5, 2, 7];
// 第一个参数表示从下表为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
arr.splice(2, 1);
console.log(arr);

展示结果:

注意:

  • arr.length,length使用的时候不带括号,此时length就是一个普通的变量(称为成员变量,也叫属性)。
  • arr.push()、arr.splice()使用的时候带括号,并且可以传参数,此时是一个函数(也叫方法)。

2 -> 函数

2.1 -> 语法格式

// 创建函数/函数声明/函数定义

function 函数名(形参列表) {

    函数体

    return 返回值;

}

// 函数调用

函数名(实参列表)             // 不考虑返回值

返回值 = 函数名(实参列表)    // 考虑返回值

  • 函数定义并不会执行函数体内容,必须要调用才会执行。调用几次就会执行几次。
function hello() {
    console.log("hello");
}
// 如果不调用函数, 则没有执行打印语句
hello();
  • 调用函数的时候进入函数内部执行,函数结束时回到调用位置继续执行。可以借助调试器来观察。
  • 函数的定义和调用的先后顺序没有要求(这一点和变量不同,变量必须先定义再使用)。
// 调用函数
hello();
// 定义函数
function hello() {
    console.log("hello");
}

2.2 -> 关于参数个数

实参和形参之间的个数可以不匹配。但是实际开发一般要求形参和实参个数要匹配。 

1.  如果实参个数比形参个数多,则多出的参数不参与函数运算。

sum(10, 20, 30); // 30

2. 如果实参个数比形参个数少,则此时多出来的形参值为undefined。

sum(10); // NaN, 相当于 num2 为 undefined.

JS的函数传参比较灵活,这一点和其他语言差别较大。事实上这种灵活性往往不是好事。

2.3 -> 函数表达式

另外一种函数的定义方式。

var add = function() {
    var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}
console.log(add(10, 20));       // 30
console.log(add(1, 2, 3, 4));   // 10
console.log(typeof add);        // function

此时形如function(){ }这样的写法定义了一个匿名函数,然后将这个匿名函数用一个变量来表示。

后面就可以通过这个add变量来调用函数了。

JS中函数是一等公民,可以用变量保存,也可以作为其他函数的参数或者返回值。

3 -> 作用域

某个标识符名字在代码中的有效范围。

在ES6标准之前,作用域主要分成两个:

  • 全局作用域:在整个script标签中,或者单独的js文件中生效。
  • 局部作用域/函数作用域:在函数内部生效。
// 全局变量
var num = 10;
console.log(num);
function test() {
    // 局部变量
    var num = 20;
    console.log(num);
}
function test2() {
    // 局部变量
    var num = 30;
    console.log(num);
}
test();
test2();
console.log(num);

创建变量时如果不写var,则得到一个全局变量。

function test() {
    num = 100;
}
test();
console.log(num);

另外,很多语言的局部变量作用域是按照代码块(大括号)来划分的,JS在ES6之前不是这样的。

if (1 < 2) {
    var a = 10;
}
console.log(a);

4 -> 作用域链

背景:

  • 函数可以定义在函数内部。
  • 内层函数可以访问外层函数的局部变量。

内部函数可以访问外部函数的变量。采取的是链式查找的方式。从内到外依次进行查找。

var num = 1;
function test1() {
    var num = 10;
    function test2() {
        var num = 20;
        console.log(num);
    }
    test2();
}
test1();

执行console.log(num)的时候,会现在test2的局部作用域中查找num。如果没找到,则继续去test1中查找。如果还没找到,就去全局作用域查找。

5 -> 对象

5.1 -> 基本概念

对象是指一个具体的事物。

"电脑"不是对象,而是一个泛指的类别。而"我的联想笔记本"就是一个对象。

在JS中,字符串、数值、数组、函数都是对象。

每个对象中包含若干的属性和方法。

  • 属性:事物的特征。
  • 方法:事物的行为。

对象需要保存的属性有多个,虽然数组也能用于保存多个数据,但是不够好。

例如表示一个学生信息。(姓名路飞太郎,身高180cm,体重170斤)
var student = ['路飞太郎', 180, 170];
但是这种情况下到底180和170谁表示身高,谁表示体重,就容易分不清。

JavaScript的对象和Java的对象概念上基本一致。只是具体的语法表项形式差别较大。

5.2 -> 使用字面量创建对象

使用{}创建对象。 

var a = {};     // 创建了一个空的对象
var student = {
    name: '路飞太郎',
    height: 180,
    weight: 170,
    sayHello: function() {
        console.log("One Piece");
    }
};
  • 使用{ }创建对象。
  • 属性和方法使用键值对的形式来组织。
  • 键值对之间使用“,”分割。最后一个属性后面的“,”可有可无。
  • 键和值之间使用“:”分割。
  • 方法的值是一个匿名函数。

使用对象的属性和方法:

// 1. 使用 . 成员访问运算符来访问属性 `.` 可以理解成 "的"
console.log(student.name);
// 2. 使用 [ ] 访问属性, 此时属性需要加上引号
console.log(student['height']);
// 3. 调用方法, 别忘记加上 () 
student.sayHello();

5.3 -> 使用new Object创建对象

var student = new Object(); // 和创建数组类似
student.name = "路飞太郎";
student.height = 180;
student['weight'] = 170;
student.sayHello = function () {
    console.log("One Piece");
}
console.log(student.name);
console.log(student['weight']);
student.sayHello();

注意:

使用{ }创建的对象也可以随时使用student.name = "路飞太郎"; 这样的方式来新增属性。

5.4 -> 使用构造函数创建对象

前面的创建对象方式只能创建一个对象。而使用构造函数可以很方便的创建多个对象。 

例如:创建几个猫咪对象。

var yun = {
    name: "云云",
    type: "布偶猫",
    miao: function () {
        console.log("喵");
    }
};
var tang = {
    name: "汤圆",
    type: "金渐层",
    miao: function () {
        console.log("猫呜");
    }
}
var po = {
    name: "破破",
    type: "拿破仑",
    miao: function () {
        console.log("咕噜噜");
    }
}

此时写起来就比较麻烦。使用构造函数可以把相同的属性和方法的创建提取出来,简化开发过程。

基本语法

function 构造函数名(形参) {

    this.属性 = 值;

    this.方法 = function...

}

var obj = new 构造函数名(实参);

注意:

  • 在构造函数内部使用this关键字来表示当前正在构建的对象。
  • 构造函数的函数名首字母一般是大写的。
  • 构造函数的函数名可以是名词。
  • 构造函数不需要return。
  • 创建对象的时候必须使用new关键字。

this相当于”我“。

使用构造函数重新创建猫咪对象。 

function Cat(name, type, sound) {
    this.name = name;
    this.type = type;
    this.miao = function () {
        console.log(sound); // 别忘了作用域的链式访问规则
        }
}
var yun = new Cat('云云', '布偶猫', '喵');
var tang = new Cat('汤圆', '汤圆', '猫呜');
var po = new Cat('破破', '拿破仑', '咕噜噜');
console.log(yun);
yun.miao();

5.5 -> new关键字

new的执行过程:

  1. 先在内存中创建一个空的对象{ }。
  2. this指向刚才的空对象(将上一步的对象作为this的上下文)。
  3. 执行构造函数的代码,给对象创建属性和方法。
  4. 返回这个对象(构造函数本身不需要return,由new代劳了)。

6 -> JavaScript的对象和Java的对象的区别

1. JavaScript没有“类”的概念

对象其实就是"属性" + "方法"

类相当于把一些具有共性的对象的属性和方法单独提取了出来,相当于一个"月饼模子"。

在JavaScript中的"构造函数"也能起到类似的效果。

而且即使不是用构造函数,也可以随时的通过{ }的方式指定出一些对象。

在ES6中也引入了class关键字,就能按照类似于Java的方式创建类和对象了。

2. JavaScript对象不区分"属性"和"方法"

JavaScript中的函数是"一等公民",和普通的变量一样。存储了函数的变量能够通过( )来进行调用执行。

3. JavaScript对象没有private / public等访问控制机制。

对象中的属性都可以被外界随意访问

4. JavaScript对象没有"继承"。

继承本质就是"让两个对象建立关联"。或者说是让一个对象能够重用另一个对象的属性/方法。

JavaScript中使用"原型"机制实现类似的效果。

例如:创建一个Cat对象和Dog对象,让这两个对象都能使用animal对象中的eat方法。

通过 __proto__ 属性来建立这种关联关系(proto翻译作“原型”)。

var Dog = {
    name: "dog",
    __proto__: animal   //指向animal对象
};
var Cat = {
    name: "cat",
    __proto__: animal   //指向animal对象
}
Dog.eat();  //dog is eating
Cat.eat();  //cat is eating

当eat方法被调用的时候,先在自己的方法列表中寻找,如果找不到,就去找原型中的方法,如果原型中找不到,就去原型的原型中去寻找...... 最后找到Object那里,如果还找不到,那就是未定义了。

5. JavaScript没有"多态"。

多态的本质在于"程序猿不必关注具体的类型,就能使用其中的某个方法"。

C++、Java等静态类型的语言对于类型的约束和校验比较严格。因此通过子类继承父类,并重写父类的方法的方式来实现多态的效果。

但是在JavaScript中本身就支持动态类型,程序猿在使用对象的某个方法的时候本身也不需要对对象的类型做出明确区分。因此并不需要在语法层面上支持多态。

例如:

在Java中有ArrayList和LinkedList。为了让程序猿使用方便,往往写作

List<String> list = new ArrayList<>()

然后我们可以写一个方法:

void add(List<String> list, String s) {
 list.add(s);   
}

我们不必关注list是ArrayList还是LinkedList,只要是List就行。因为List内部带有add方法。

当我们使用JavaScript的代码的时候:

function add(list, s) {
    list.add(s)
}

add对于list这个参数的类型本身就没有任何限制。只需要list这个对象有add方法即可。就不必像Java那样先继承再重写绕一个圈子。


感谢各位大佬支持!!!

互三啦!!!

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

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

相关文章

骂极氪背刺老车主?买车前先把握这三个原则

文 | AUTO芯球 作者 | 雷慢 极氪001的老车主该不会绝望了吧&#xff0c; 刚极氪官方确认了&#xff0c;24款极氪001无法升级到新款的浩瀚智驾&#xff0c; 但老款的智驾系统也会持续更新。 难怪大家要闹。 上周早些时候&#xff0c;我路过极氪的门店还奇怪呢&#xff0c; …

【乐吾乐大屏可视化组态编辑器】快速入门

大屏快速入门 乐吾乐大屏可视化设计软件 一、在线使用 https://v.le5le.com/ 二、步骤 通过本章内容&#xff0c;你将快速学习到大屏可视化设计平台的全流程开发 1.创建图纸 大屏可视化设计平台分为3部分&#xff0c;左侧为资源面板&#xff0c;包含了众多可被使用的方…

Javascript反调试实现判断用户是否打开了浏览器控制台

前言 晓杰最近在研究如何防止用户恶意调试前端网页代码&#xff0c;防止打开控制台进行调试&#xff0c;首先禁用了浏览器页面右键事件和F12等快捷键&#xff01;然后利用了创建元素是否成功方式进行校验,具体实现代码如下。 代码 document.addEventListener(keydown, functi…

Lua调用c#

1. 类 --lua中使用C#的类非常简单 --固定套路 --CS.命名空间.类名 --Unity的类 比如 GameObject Transform等等 —— CS.UnityEngine.类名 --CS.UnityEngine.GameObject--通过C#中的类 实例化一个对象 lua中没有new 所以我们直接 类名括号就是实例化对象 --默认调用的 相当于就…

【MySQL进阶】事务、存储引擎、索引、锁

一、事务 1.概念 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向 系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 例子&#xff1a;转账&#xff0c;要求扣钱和进账…

从0开始搭建vue + flask 旅游景点数据分析系统(九):旅游景点管理之增删改查

这一期来做旅游景点数据的增删改查 先看下我们做好的效果是这样的&#xff1a; ## 1 后台接口 这里的接口已经考虑到了分页的情况&#xff0c;因为前端的表格是带有分页的&#xff0c;接受的前端传过来的get参数为 title 、page、 limit &#xff0c;titie是查询的关键词&…

C#学习笔记15:上位机助手_usercontrol窗体内嵌的应用

今日完善一下之前的上位机助手&#xff0c;做一个组合窗体内嵌的多功能助手软件应用, 与之前的上位机软件相比: 更注重控件能够随着窗体缩放而缩放变换&#xff0c;串口助手部分能自动后台检测串口设备&#xff0c;解决市面上大部分串口助手的打开初始化会卡顿的问题 ( 多线程后…

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程&#xff08;上&#xff09;。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员&#xff0c;所以他们本身并不是context&#xff0c;因而…

Spring日志

1.日志的作用 定位和发现问题(主要)系统监控数据采集日志审计...... 2.日志的使用 2.1 ⽇志格式的说明 2.2 打印日志 Spring集成了日志框架,直接使用即可 步骤: 1.定义日志对象 2.使⽤⽇志对象打印⽇志 RestController public class LoggerController {private static Logger…

Ecovadis认证评估什么 Ecovadis认证有哪些注意事

Ecovadis认证是一个全球性的企业可持续性评估平台&#xff0c;它通过评估企业在环境、劳工与人权、公平商业实践、可持续采购等四个领域的表现&#xff0c;帮助企业识别潜在风险&#xff0c;提升ESG(环境、社会和公司治理)绩效&#xff0c;实现可持续发展 Ecovadis认证注意事项…

Linux-文件系统与日志分析

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 8.Linu…

MapReduce 简单介绍

MapReduce 一、MapReduce概述二、MapReduce 基本设计思想分而治之2.2 抽象成模型2.3 上升到框架 三、MapReduce 优缺点3.1 MapReduce 的优点3.1 MapReduce 的缺点 四、MapReduce 编程模型4.1 MapReduce 分布式计算原理4.2 MapReduce 编程模型4.3 剖析 MapReduce 编程模型4.3.1 …

好书推荐!《Building LLM Apps》构建大语言模型LLM应用!一次性讲清楚!

《Building LLM Apps》这本书是一份全面而实用的指南&#xff0c;它不仅介绍了大型语言模型&#xff08;LLM&#xff09;的基础知识和前沿技术&#xff0c;还深入探讨了如何将这些模型应用到实际的AI应用中。 书中从对LLM的深入介绍入手&#xff0c;接着探讨了包括GPT 3.5、GP…

RxJava在Android中的应用

RxJava是一个基于事件流、异步和响应式编程的库&#xff0c;它在Android开发中广泛用于简化异步操作和事件处理。通过RxJava&#xff0c;我们可以以声明式方式管理异步任务&#xff0c;并有效整合多个数据源。 1. RxJava核心组件介绍 1.1 Observable与Observer Observable&a…

大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明。 文章目录 大模型算法工程师面试题1. Llama 2 中使用的注意力机制是什么&#xff1f;描述一下查询分组注意力。2. LangChain 的结构详细描述一下。…

2024年8月15日嵌入式学习

今日主要学习线程和线程的互斥锁 pthread_cancel函数 它用于取消一个线程&#xff0c;当一个线程收到取消的申请时&#xff0c;他不会立即停止&#xff0c;而是在下一个取消点处结束运行&#xff0c;取消点是程序中一个特定的位置。如果线程在执行一个不可中断的系统调用&…

网络安全风险扫描原理及工具使用

课程目标 1.熟悉常见网络安全风险扫描工具 2.了解网络安全风险扫描原理 3.掌握扫描工具使用方法 为什么要做网络安全风险扫描&#xff1f; 什么是网络安全风险扫描&#xff1f; 通过一定的技术手段发现系统和软件存在的安全漏洞、弱口令 网络安全风险扫描的目的&#xff1…

【AI 绘画】web_ui 搭建(基于gradio)

AI 绘画- web_ui 搭建(基于gradio) 1. 内容介绍 Gradio的优势在于易用性,代码结构相比Streamlit简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。适合场景相对简单,想要快速部署应用的开发者。便于分享:gradio可以在启动应用时设置share=…

QT文件操作实战

QT文件操作实战 页面布局如下 读取文件:文件→界面文本框 采用“浏览”按钮的槽函数,编写的代码如下 void Widget::on_pushButton_clicked() {//读取txt文件,获取要打开的文件名,并将文件名(包含)填入lineEdit中// QString fileName = QFileDialog::getOpenFileName(th…

云HIS平台源码,云医院管理信息系统源码,云HIS医疗卫生管理系统源码

云医院管理信息系统源码&#xff0c;云HIS医疗卫生管理系统源码&#xff0c;医疗云HIS系统源码&#xff0c;自主版权二级医院应用案例 云HIS平台采用SaaS服务模式&#xff0c;软件使用者无需购置额外硬件设备、软件许可证及安装和维护软件系统&#xff0c;通过互联网浏览器在任…