前言:学习JavaScript为前端设置动态效果,实现交互。JavaScript是一种广泛应用于网页开发的脚本语言,它能够使网页变得更加动态和交互性。作为一种客户端脚本语言,JavaScript可以被嵌入到HTML中,并且可以被所有现代的网页浏览器支持。

JavaScript,HTML,CSS共同构成网页
- HTML:用来定义网页内容,例如:标题,正文,图像等(HTML是网页制作的基础语言---->跳转学习:HTML);
- CSS:用来修饰网页组件得外观,例如:颜色,大小,位置,背景等等(CSS是网页制作的修饰语言--->跳转学习:CSS)
- JavaScript:用来实时更新网页内容,例如:从服务器中获取数据并更新到网页中,修改某些标签的样式内容,可以让网页变得生动.
Javascript的使用方式
HTML 页面内嵌式:
-
这是最简单的 JavaScript 书写方式,直接在 HTML 页面中使用
<script>标签嵌入 JavaScript 代码。 -
优点是简单易用,适合小型项目或快速验证代码效果。
-
缺点是代码维护性差,不便于大型项目的组织和管理。
<!DOCTYPE html>
<html>
<head>
<title>内嵌式 JavaScript</title>
</head>
<body>
<h1 id="demo">Hello, JavaScript!</h1>
<button onclick="changeText()">点我改变</button>
<script>
function changeText() {
document.getElementById("demo").innerHTML = "我是内嵌式!";
}
</script>
</body>
</html>
HTML 页面内联式:
-
将 JavaScript 代码直接嵌入在 HTML 元素的事件属性中,如
onclick、onmouseover等。 -
优点是操作简单,可以快速绑定事件。
-
缺点是代码可读性差,且不便于维护和扩展。
<!DOCTYPE html> <html> <head> <title>内联式 JavaScript</title> </head> <body> <h1 id="demo">Hello, JavaScript!</h1> <button onclick="document.getElementById('demo').innerHTML = '我是内联式!'">点我改变</button> </body> </html>外部 JavaScript 文件:
-
将 JavaScript 代码写在一个单独的
.js文件中,然后通过 HTML 的<script>标签引用该文件。 -
优点是代码组织更清晰,便于维护和复用。
-
缺点是需要额外的文件管理,开发初期可能会增加一些复杂度。
HTML:
<!DOCTYPE html>
<html>
<head>
<title>外部 JavaScript 文件</title>
</head>
<body>
<h1 id="demo">Hello, JavaScript!</h1>
<button onclick="changeText()">点我改变</button>
<script src="script.js"></script>
</body>
</html>
JS文件:
function changeText() {
document.getElementById("demo").innerHTML = "Text changed!";
}

JS文件的代码执行顺序:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS文件的代码执行顺序</title>
<head>
<meta charset="utf-8">
<title></title>
<script>
alert("写在<head>标签中");
</script>
</head>
<body>
<script>
alert("写在<body>标签中");
</script>
</body>
</html>


使用模块化方式书写(ES6 模块)
-
随着 ES6 的引入,JavaScript 支持模块化开发。通过
import和export关键字,可以将代码分割成多个模块,便于组织大型项目。 -
优点是提供了更好的代码组织和复用机制,适合大型项目。
-
缺点是需要一定的学习成本,并且需要额外的构建工具支持。
Javascript的基本语法
变量:
变量的命名规则
变量名必须以字母、下划线(
_)、美元符号($)开头。后续字符可以是字母、下划线、美元符号或数字(0 - 9)。
变量名区分大小写。
不能使用 JavaScript 的保留字作为变量名,如
if、for、class等。
使用 var 声明变量
-
var是 JavaScript 中最早用于声明变量的关键字,具有函数作用域(在函数内声明时)或全局作用域(在全局范围内声明时)。它允许重复声明同一个变量。
var x = 10;
var x = 20; // 可以重复声明
console.log(x); // 输出 20
使用 let 声明变量
-
let是 ES6 引入的用于声明变量的关键字,具有块级作用域(在代码块{}内声明),不能在同一个作用域内重复声明同一个变量。
let y = 10;
// let y = 20; // 会报错,不能重复声明
{
let y = 30;
console.log(y); // 输出 30
}
console.log(y); // 输出 10
使用 const 声明变量
-
const也是 ES6 引入的,用于声明常量。它声明的变量必须初始化,并且不能重新赋值,同样具有块级作用域。
const z = 10;
// z = 20; // 会报错,不能重新赋值
const obj = { a: 1 };
obj.a = 2; // 可以修改对象的属性
console.log(obj); // 输出 { a: 2 }
变量的作用域
全局作用域
-
在全局范围内声明的变量具有全局作用域,可以在任何地方访问。
var globalVar = "I'm global";
function checkScope() {
console.log(globalVar); // 可以访问
}
checkScope();
函数作用域(var)
-
使用
var在函数内声明的变量具有函数作用域,只能在函数内部访问。
function func() {
var funcVar = "I'm in function";
console.log(funcVar); // 可以访问
}
func();
// console.log(funcVar); // 会报错,无法访问
块级作用域(let 和 const)
-
使用
let和const在代码块{}内声明的变量具有块级作用域,只能在代码块内部访问。
if (true) {
let blockVar = "I'm in block";
console.log(blockVar); // 可以访问
}
// console.log(blockVar); // 会报错,无法访问
基本数据类型:
基本数据类型是不可变的数据类型,也称为原始数据类型。JavaScript 有 7 种基本数据类型:
| 数据类型 | 特点描述 | 常见定义方式 | 示例及说明 |
|---|---|---|---|
string | 用于表示文本数据,不可变。使用单引号、双引号或反引号定义。 | 单引号、双引号或反引号包裹的文本。 | const str1 = 'Hello';,const str2 = "World";,const str3 = 'JavaScript';。 |
number | 用于表示整数和浮点数,以及特殊值 Infinity、-Infinity 和 NaN。 | 直接赋值数字。 | const num1 = 10;,const num2 = 3.14;,const num3 = Infinity;。 |
boolean | 表示逻辑值,只有两个值:true 和 false。 | 直接赋值 true 或 false。 | const isTrue = true;,const isFalse = false;。 |
null | 表示空值或不存在的值,只有一个值 null。 | 直接赋值 null。 | let nullable = null;。 |
undefined | 表示变量已声明但未赋值,或对象属性、函数参数不存在。 | 未赋值的变量或未定义的属性。 | let undeclared;,未定义的对象属性会返回 undefined。 |
symbol | ES6 引入,表示唯一的、不可变的值,常用于创建对象的唯一属性名。 | 使用 Symbol() 函数创建。 | const sym1 = Symbol("description");,const sym2 = Symbol("description");,console.log(sym1 === sym2); 输出 false。 |
bigint | ES2020 引入,用于表示任意精度的整数,可安全存储和操作非常大的整数值。 | 在数字后添加 n 后缀。 | const bigInt1 = 123456789012345678901234567890n;。 |
string(字符串)
-
用于表示文本数据,使用单引号(')、双引号(")或反引号(`)定义。字符串是字符的序列,一旦创建,内容就不能改变。
const str1 = 'Hello';
const str2 = "World";
const str3 = `JavaScript`;
console.log(str1); // 输出 "Hello"
console.log(str2); // 输出 "World"
console.log(str3); // 输出 "JavaScript"
number(数字)
-
用于表示整数和浮点数。JavaScript 中的数字是双精度 64 位浮点数。此外,还有特殊的数字值,如
Infinity(无穷大)、-Infinity(负无穷大)和NaN(非数字)。
const intNum = 10; // 整数
const floatNum = 3.14; // 浮点数
const bigNum = 123456789012345678901234567890; // 大整数(在 ES2020 之前可能会丢失精度)
const infinity = Infinity;
const notANumber = NaN;
console.log(typeof intNum); // 输出 "number"
console.log(typeof floatNum); // 输出 "number"
console.log(typeof bigNum); // 输出 "number"
console.log(typeof infinity); // 输出 "number"
console.log(typeof notANumber); // 输出 "number"
boolean(布尔值)
-
用于表示逻辑值,只有两个值:
true(真)和false(假)。常用于条件判断。
const isTrue = true;
const isFalse = false;
console.log(isTrue); // 输出 true
console.log(isFalse); // 输出 false
null(空值)
-
表示一个空值或不存在的值。它是一个独立的数据类型,只有一个值
null。通常用于表示变量没有指向任何对象。
let nullable = null;
console.log(nullable); // 输出 null
console.log(typeof nullable); // 输出 "object"(这是一个历史遗留问题,实际上 null 是一个独立的类型)
undefined(未定义)
-
表示变量已被声明,但尚未赋值。或者表示对象属性或函数参数不存在。
let undeclared;
console.log(undeclared); // 输出 undefined
console.log(typeof undeclared); // 输出 "undefined"
symbol(符号)
-
ES6 引入的一种新的原始数据类型,用于表示唯一的、不可变的值。常用于创建对象的唯一属性名。
const sym1 = Symbol("description");
const sym2 = Symbol("description");
console.log(sym1 === sym2); // 输出 false,因为每个 Symbol 都是唯一的
bigint(大整数)
-
ES2020 引入的一种新的原始数据类型,用于表示任意精度的整数。它可以安全地存储和操作非常大的整数值。
const bigInt1 = 123456789012345678901234567890n;
const bigInt2 = 98765432109876543210987654321n;
console.log(bigInt1 + bigInt2); // 输出 123456789012345678901234567890n + 98765432109876543210987654321n 的结果
引用数据类型:
引用数据类型是复杂的数据类型,用于存储对象。变量存储的是对象在内存中的引用,而不是对象本身。JavaScript 中的引用数据类型包括:
| 引用数据类型 | 特点描述 | 常见定义方式 | 示例及说明 |
|---|---|---|---|
Object | 用于表示一组无序的键值对集合,键是字符串或符号,值可以是任何数据类型。 | 使用对象字面量 {} 或 new Object()。 | const person = { name: "John", age: 30, isStudent: false };。 |
Array | 用于存储多个值的有序集合,元素可以是任何数据类型,通过索引访问。 | 使用数组字面量 [] 或 new Array()。 | const numbers = [1, 2, 3, 4, 5];,const mixed = [1, "two", true, { name: "John" }];。 |
Function | 用于定义可执行的代码块,可以有参数和返回值,并且可以被调用。 | 使用函数声明或函数表达式。 | function add(a, b) { return a + b; },const result = add(5, 3);。 |
Date | 用于表示日期和时间。 | 使用 new Date()。 | const now = new Date();,console.log(now); 输出当前日期和时间。 |
RegExp | 用于描述字符串模式,用于搜索、替换等操作。 | 使用正则表达式字面量 /pattern/ 或 new RegExp()。 | const pattern = /javascript/i;,const str = "I love JavaScript!";,console.log(pattern.test(str)); 输出 true。 |
Map | ES6 引入,用于存储键值对,键可以是任何数据类型,并且可以获取键值对的数量。 | 使用 new Map()。 | const map = new Map();,map.set("name", "John");,map.set(1, "one");,console.log(map.get("name")); 输出 "John"。 |
Set | ES6 引入,用于存储唯一的值,可以是任何数据类型。 | 使用 new Set()。 | const set = new Set();,set.add(1);,set.add("two");,console.log(set.size); 输出 2。 |
WeakMap | ES6 引入,是一种键弱引用的对象集合,键必须是对象。 | 使用 new WeakMap()。 | const weakMap = new WeakMap();,const obj = {};,weakMap.set(obj, "value");,console.log(weakMap.get(obj)); 输出 "value"。 |
WeakSet | ES6 引入,是一个弱引用的值的集合,值必须是对象。 | 使用 new WeakSet()。 | const weakSet = new WeakSet();,const obj = {};,weakSet.add(obj);,console.log(weakSet.has(obj)); 输出 true。 |
Object(对象)
-
用于表示一组无序的键值对集合。每个键是一个字符串或符号,值可以是任何数据类型。
const person = {
name: "John",
age: 30,
isStudent: false
};
console.log(person.name); // 输出 "John"
console.log(person.age); // 输出 30
console.log(person.isStudent); // 输出 false
Array(数组)
-
用于存储多个值的有序集合。数组中的元素可以是任何数据类型,并且可以通过索引访问。
const numbers = [1, 2, 3, 4, 5];
const mixed = [1, "two", true, { name: "John" }];
console.log(numbers[0]); // 输出 1
console.log(mixed[3].name); // 输出 "John"
Function(函数)
-
用于定义可执行的代码块。函数可以有参数和返回值,并且可以被调用。
function add(a, b) {
return a + b;
}
const result = add(5, 3);
console.log(result); // 输出 8
Date(日期)
-
用于表示日期和时间。
const now = new Date();
console.log(now); // 输出当前日期和时间
RegExp(正则表达式)
-
用于描述字符串模式,用于搜索、替换等操作。
const pattern = /javascript/i;
const str = "I love JavaScript!";
console.log(pattern.test(str)); // 输出 true
console.log(str.match(pattern)); // 输出 ["JavaScript"]
Map(ES6 引入)
-
用于存储键值对,键可以是任何数据类型,并且可以获取键值对的数量。
const map = new Map();
map.set("name", "John");
map.set(1, "one");
console.log(map.get("name")); // 输出 "John"
console.log(map.size); // 输出 2
Set(ES6 引入)
-
用于存储唯一的值,可以是任何数据类型。
const set = new Set();
set.add(1);
set.add("two");
set.add(1); // 重复添加无效
console.log(set.size); // 输出 2
console.log(set.has(1)); // 输出 true
获取变量数据类型
使用 typeof 运算符
typeof 运算符返回一个字符串,表示未经计算的操作数的类型。
基本数据类型
-
对于基本数据类型,
typeof返回以下字符串:-
"string":字符串类型。 -
"number":数字类型。 -
"boolean":布尔类型。 -
"undefined":未定义类型。 -
"symbol":符号类型(ES6 引入)。 -
"bigint":大整数类型(ES2020 引入)。
-
const str = "Hello";
const num = 10;
const bool = true;
let und;
const sym = Symbol("description");
const big = 123456789012345678901234567890n;
console.log(typeof str); // 输出 "string"
console.log(typeof num); // 输出 "number"
console.log(typeof bool); // 输出 "boolean"
console.log(typeof und); // 输出 "undefined"
console.log(typeof sym); // 输出 "symbol"
console.log(typeof big); // 输出 "bigint"

null 的特殊情况
-
对于
null,typeof返回"object"。这是一个历史遗留问题,因为早期的 JavaScript 将null视为对象类型的空值。 -
const nullable = null; console.log(typeof nullable); // 输出 "object"
使用 instanceof 运算符
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。它通常用于检测引用数据类型的实例。
const obj = new Object();
const arr = new Array();
const date = new Date();
const regex = new RegExp();
const map = new Map();
const set = new Set();
const weakMap = new WeakMap();
const weakSet = new WeakSet();
console.log(obj instanceof Object); // 输出 true
console.log(arr instanceof Array); // 输出 true
console.log(date instanceof Date); // 输出 true
console.log(regex instanceof RegExp); // 输出 true
console.log(map instanceof Map); // 输出 true
console.log(set instanceof Set); // 输出 true
console.log(weakMap instanceof WeakMap); // 输出 true
console.log(weakSet instanceof WeakSet); // 输出 true
使用 Object.prototype.toString.call()
Object.prototype.toString.call() 方法可以更准确地检测数据类型,包括 null 和 undefined。
const str = "Hello";
const num = 10;
const bool = true;
let und;
const sym = Symbol("description");
const big = 123456789012345678901234567890n;
const nullable = null;
console.log(Object.prototype.toString.call(str)); // 输出 "[object String]"
console.log(Object.prototype.toString.call(num)); // 输出 "[object Number]"
console.log(Object.prototype.toString.call(bool)); // 输出 "[object Boolean]"
console.log(Object.prototype.toString.call(und)); // 输出 "[object Undefined]"
console.log(Object.prototype.toString.call(sym)); // 输出 "[object Symbol]"
console.log(Object.prototype.toString.call(big)); // 输出 "[object BigInt]"
console.log(Object.prototype.toString.call(nullable)); // 输出 "[object Null]"
获取变量数据类型的方法如下:
使用
typeof运算符可以快速判断基本数据类型和函数类型。使用
instanceof运算符可以检测引用数据类型的实例。使用
Object.prototype.toString.call()方法可以更准确地检测所有数据类型,包括null和undefined。
数据类型转换:
隐式转换(类型 coercion)自动转换
-
JavaScript 会在某些操作中自动将一个数据类型转换为另一个数据类型。例如,将数字与字符串拼接时,数字会被转换为字符串。
+ 运算符
-
字符串拼接:当
+运算符的一个操作数是字符串时,另一个操作数会被隐式转换为字符串,然后进行拼接。
const num = 10;
const str = "20";
console.log(num + str); // 输出 "1020"(数字 10 被转换为字符串)
数值相加:当两个操作数都是数字时,+ 运算符会进行数值相加。
const num1 = 10;
const num2 = 20;
console.log(num1 + num2); // 输出 30
其他运算符(-、*、/)
- 当使用
-、*、/运算符时,操作数会被隐式转换为数字,然后再进行相应的数值运算。
const strNum1 = "10";
const strNum2 = "20";
console.log(strNum1 - strNum2); // 输出 -10(字符串被转换为数字)
console.log(strNum1 * strNum2); // 输出 200
console.log(strNum1 / strNum2); // 输出 0.5
布尔值的隐式转换
在条件判断中,JavaScript 会将非布尔值转换为布尔值。以下是会被转换为 false 的值(称为 “假值”):
-
undefined -
null -
0 -
NaN -
""(空字符串) -
false
其他值都会被转换为 true(称为 “真值”)。
注意事项
-
隐式转换可能导致意外行为:由于 JavaScript 的自动类型转换,有时会导致意外的结果。例如,
"0"在条件判断中会被转换为true,因为它是非空字符串,而不是数字0。
显式转换(类型转换)强制转换
-
可以使用特定的方法进行数据类型转换,如
Number()、String()、Boolean()等。
转换为字符串
-
使用
String()函数可以将任何数据类型转换为字符串。
const num = 10;
const bool = true;
const obj = { name: "John" };
console.log(String(num)); // 输出 "10"
console.log(String(bool)); // 输出 "true"
console.log(String(obj)); // 输出 "[object Object]"
转换为数字
-
使用
Number()函数可以将字符串或其他值转换为数字。
const strNum = "123";
const strNotNum = "abc";
console.log(Number(strNum)); // 输出 123
console.log(Number(strNotNum)); // 输出 NaN(不是数字)
console.log(Number(true)); // 输出 1
console.log(Number(false)); // 输出 0
转换为布尔值
-
使用
Boolean()函数可以将任何值转换为布尔值。
console.log(Boolean(0)); // 输出 false
console.log(Boolean("Hello")); // 输出 true
console.log(Boolean("")); // 输出 false
console.log(Boolean(null)); // 输出 false
console.log(Boolean({})); // 输出 true(空对象被视为 true)
JavaScript的前篇基础就先到这里啦!









![[项目深挖]仿muduo库的并发服务器的解析与优化方案](https://i-blog.csdnimg.cn/direct/1446d3f32e9a471fa920b3e5fd0edd1b.jpeg#pic_center)









