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

【从0-1的JavaScript】第1篇:JavaScript的引入方式和基础语法

文章目录

  • JavaScript
  • JavaScript的组成
  • JavaScript的运行(js默认是单线程运行的)
    • 浏览器
    • JavaScript引擎
  • JavaScript的引入方式
    • 内部JavaScript
    • 外部JavaScript
  • JavaScript的基本语法
    • 注释
    • 变量
      • 变量的删除(将值赋值为undefined)
      • 变量的命名规范
    • 数据类型
      • 基本数据类型
        • Number类型
        • String类型
        • Boolean类型
        • null类型
        • undefined类型
        • Symbol 类型
      • 引用数据类型
        • Array
        • Function类型
        • Object类型
      • 类型转换
        • 字符串
        • 数值
        • 隐式转换
    • 运算符
      • 算数运算符
      • 赋值运算符
      • 比较运算符
      • 逻辑运算符
      • 三元运算符
      • 运算符优先级
    • 流程控制
      • 语句块
      • 判断分支语句
        • if语句
        • switch语句
      • 循环遍历语句
        • while循环
        • do while循环
        • for循环
    • 异常处理
      • 异常捕获
      • 抛出异常
    • 函数
      • 函数声明
      • 立即执行函数
      • 内建函数
  • 总结

JavaScript

JavaScript是一门跨平台的、面向对象的弱类型(变量值会自动发生类型转变)脚本语言,也是以函数式优先的解释型语言,主要用来控制网页行为包括一些动态效果和交互功能,从而实现人机交互效果。例如从服务器中获取数据并更新到网页中。

JavaScript的组成

JavaScript主要由以下三部分组成:

1、ECMAScript:标准,提供了语言的语法和基本对象

ECMA: 欧洲计算机制造商协会的简称。 js目前的语法标准就是由ECMA牵头组织进行发布的

2、DOM:文档对象模型(Document Object Model),提供处理网页内容的方法和接口

3、BOM:浏览器对象模型(Browser Object Model),提供与浏览器进行交互的方法和接口

JavaScript的运行(js默认是单线程运行的)

浏览器

JavaScript作为一种脚本语言,JavaScript是不能独立运行的,需要借助浏览器来运行JavaScript的代码,市面上所有的web浏览器(Chrome、Edge、FireFox)都支持JavaScript。

JavaScript引擎

除了可以在浏览器中执行外,也可以在服务端或者搭载了 JavaScript 引擎的设备中执行 JavaScript 代码,浏览器之所以能够运行 JavaScript 代码就是因为浏览器中都嵌入了 JavaScript 引擎,常见的 JavaScript 引擎有:

  • V8:Chrome 和 Opera 中的 JavaScript 引擎;
  • SpiderMonkey:Firefox 中的 JavaScript 引擎;
  • Chakra:IE 中的 JavaScript 引擎;
  • ChakraCore:Microsoft Edge 中的 JavaScript 引擎;
  • SquirrelFish:Safari 中的 JavaScript 引擎。

JavaScript的引入方式

javascript在网页中引入使用类似css,也有一下2种引入方式:

内部JavaScript

内部js的script绝对不能出现src属性,否则会被浏览器忽略内部js代码

外部JavaScript

代码编写在独立的js文件中,然后在html网页中通过script标签的src属性来引入js文件,执行文件中的js代码

JavaScript

JavaScript的基本语法

注释

javascript中有2种注释写法。注释在程序中时经常见到的,主要写给程序员查看。一般良好的程序,往往一个源码文件中有1/4或者1/3内容就是注释。

// 单行注释/*多行注释多行注释*/

变量

variable,变量就是一个容器,用来代表数据在程序内部执行的。javascript代码不需要缩进,但是为了维护时查看方便,建议还是进行缩进编写。

// 声明变量的基本语法:
var 变量名 =;     // 定义全局变量,全局范围可用
let 变量名 =;      // 定于局部变量,尽在当前作用域下可用
const 变量名 =;  // 定义常量,一旦定义以后,值不能改变。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 变量的声明,变量如果首次出现,强烈建议使用var或者let关键字作为变量声明的前缀语句var num = 200;alert(num);let age = 17;alert(age);// 变量声明完成以后,后续的变量使用就不需要var或let关键字num = 300;  // 修改变量的值,如果当前变量是首次出现,则表示赋值alert(num);age = age + 1; // 变量的叠加alert(age);// 一旦定义以后,值不可变的变量,叫常量[constant variable]const URL = "http://www.baidu.com"alert(URL)// 错误的操作:重新给一个常量进行赋值。// URL = "http://www.tmall.com"// alert(URL)// var 与 let 的区别{let i =20;console.log(i);}// let的作用域级别是语句级别,var的作用域级别是函数级别,所以基于let本身的特点,在工作中使用最多的就是let。建议少用var,除非声明全局变量。console.log("i最终的值是", i);</script>
</body>
</html>

image-20250715222353765

由图中报错可知:

let的作用域级别是语句级别,var的作用域级别是函数级别,所以基于let本身的特点,在工作中使用最多的就是let。建议少用var,除非声明全局变量。

变量的删除(将值赋值为undefined)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 变量的声明,变量如果首次出现,强烈建议使用var或者let关键字作为变量声明的前缀语句var num = 200;console.log(num);// 要删除一个变量,只能通过把这个变量值改成undefinednum = undefined;console.log(num);// 当然,js也有垃圾回收机制,所以页面中所有js代码执行完成以后,变量等信息也会被系统回收。</script>
</body>
</html>

变量的命名规范

1. 变量名不能是js中的保留字和关键字。关键字:编程语言中,用来进行语法相关的关键词,例如:function, delete, var, let, if..else, class ..., 保留字:编程语言中,将来有可能用作关键字的词语,例如:goto....to...def...pass..
2. 变量名区分大小写,对大小写敏感。声明的变量在使用时,针对大小写字母是区分的。a 和 A 是不同的。
3. 变量名只能由字母,数字和美元符$以及下划线_组成,不能以数字开头。var a-b = 100;   // 报错,a-b不是合法变量名

数据类型

JavaScript 中的数据类型可以分为两种类型:基本数据类型、引用数据类型

基本数据类型

基本数据类型(值类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol

类型名称描述
Number数值型整数,浮点数。。。。
String字符串文本,一般使用"双引号",'单引号’或者反引号圈起来的都是文本。
Boolean布尔值用于逻辑判断结果,值只有truefalse,注意:首字母不能大写!
null类似python的None,表示什么都没有。
undefined未定义变量在未定义时直接使用,则值就是Undefined
Symbol独一无二的值Symbol 是 ECMAScript6 中引入的一种新的数据类型,Symbol 类型的值需要使用 Symbol() 函数来生成
Number类型
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>
var num1 = 100; //
var num2 = 1.33;
var num3 = 0;
var num4 = -1.33;
var num5 = 1.3e10;
var num6 = 133_200_100;
console.log( typeof num1 ); // number
console.log( typeof num2 ); // number
console.log( typeof num3 ); // number
console.log( typeof num4 ); // number
console.log( typeof num5 ); // number
console.log( typeof num6 ); // number// 数值类型支持算数运算
console.log(num1+100); // 加法运算
console.log(num1-100); // 减法运算
console.log(num1*100); // 乘法运算
console.log(num1/100); // 除法运算
console.log(num1%3);   // 取模,求余运算
console.log(num1**3);  // 幂运算</script>
</body>
</html>
String类型
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>
// 字符串在js中有2种,分别是单行字符串(普通字符串)与多行字符串(文本字符串、模板字符串)。
// 其中,单行字符串可以使用单引号或双引号圈起来就是单行字符串。
// 使用反引号圈起来的,就是多行字符串。// 单引号声明字符串
var str1 = 'hello world';
console.log(typeof str1); // string// 双引号单行字符串
var str2 = "hello world";
console.log(typeof str2); // string// 多行文本字符串
var str3 = `hello world`;
console.log(typeof str3); // string// 字符串的使用注意事项.
// 1. 单行字符串,内容是不能换行的。所有的换行通过转义字符\r\n来完成.
var str4 = "hello\r\nworld";
console.log(str4);// var str5 = "hello
// world";   // 这里报错,单行字符串内部不能内容换行,必须保证引号开始与结束在同一行出现// 2. 多行文本字符串中编写变量会被js识别转换成值
var str5 = 'world'
var str6 = `hello ${str5}`; //hello world  写在多行文本字符串中的 ${变量名}会被js进行识别并转换成变量的值
console.log(str6);// 3. 单行字符串中编写变量是不会被js识别的。
var str7 = "world"
var str8 = "hello ${str7}"
console.log(str8); // hello ${str7}</script>
</body>
</html>
Boolean类型
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>
// 表示逻辑运算或者比较以后产生的结果。只有2个值。
// true,表示真,正确,成立.
// false,表示假,错误,不成立。
var ret1 = true;
console.log( ret1, typeof ret1);  // true "boolean"var ret2 = false;
console.log( ret2, typeof ret2);  // false, "boolean"// 布尔值是一个关键字,也叫字面量,不能加上引号,否则会被当成字符串!!
var ret3 = 'true';
console.log( ret3, typeof ret3 ); // true string// 与python不同,布尔值不能首字母大写,必须全部小写!
// 而且python3中的布尔值实际上就是数值类型,但是js中布尔类型就是独立的数据类型,
// 当然因为js是属于弱类型语言,可以布尔值转换成整型而已。var ret4 = 1 > 2;
console.log(ret4, typeof ret4); // false "boolean"var ret5 = 1 < 2;
console.log(ret5, typeof ret5); // true "boolean"</script>
</body>
</html>
null类型
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>// 表示,什么都没有。// 类似python里面的None// 在js中,除了明确给一个变量赋值给null,才有null存在,用于变量的初始化var v1 = null;console.log(v1);  // nullconsole.log(typeof v1) // object,typeof也无法查看null类型
</script>
</body>
</html>
undefined类型
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>// undefined表示未定义,在js中,变量为undefined的情况有2种:// 1. 声明了一个变量,但是没有给变量进行赋值var num;console.log(num, typeof num); // undefined "undefined"// 2. 对一个变量的值,明确定义为undefinedvar data = undefined;console.log(data, typeof data); // undefined "undefined"  这种情况往往用于删除var或let关键字声明的变量// 3. 特殊情况,当如果一个变量出现时没有使用var或let关键字进行声明时,// 此时如果通过delete关键字删除变量,则变量就会被删除掉。同时该变量的类型就会变成undefinedage = 16;console.log(age, typeof age); // 16 "number"delete age;console.log(typeof age); // undefined// console.log(age); // 此处报错,被delete删除的age,不能直接被使用了。// 补充,delete是js用于提供给开发者删除属性或者成员的关键字// delete可以删除对应的属性或者数组的成员data = [1,2,3,4]delete data[2]console.log(data) // [1, 2, empty, 4] 被删除的成员为空console.log(data[2], typeof data[2]);  // undefined "undefined"// js中的对象与json格式类似,但是与json不一样的时,json的属性必须是字符串,而js中的属性可以是任意类型的数据var obj = {"name":"小明", "age": 16, 1:2}console.log( obj, typeof obj)console.log(obj[1]); // 当如果对象中存在字符串以外的属性,则获取当前属性可以通过中括号来提取,操作类似python的字典delete obj.nameconsole.log(obj.name, typeof obj.name); // undefined "undefined"// 换句话说,就是访问一个不存在的数组成员或者对象的属性时,值为undefinedconsole.log(obj.sex, typeof obj.sex); // undefined "undefined"// 为什么delete不能删除var或者let声明的变量,但是可以删除不使用var或let声明的变量呢?// money = 200; // 实际上,这个根本就不是在声明一个变量,而是声明了一个对象的属性this.money = 200;   // 上一句代码相当于当前这句代码console.log(money); // 200// 那么,这个this代表的对象是谁呢?console.log(this);// Window对象。叫浏览器窗口对象,// 实际上我们在打开HTML网页时,由浏览器引擎会自动创建浏览器窗口页,那么管理这个窗口页的对象,就是window对象console.log(window); // window是一个超全局对象,我们所编写的js代码实际上就是写给window的。// 因此,我们声明的变量,实际上就是给window添加了一个属性</script>
</body>
</html>
Symbol 类型

Symbol 是 ECMAScript6 中引入的一种新的数据类型,表示独一无二的值,Symbol 类型的值需要使用 Symbol() 函数来生成

var str = "123";
var sym1 = Symbol(str);
var sym2 = Symbol(str);
console.log(sym1);          // 输出 Symbol(123)
console.log(sym2);          // 输出 Symbol(123)
console.log(sym1 == sym2);  // 输出 false :虽然 sym1 与 sym2 看起来是相同的,但实际上它们并不一样,根据 Symbol 类型的特点,sym1 和 sym2 都是独一无二的

引用数据类型

引用数据类型:对象(Object)、数组(Array)、函数(Function)

Array

js中的数组是对象,所有数组中的下标实际上就是属性,下标对应的成员值就是属性值

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>
// 数组代表的是一组数据,这组数据可以有0或多个。数组中的数据也叫成员,
// 类似python里面的列表,数组里面有多个成员。每个成员的值可以是任意类型。// js的数组有2种声明方式:
// 1. 字面量声明方式
// 格式:var 变量名 = ["成员1",成员2....]// 0个成员的空数组
var arr0 = []
console.log(arr0, typeof arr0); // [] "object"
// 注意:js中无法通过typeof辨认区别数组与对象的区别,因为数组就是一种对象。// 数组可以有多个成员
var arr1 = ["苹果","香蕉","梨子","水牛"]
console.log( arr1, Array.isArray(arr1) );  // ["苹果", "香蕉", "梨子", "水牛"] true
// 通过Array数组类的isArray方法可以用于判断指定变量是否是数组,true表示是数组,false表示不是数组// 2. 通过Array函数,创建数组
var arr2 = Array(); // Array本身就是一个用于创建对象的函数,虽然叫类,但实际上内部就是函数,也可以不使用new关键字
console.log(arr2, Array.isArray(arr2)); // [] true// 有成员的数组
var arr3 = Array("苹果","香蕉","梨子","水牛"); // 函数中的参数中传递数组的成员
console.log( arr3, Array.isArray(arr3) ); // ["苹果", "香蕉", "梨子", "水牛"] true// 3. 通过new Array来创建,创建数组对象
// 空数组
var arr4 = new Array(); // new 表示创建,新建
console.log(arr4, Array.isArray(arr4)); // [] true// 有成员的数组
var arr5 = Array("苹果","香蕉","梨子","水牛"); // 函数中的参数中传递数组的成员
console.log( arr5, Array.isArray(arr5) ); // ["苹果", "香蕉", "梨子", "水牛"] true// 创建指定成员数量的数组
var arr6 = new Array(3); // 此处的3并非成员,而是表示创建有3个成员的数组,默认三个成员都是null的
console.log( arr6, Array.isArray(arr6) ); // [empty × 3] true// js中的数组的使用,类似python的列表,也可以通过下标来获取指定位置的成员。
// 下标都是从0开始,逐一递增,但是js中的数组不支持切片或者负数下标
var arr7 = ["苹果","香蕉","梨子","水牛"]
console.log(arr7[0]); // 获取第1个成员的值
console.log(arr7[1]); // 获取第2个成员的值// js的数组同时也可以通过下标来修改对应位置的成员的值。
arr7[0] = "小苹果";
console.log(arr7);
arr7[3] = "大水牛";
console.log(arr7); // ["小苹果", "香蕉", "梨子", "大水牛"]// js中如果设置-1,实际上并不代表原来的数组的最后一个成员,而是表示新增了一个下标为-1的成员
arr7[-1] = "hello"
console.log(arr7);// js中的数组是对象,所有数组中的下标实际上就是属性,下标对应的成员值就是属性值
arr7["money"] = 200
console.log(arr7) // ["小苹果", "香蕉", "梨子", "大水牛", -1: "hello", money: 200]// 获取数组的成员个数,也就是数组的长度,当然,仅仅只是计算下标的成员数量,像负数下标,或字符串格式的下标,会被认为是非数组成员,而是对象的属性。
console.log(arr7.length)// 所以,建议使用js中的数组时,尽量不要添加负数下标或者字符串下标的成员进来,会影响长度计算。
arr8 = ["小苹果", "香蕉", "梨子", "大水牛"]
console.log(arr8);// 基于数组的长度,我们就可以随时获取数组的最后一个成员了。
console.log(arr8[arr8.length-1])  // 大水牛// 数组的成员也可以新增或追加
// 通过指定新的下标来新增数组成员
arr9 = ["苹果"]
arr9[1] = "香蕉"
arr9[2] = "葡萄"
arr9[5] = "梨子" // 注意:尽量不要跳数字下标添加数组成员,否则跳过的数字下标会被认为空成员记录到数组,影响数组的长度计算。
console.log(arr9)  // ["苹果", "香蕉", "葡萄", empty × 2, "梨子"]// 建议追加数组成员
arr10 = ["苹果"]
arr10[arr10.length] = "香蕉"
arr10[arr10.length] = "哈密瓜"
console.log(arr10)// 通过数组提供的push方法来追加数组成员
arr11 = ["苹果"]
arr11.push("香蕉")
arr11.push("梨子", "水牛")
console.log(arr11) // ["苹果", "香蕉", "梨子", "水牛"]// 通过数组提供的unshift方法在数组的左边插入成员
arr12 = ["苹果"]
arr12.unshift("香蕉")
arr12.unshift("梨子", "水牛")
console.log(arr12)  // ["梨子", "水牛", "香蕉", "苹果"]// 删除成员[不要使用delte删除,不干净,会影响计算数组长度]
arr13 = ["A", "B", "C", "D"]
delete arr13[1]
console.log(arr13)// 使用数组提供的方法删除成员
arr14 = ["A", "B", "C", "D"]
arr14.shift() // 删除左边第一个成员
arr14.shift() // 删除左边第一个成员
console.log(arr14)  // ["C", "D"]// 删除数组的最后一个成员
arr15 = ["A", "B", "C", "D"]
arr15.pop()
console.log(arr15)  // ["A", "B", "C"]// 删除数组的指定下标的指定数量成员
arr16 = ["A", "B", "C", "D"]
arr16.splice(2,1)  // 从下标为2开始删除1个成员,当然splice是一个高级函数,提供了数组的删除操作以后,还有新增,替换等功能
console.log(arr16)// 嵌套数组,js中的数组与python一样,可以嵌套多层
arr17 = [[1,2,3],[4,5,6],[7,8,9]
]
console.log(arr17)
console.log(arr17[1])    // 访问第一个成员
console.log(arr17[1][2]) // 访问第一个成员数组的第二个成员</script>
</body>
</html>
Function类型

函数(Function)是一段具有特定功能的代码块,函数并不会自动运行,可以存储在变量、对象、数组中,而且函数还可以作为参数传递给其它函数

var fun = function(){console.log("http://c.biancheng.net/js/");
}
function createGreeting(name){return "Hello, " + name;
}
function displayGreeting(greetingFunction, userName){return greetingFunction(userName);
}
var result = displayGreeting(createGreeting, "Peter");
console.log(result);  // 输出 Hello, Peter
Object类型

Object表示的是一个事物或者有一个概念相关的数据.对象内部有对应事物或者概念的特征[属性]和行为[方法]。
对象的方法/动作,就是函数。
对象的特征/属性,就是变量。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<script>
// 与python不一样,js的对象不需要不依赖于类的创建,也就是说可以直接创建对象,也可以使用类创建对象。
// 常用的声明对象的方式有4种。
// 1. 通过花括号字面量来声明
// 空对象,没有任何属性或方法的对象
var obj0 = {}
console.log(obj0);// 有属性,但没有方法的对象
money = 100
var obj1 = {name: "晓明",age: 30,sex: true,money, // money: money, 当对象的属性值是一个变量,并且变量与属性名一样,则可以简写lve: ["苹果","香蕉","雪梨","水牛"], // 对象的属性成员可以是任意类型,也可以是数组或其他对象gf: {name: "小白",age: 28,sex: false,},
}console.log(obj1);// 有属性,有方法的对象
var obj2 = {name: "晓明",age: 30,sex: true,lve:["苹果","香蕉","雪梨","水牛"],say(){ // 对象的方法,js中声明函数类似与python,但是def换成functionreturn "hello world";},walk(){ // 对象的方法的简写方式,walk: function(){ 的简写return "我在走路!!"}
}console.log(obj2);// 2. 通过Object来创建对象
var obj3 = Object();  // 空对象
// 对象可以追加属性或方法的
obj3.name = "小白";
obj3.age = 28;
obj3.sex=false;
obj3.say = function(){return "hello world";
}
obj3.walk = ()=>{  // function() { 的 简写方式,但是与普通的函数声明有细微区别,后面学到函数的时候我们再讲return "我在走路!!"
}
console.log(obj3);// 2.1 通过new Object来创建对象
var obj4 = new Object();  // 空对象
// 对象可以追加属性或方法的
obj4.name = "小黑";
obj4.age = 16;
obj4.sex=true;
obj4.say = function(){return "hello world";
}
obj4.walk = ()=>{  // function() { 的 简写方式,但是与普通的函数声明有细微区别,后面学到函数的时候我们再讲return "我在走路!!"
}
console.log(obj4);// 3. 通过构造函数来创建
function Humen(name, age, sex){ // 类似以前在python里面的__init__方法。this.name=name;  // this,一个代表当前对象的伪变量,类似python的selfthis.age=age;this.sex=sex;this.say=function(){return "hello world";}
}var obj5 = new Humen("小红",27,false);
console.log(obj5);// 4. 先有类,后有对象
class Person{  // Humen类名,相当于上面的函数名constructor(name, age, sex) { // constructor,构造函数,相当于python的__init__方法// js对象的初始化属性操作全部写在这里this.name = name;this.age = age;this.sex = sex;}say(){ // js中的对象方法return "hello world";}walk(){return "我在走路";}desc(){// 当前对象调用自身的方法或属性,直接使用this调用即可return `我叫${this.name},我今年${this.age}岁。`}
}// 基于类创建对象
obj6 = new Person("小兰", 18, false)
console.log(obj6)// 对象的属性调用
console.log(obj6.name)
// 对象的方法调用
console.log(obj6.desc())
// 对象的属性可以更改
obj6.name = "李小兰"
console.log(obj6.desc())</script>
</body>
</html>

类型转换

javascript是弱类型的编程语言,所以本身不仅提供了数据类型的转换,甚至在数据使用运算符的时候,javascript的解释器也会出现默认隐式转换数据类型的情况。

字符串
  1. 字符串转换成布尔值,除了空字符串(“”)被转为false,其他的任何字符串,只有有内容,都是true
  2. 字符串转换成数值,除了纯数值符号组成的字符串,其他的字符串无法转换成数值
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input id="btn" type="text" value="10"><script>// console.log(btn, typeof btn); // input#btn元素对象 "object"// console.log(btn.value, typeof btn.value); // 10 string//// // 字符串转换成布尔值// var str1 = ""  // 空字符串// console.log( Boolean(str1) ); // false// var str2 = "0"// console.log( Boolean(str2) ); // true// var str3 = " "// console.log( Boolean(str3) ); // true// var str4 = "true"// console.log( Boolean(str4) ); // true// var str5 = "false"// console.log( int(str5) ); // true// // 总结:除了空字符串,其他都转换成true// 字符串转换成数值var num1 = "100"var num1_new = Number(num1)console.log( num1_new, typeof num1_new ); // 100 "number"var num2 = "3.14"var num2_new = Number(num2)console.log( num2_new, typeof num2_new ); // 3.14 "number"var num3 = "3.5公斤"var num3_new = Number(num3);console.log( num3_new, typeof num3_new );  // NaN "number"// NaN是一个特殊的数值,是在js中进行数值计算当结果有误时出现的非数字结果// NaN,全称:Not a Number,表示计算结果是非数值// NaN的特点:// 1. 这个关键字也是数值类型  typeof(NaN)  // "number"// 2. NaN无法进行比较和计算,否则结果都是false或者NaN// 可以转换console.log( Number("-.5"), Number(".5"), Number("+0.5"), Number("1.5e3") );  // -0.5 0.5 0.5 1500// 不可以转换console.log( Number("..5"), Number("100_200_300"), Number("++2") );  // 不可以转换// 总结:除了数值组成的字符串,其他的字符串无法转换成数值.// 字符串转换成数组var str1 = "hello"console.log( Array(str1) ); // 自动变成数组的一个成员,相当于 [str1]console.log([str1])
</script>
</body>
</html>
数值
  1. 数值转字符串,任意的数值都可以转换成字符串
  2. 数值转布尔值,除了0和0.0和NaN,其他都是true
  3. 数值之间的转换,可以通过Number把纯数值组成的字符串转换成数值类型,可以通过parseInt或parseFloat把以数值开头的字符串转换成数值,但是非数值开头的字符串,无法转换成数值类型。同时,字符串格式千分位数字,parseInt或parseFloat也不识别。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 数值转换成字符串var num1 = 100;var num2 = 3.14;var num3 = 0;console.log( String(num1) ); // 100console.log( String(num2) ); // 3.14console.log( String(num3) ); // 0// 总结:任意的数值都可以转换成字符串// // 数值转换成布尔值// var num4 = 1;// var num5 = 2;// var num6 = -1;// var num7 = 0;// var num8 = 0.0;// var num9 = NaN;// console.log( Boolean(num4) ); // true// console.log( Boolean(num5) ); // true// console.log( Boolean(num6) ); // true// console.log( Boolean(num7) ); // false// console.log( Boolean(num8) ); // false// console.log( Boolean(num9) ); // false// 总结:除了0和0.0和NaN,都是true// 数值之间的转换// parseInt(数值)    // 把数值转换成整数格式// parseFloat(数值)  // 把数值转换成小数格式var num10 = 3.14;var num11 = '3.14';var num12 = '3.14块';var num13 = '3.3.5';var num14 = '共3斤';var num15 = '100_200_300';// 小数转化成整数console.log( parseInt(num10) )  // 3// 纯数字的字符串转化成整数或浮点数console.log( parseInt(num11), parseFloat(num11) ) // 3   3.14// 以数值开头的字符串,例如:"+3斤", "-3.0斤"console.log( parseInt(num12), parseFloat(num12) ) // 3   3.14console.log( parseInt(num13), parseFloat(num13) ) // 3   3.3console.log( Number(num12), Number(num13) ) // NaN NaN,Number函数只能转换纯数值组成的字符串// 非数字开头的字符串,parseInt或parseFloat也无能为力// 针对字符串格式的千分位数值,parseInt或parseFloat也不认识console.log( parseInt(num14), parseFloat(num15) ) // NaN 100</script>
</body>
</html>
隐式转换
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 隐式转换:就是弱类型语言的变量数据类型会因为当前运行环境的需要,而自动发生类型转换。// 因为+号的语法规则就是2个数值相加,或者2个字符串拼接。console.log(10 + true);    // 先把true装换成数值类型的1,所以10+1 = 11console.log("10" + true);    // 先把true转换成字符串类型的"true",所以"10"+ "true" = "10true"// 因为-号的语法规则是2个数值相减console.log("10" - true); // 10,想把"10"被转换成10,接着把false转成0 ,最终的10-0 = 10console.log("10" - "3");  // 7, 想把"10"被转换成10,接着把"3"转成3,最终的10-3 = 7
</script>
</body>
</html>

运算符

算数运算符

运算符描述
+加法
-减法
*乘法
/除法
%取模/求余数
**幂运算
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>input{width: 40px;}</style>
</head>
<body><input type="text" name="num1" value="0"><select name="oprator"><option value="+">+</option><option value="-">-</option><option value="*">*</option><option value="/">/</option><option value="%">%</option><option value="**">**</option></select><input type="text" name="num2" value="0">=<input type="text" name="result" value="0"><button id="calc">计算</button>
<script>// 先获取id=calc的元素// document.querySelector("css选择符")var calc = document.querySelector('#calc');var num1 = document.querySelector('input[name="num1"]');var num2 = document.querySelector('input[name="num2"]');var oprator = document.querySelector('select[name="oprator"]');var result = document.querySelector('input[name="result"]');// 绑定点击效果calc.onclick = function(){console.log("开始计算", `${num1.value}${oprator.value}${num2.value}=`);if(oprator.value === "+"){// 加法运算result.value = parseFloat(num1.value) + parseFloat(num2.value);}else if(oprator.value === "-"){// 减法运算result.value = num1.value - num2.value;}else if(oprator.value === "*"){// 乘法运算result.value = num1.value * num2.value;}else if(oprator.value === "/"){// 除法运算result.value = num1.value / num2.value;}else if(oprator.value === "%"){// 取模运算result.value = num1.value % num2.value;}else if(oprator.value === "**"){// 幂运算result.value = num1.value ** num2.value;}}
</script>
</body>
</html>

赋值运算符

运算符描述例子:
=把右边的数据赋值给左边的变量a = 29;
+=在变量原有数据的基础上,加上/拼接右边的值,赋值给左边的变量a +=1; 相当于 a=a+1
-=在变量原有数值的基础上,减去右边的值,赋值给左边的变量a -=1; 相当于 a=a-1
*=在变量原有数值的基础上,乘以右边的值,赋值给左边的变量a *=2; 相当于 a=a*2
/=在变量原有数值的基础上,除以右边的值,赋值给左边的变量a /= 3; 相当于 a=a/3;
%=在变量原有数值的基础上,除以右边的值,取余数,赋值给左边的变量a %= 3; 相当于 a=a%3;
**=在变量原有数值的基础上,对右边的值进行幂运算,赋值给左边的变量a **= 3; 相当于 a=a**3;
++在变量原有数值的基础上,+1,赋值给左边的变量++使用的对象必须是变量,不能是字面量
--在变量原有数值的基础上,-1,赋值给左边的变量–使用的对象必须是变量,不能是字面量
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>/*= 把右边的数据赋值给左边的变量*/// var age = 17;// console.log(age);// age =18;// console.log(age);/*+= 在变量原有数据的基础上,加上/拼接右边的值,赋值给左边的变量*/// var num1 = 10;// num1 += 2;// // num1 = num1 + 2;  // 表达式遇到=号时,会先运行=号右边的代码// console.log(num1)/*自增运算符++ 在变量原有数值的基础上,+1,赋值给当前变量*/var num2 = 10;console.log(++num2); // 11,++写在变量左边,前自增,先进行变量+1,然后运行当前一句代码var num3 = 10;console.log(num3++); // 10,++写在变量右边,后自增,先运行当前一句代码,运行完以后,才进行变量+1console.log(num3);   // 11/*自减运算符-- 在变量原有数值的基础上,-1,赋值给当前变量*/var num4 = 10;console.log(--num4); // 9,--写在变量左边,前自减,先进行变量-1,然后运行当前一句代码var num5 = 10;console.log(num5--); // 10,--写在变量右边,后自减,先运行当前一句代码,运行完以后,才进行变量-1console.log(num5);   // 9// 以下代码会报错!!// console.log(++3);</script>
</body>
</html>

比较运算符

运算符描述
==判断左右两边数据的值是否相等,类型不一样也没关系
===判断左右两边数据的值是否相等并类型是否同时也一致,也叫全等
>判断左边的值是否大于右边的值
>=判断左边的值是否大于等于右边的值
<判断左边的值是否小于等于右边的值
<=判断左边的值是否小于等于右边的值
!=判断左右两边的值是否不相等
!==判断左右两边的值是否不相等或者类型不一样,不全等
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>/*** == 判断两边的变量的值是否相等,不判断数据类型*/var num1 = 1;var num2 = 2;var num3 = true;var num4 = "1"var num5 = 0;var num6 = "0"console.log(num1 == num2); // falseconsole.log(num3 == num1); // trueconsole.log(num4 == num1); // trueconsole.log(num5 == num6); // trueconsole.log(num5 == false); // true// 很神奇,num6转换成布尔值,是true,而num6与true直接判断,结果不等console.log(num6 == true); // falseconsole.log(Boolean(num6)); // trueconsole.log("" == false); // trueconsole.log("" == undefined); // falseconsole.log(false == undefined); // false/*** === 判断两边的值是否相等并且数据类型是否一样。*/console.log("10" == 10); // trueconsole.log("10" === 10); // false/*** !== 不全等,只要两边的值不同或者类型不一样则返回true*/console.log("10" != 10); // falseconsole.log("10" !== 10); // true
</script>
</body>
</html>

逻辑运算符

运算符描述
&&and,且,并且 左边为假,拿左边,左边为真,拿右边。
||or,或,或者 左边为真拿左边,左边为假拿右边。
!not ,非,取反 非真既假,非假既真
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>/*** 真且真,返回真 [不管任何内容,都是返回后面的,短路现象]* 真且假,返回假 [不管任何内容,都是返回后面的,短路现象]* 假且真,返回假 [不管后面是任何内容,直接不执行,返回左边条件结果]* 真或假,返回真 [不管后面是任何内容,直接不执行,返回左边条件结果]* 假或真,返回真 [不管任何内容,都是返回后面的,短路现象]* 假或假,返回假 [不管任何内容,都是返回后面的,短路现象]* 非真即假,非假即真*/console.log( true && true )      // trueconsole.log( 1 == 1 && 2 == 2 )  // trueconsole.log( 1 && 2 )            // 2console.log( true && false )  // falseconsole.log( true && 2 )      // 2console.log( 1 && 0 )         // 0console.log( true || false )  // trueconsole.log( 1 || 0 )         // 1console.log( false || false ) // falseconsole.log(  0 || '结果' )       // '结果'console.log( !true )          // falseconsole.log( !100 )           // falseconsole.log( !false )         // trueconsole.log( !'' )            // true// 语句短路了,根据判断status的布尔值,判断是否要计算赋值var age = 17var status = ""; // 此处除了""可以当成false使用,其他的false,0,null,undefined都不能被当成false使用,隐式转换带来的不好影响var ret1 = status || (age=3);console.log(ret1, `age=${age}`);
</script>
</body>
</html>

三元运算符

运算符描述
条件?true:false根据条件的结果判断,条件结果为true,则返回冒号左边的结果,否则返回冒号右边的结果
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>/*** 条件?true:false*/var age = 21;var ret = age >= 18?"成年人":"未成年人";console.log(ret);/**// python中的三元表达式age = 18ret = "成年人" if age >= 18 else "未成年人"print(ret)*/
</script>
</body>
</html>

运算符优先级

image-20250715230021291

流程控制

语句块

{// 语句块,会作为一个整体来执行。
}

判断分支语句

if语句
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><input type="text" name="age"><button id="btn">判断年龄</button><script>document.querySelector("#btn").onclick = function(){let age = parseInt(document.querySelector('[name="age"]').value)/*** 单个条件分支*/// if(age<18){//     console.log("未成年");// }// /**//  * 单个条件2个分支//  */// if(age<18){//     console.log("未成年");// }else{//     console.log("成年")// }/*** 多条件分支*/if(age<18){console.log("未成年");}else if(age<30){console.log("青少年");}else if(age<60){console.log("中青年");}else{console.log("老年");}}</script>
</body>
</html>
switch语句
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// // 获取操作系统的当前时间对象// var date = new Date();// console.log(date, typeof date);// // 获取一个指定时间的对象// date = new Date("1989-02-17 12:30:00");// console.log(date);// // 获取时间// console.log(date.toISOString());// // 获取年份// console.log(date.getFullYear());// // 获取月份// console.log(date.getMonth()+1);// // 获取本月的日期// console.log(date.getDate());// // 获取当前小时// console.log(date.getHours());// // 获取当前分钟// console.log(date.getMinutes());// // 获取当前秒// console.log(date.getSeconds());// // 获取数值时间戳[从1970年1月1日 00:00:00至今的总毫秒数]// console.log(date.getTime());// console.log(date.getTime()/1000); // 秒时间戳// 根据今天周几判断显示网页的主题颜色var date = new Date();var week = date.getSeconds() % 7// var week = date.getDate()console.log( week ); // 获取今天是周几(周日是0,周一时1,周六是6)switch (week) {case 0:console.log("周日哦");break; // 跳出当前swtich语句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;default:console.log("周六!!!")}colorTheme = ["red", "orange", "yellow", "green", "#00ffff", "blue", "#ff00ff"]document.body.style.backgroundColor = colorTheme[week];// background-color 改成 backgroundColor,因为js中-号有特殊用途</script>
</body>
</html>

循环遍历语句

while循环
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><script>/*** while基本使用*/// 输出1-10之间的整数// var num = 1;// while (num<=10){//     // console.log(num);//     // // num+=1;//     // num++;//     console.log(num++);// }// // 输出1-10之间的偶数// var num = 1;// while (num<=10){//     if(num%2===0){//         console.log(num);//     }//     num++;// }// // 输出10-0之间的偶数// var num = 10;// while (num>=0){//     if(num%2===0){//         console.log(num);//     }//     num--;// }// // 循环统计// // 输入1-100之间的整数和// var sum = 0;// var num = 1;// while (num<=100){//     sum+=num++;// }// console.log(sum); // 5050// 循环输出数组的成员// var data = ["A", "B", "C", "D"]// var key = 0;// while (key < data.length){//     console.log(data[key++])// }// 循环js中获取的元素列表// document.querySelector(css选择符);  // 获取一个HTML元素对象// document.querySelectorAll()  // 获取多个HTML元素对象var li_list = document.querySelectorAll("ul li");var key = 0;// js中推荐变量的命名风格时小驼峰写法var colorList = ["red", "orange", "yellow", "green", "#00ffff", "blue", "#ff00ff"]while (key < li_list.length){  // 小括号不管写的是什么,最终都会转成布尔值来进行判断。// 获取表单元素以外的双标签元素的内容(innerHTML)console.log(li_list[key].innerHTML);// 修改双标签元素的内容li_list[key].innerHTML = `${key}个元素`// 修改元素的css行内样式li_list[key].style.backgroundColor = colorList[key];// 避免死循环,让key自增,慢慢让while条件变得不成立key++;}</script>
</body>
</html>
do while循环
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// do...while 也是循环语句,与while不一样的时,while先判断条件,后执行代码块,而do...while先执行代码块,后判断条件// do...while 可以保证循环中的代码块会至少执行一遍,实际工作中很少使用。// num = 10;// while (num<10){ // 先判断条件,后执行花括号中的代码块//     console.log(num);// }num = 10;do{ // 先执行代码块,console.log(num++);}while (num<10); // 后判断条件</script>
</body>
</html>
for循环
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 输出1-10之间的整数// var num = 1; // 1. 初始化值// while(num<=10){ // 2. 判断条件//     console.log(num); // 3. 条件为true时,执行代码块内容//     num++;  // 4. 步进器,循环每一步的递增值,目的是让循环条件慢慢变得不成立// }/**for(1. 初始值; 2. 判断条件; 4. 步进器){// 3. 代码块}*/// for(let num = 1; num<=10; num++){//     console.log(num);// }// for循环还可以在初始化值,判断条件或步进器都可以设置多段语句,采用英文逗号隔开// for(let x = 1, y=10; x*3<=y; x++,y+=2){//     console.log(`x=${x}, y=${y}`);// }// for还可以嵌套使用,当然while循环也可以// // 九九乘法表// var content;// for(let x=1; x<=9; x++){//     content = "";//     for(let y=1;y<=x;y++){//         content += `${x}*${y}=${x*y} `//     }//     console.log(content);// }/*** for 遍历数组,获取下标*/// var colorList = ["red", "orange", "yellow", "green", "#00ffff", "blue", "#ff00ff"];// for(let item in colorList){//     // item代表的是遍历过程中数组成员的下标//     console.log(item, colorList[item])// }/*** for遍历数组,获取值*/colorList = ["red", "orange", "yellow", "green", "#00ffff", "blue", "#ff00ff"];for(let item of colorList){// item代表的是遍历过程中数组成员的值console.log(item)}</script>
</body>
</html>

异常处理

异常捕获

try{// 尝试执行的代码
}catch(e){// 异常处理,e 表示异常对象,或者异常结果
}
finally{// 不管try语句块代码是否执行成功,都会执行finally中的代码
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// var num = 2;// 当js中使用了一个未定义的变量,进行代码执行或者作为函数的参数就会报错。try {console.log(num);}catch (e) {// name表示本次出现的异常类型,message表示异常的提示信息console.log(e.name, e.message);}finally {console.log("try代码块的执行是否出现异常,都会执行finally操作")}</script>
</body>
</html>

抛出异常

throw 异常表达式;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 抛出异常信息// var age = 12;// if(age <18){//     throw "对不起,您未成年,不能进入网吧!";// }// 自定义异常var person = {"name": "小明", "age": 17}function UserError(name){this.name = "UserException";this.message = `对不起,${name},您未成年,不能进入网吧!`;}if(person.age <18){throw new UserError(person.name);}</script>
</body>
</html>

函数

javascript 被称为披着面向对象的皮的函数式编程语言,是函数优先的编程语言,所以本质上js中的一切都是基于函数构建出来,所以函数本身也是对象,也是一等公民。

函数声明

函数声明格式有3种:
// 1. 普通函数
function 函数名(形参1,形参2,形参3,....){// 函数代表的代码段
}// 2. 匿名函数
var 函数名 = function(形参1,形参2,形参3,....){// 函数代表的代码段
}// 3. 箭头函数[新版本的js里面出现的新型语法,是匿名函数的新写法]
var 函数名 = (形参1,形参2,形参3,....)=>{// 函数代表的代码段
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>/*** 普通函数*/// func(); // 普通函数可以先调用,后声明// function func(){//     console.log("普通函数执行了")// }/*** 匿名函数*/func = function(){console.log("匿名函数执行了");}func(); // 匿名函数必须先赋值,后调用/*** 箭头函数[是匿名函数的新型写法,所以必须先赋值,后调用]*/func = ()=>{console.log("箭头函数执行了")}func();</script>
</body>
</html>

立即执行函数

立即执行函数也叫匿名函数执行,顾名思义就是创建函数就立马执行

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>// 匿名函数自执行(function(name){var num = 20; // 在函数中通过关键字var/let声明的变量,只能在当前函数中使用,无法被外界调用console.log("匿名函数执行了。", `name=${name}`)})("小明");// 箭头函数自执行((name)=>{console.log("匿名函数执行了。", `name=${name}`)console.log(num); // 此处报错})("小红");</script>
</body>
</html>

内建函数

build-in function,js内部提供的,我们可以直接调用的。

函数描述
parseInt()把数据转换成数值类型中的整数
parseFloat()把数据转换成数值类型的浮点数
isNaN()判断一个数据是否是非数字NaN
alert(message)弹出一个警告框,message是提示内容
confirm(message)弹出一个确认框
prompt(message)弹出一个输入确认框
setInterval(func, ms)定时器[多次],定时执行指定代码段,func是一个匿名函数,ms表示定时间隔,单位:毫秒
clearInterval()删除指定的定时器
setTimeout(func, ms)定时器[一次],定时执行指定代码段
clearTimeout()删除指定的定时器
eval()内置语法解析器,把符合js语法规则的字符串当成代码执行,非常危险的函数。
encodeURI()对url地址中的内容进行编码处理,但不支持特殊符号的编码
decodeURI()对url地址中的内容进行解码处理,但不支持特殊符号的解码
encodeURIComponent()功能同上,但不具有上述缺点。
decodeURIComponent()功能同上,但不具有上述缺点。
close()关闭浏览器窗口,相当于window.close(),如果指定其他窗口对象的close方法,则关闭指定窗口。
open(url, target, windowname)新建一个浏览器窗口,返回值是新页面的window对象
btoa()使用base64编码对数据进行编码处理,把字符串内容编码成base64字符。
atob()使用base64编码对数据进行解码处理,把base64字符解码成字符串内容。

总结

JavaScript主要用来控制网页行为包括一些动态效果和交互功能,从而实现人机交互效果。主要介绍他的语言特性和基本语法。参考网址:JavaScript | MDN


文章转载自:
http://champac.elldm.cn
http://armure.elldm.cn
http://cellarway.elldm.cn
http://ceinture.elldm.cn
http://castoreum.elldm.cn
http://aomori.elldm.cn
http://brachistochrone.elldm.cn
http://allemande.elldm.cn
http://alexbow.elldm.cn
http://boite.elldm.cn
http://auditoria.elldm.cn
http://aerometeorograph.elldm.cn
http://bourgeoisie.elldm.cn
http://autophyte.elldm.cn
http://argos.elldm.cn
http://botanist.elldm.cn
http://balanoid.elldm.cn
http://beztine.elldm.cn
http://busload.elldm.cn
http://affluent.elldm.cn
http://aphaeresis.elldm.cn
http://bailout.elldm.cn
http://chorography.elldm.cn
http://brasil.elldm.cn
http://acclaim.elldm.cn
http://anthroponym.elldm.cn
http://chiropractic.elldm.cn
http://bandstand.elldm.cn
http://bistable.elldm.cn
http://capitulant.elldm.cn
http://www.dtcms.com/a/281381.html

相关文章:

  • 第五章 管道工程 5.2 燃气管道
  • 数据库第三次作业
  • 脚手架新建Vue2/Vue3项目时,项目文件内容的区别
  • yolo-world环境配置
  • 【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】
  • 关于实习的经验贴
  • eSearch识屏 · 搜索 v14.3.0
  • Redis集群搭建(主从、哨兵、读写分离)
  • netstat -tlnp | grep 5000
  • 3.创建表-demo
  • 进程的内存映像,只读区,可读写区,堆,共享库,栈详解
  • 23.将整数转换为罗马数字
  • 磁悬浮轴承的“眼睛”:位移测量核心技术深度解析
  • 【监控实战】Grafana自动登录如何实现
  • 关于tresos Studio(EB)的MCAL配置之FEE
  • dataLoader是不是一次性的
  • 文心一言4.5企业级部署实战:多模态能力与Docker容器化测评
  • 告别手动迁移:使用 PowerShell 一键导出 IIS 配置,让服务器迁移更轻松
  • LSA链路状态通告
  • QT——文件选择对话框 QFileDialog
  • Transformer是什么 - 李沐论文《Attention Is All You Need》精读
  • 内网穿透实例:在 NAT 环境下通过 FRP 配置 ThinLinc 远程桌面 实现外网登录
  • zynq串口的例子
  • 自己训练大模型?MiniMind 全流程解析 (一) 预训练
  • 如何科学做好企业软件许可优化?
  • Day03_C语言网络编程20250715
  • Datawhale AI 夏令营第一期(机器学习方向)Task2 笔记:用户新增预测挑战赛 —— 从业务理解到技术实现
  • 如何理解flex: 1 1 50%
  • 【Unity基础】Unity中元素的层级排序
  • WPF,Winform,HTML5网页,哪个UI开发速度最快?