JavaScript基础知识 - 详解
目录
1.变量
定义:用来存储数据的容器,本质上是程序在内存中申请一块用来存放数据的空间
1.1 const
在JavaScript中,使用const(ES6+)来定义常量,使用const定义的常量有以下特点:
(1)块级作用域:只在声明的代码块‘{}’内有效。
(2)不允许重复声明:使用const声明常量在一个代码块中只允许声明一次。
(3)声明时必须初始化:声明 const 变量的同时必须赋值,否则会报错。
(4)不允许重新赋值:一旦声明,就不能再指向其他的值。
(5)不存在变量提升:存在"暂时性死区"
总结:通过const的特点我们可以大致总结出结论,也就是在Javascript中使用const来声明常量,该常量只在当前代码块中有效,外部不能访问并且在声明过程中必须初始化,它的值一旦确认便不能修改。
1.2 var
在JavaScript中,使用var(ES5)来定义变量,使用var定义的常量有以下特点:
(1)函数作用域:他只在函数内部有效,在全局中,他不认识if、for等代码块,所以在这些代码块里面使用var定义这些变量会导致在该代码块外面也能访问。
(2)变量提升:无论 var 声明写在函数或作用域的哪一行,它都会被“提升”到作用域的顶部。但只有声明被提升,赋值不会被提升。
(3) 允许重复声明:在同一个作用域内,你可以用 var多次声明同一个变量,后面的声明会覆盖前面的
总结:通过var的特点可以总结出,var声明的变量具有函数作用域,不受代码块(如if、for)限制,因此在这些代码块外也能访问;声明会被变量提升到作用域顶部,但赋值不会;在同一作用域内可以重复声明同名变量,后声明的会覆盖前面的值。由于这些特性,var可能导致变量污染和意外覆盖,现代开发中一般建议避免使用var。
1.3 let
let是ES6+的属性,是为了解决var产生的一些问题诞生的,在现代js开发声明变量一般使用let,let有以下特点:
(1)块级作用域:只在声明的代码块 {} 内有效。
(2)不存在变量提升:let 声明的变量不会被提升。从代码块开始到 let 声明语句之前的这个区域,被称为“暂时性死区”(Temporal Dead Zone, TDZ)。在这个区域内访问变量会直接报错。
(3)不允许重复声明:在同一个作用域内,不允许用 let 重复声明一个已经存在的变量(无论是 var、let 还是 const 声明的)。
总结:通过let的特点可以总结出,let声明的变量具有块级作用域,只在当前代码块内有效;不存在变量提升,存在暂时性死区,访问声明之前会报错;同一作用域内不允许重复声明同名变量(无论是var、let还是const)。因此,let弥补了var作用域和提升带来的缺陷,是现代JavaScript中推荐使用的变量声明方式。
2.输入与输出
2.1 输入
(1)prompt
用于弹出一个对话框,提示用户输入内容,返回用户输入的字符串。例如:
let name = prompt("请输入你的名字:");
2.2 输出
(1)console.log()
用于在浏览器的控制台输出信息,常用于调试。
console.log("Hello, world!");
(2)alter
弹出一个警告框,显示一段消息,用户点击确定后关闭。
alert("这是一个提示框");
3.数据类型
3.1 基本数据类型
(1)Number
表示数字,包括整数和浮点数。
例如:let num = 123;
(2)String
表示字符串,用单引号或双引号括起来的文本。
例如:let str = "Hello";
(3)Boolean
表示布尔值,只有两个值:true 和 false。
例如:let flag = true;
(4)Undefined
表示变量声明了但未赋值时的默认值。
例如:let a; console.log(a); // 输出 undefined
(5)Null
表示“无值”,常用于表示变量为空。
例如:let b = null;
(6)Symbol(ES6新增)
表示唯一的标识符。
例如:let sym = Symbol("id");
(7)BigInt(ES2020新增)
用于表示大整数。
例如:let big = 123456789012345678901234567890n;
3.2 复杂数据类型
(1)Object
复杂数据类型的基础,包含键值对。
例如:
let obj = {name: "Alice", age: 25};
(2)Array
有序列表,实际上是特殊的对象。
例如:
let arr = [1, 2, 3, 4];
(3)Function
函数也是对象,可以被调用执行。
例如:
function greet() { console.log("Hello"); }
4.流程控制
4.1 条件控制
(1)if 语句
根据条件执行代码块。
if (condition) {
// 条件为真时执行
} else if (otherCondition) {
// 其他条件为真时执行
} else {
// 条件都不满足时执行
}
(2)switch语句
多分支选择结构。
switch (expression) {
case value1:
// 代码块
break;
case value2:
// 代码块
break;
default:
// 默认代码块
}
4.2 循环控制
4.2.1 for 循环
(1)普通for 循环
语法:
for (初始化表达式; 条件表达式; 迭代表达式) {
// 循环体
}
说明:
- 初始化表达式:通常用来定义循环变量,如
let i = 0。 - 条件表达式:每次循环开始前判断,条件为
true执行循环体,否则退出循环。 - 迭代表达式:每次循环结束后执行,通常用于更新循环变量(如
i++)。
示例:
for (let i = 0; i < 5; i++) {
console.log(i);
}
适用场景:
- 需要精确控制循环次数。
- 需要使用索引访问数组元素。
(2)for...in 循环
语法:
for (let key in object) {
// 循环体
}
说明:
- 用于遍历对象的可枚举属性(包括继承的属性)。
key是属性名(字符串类型)。- 不适合用来遍历数组,因为遍历顺序不保证且会遍历继承属性。
示例:
const obj = {a: 1, b: 2, c: 3};
for (let key in obj) {
console.log(key, obj[key]);
}
// 输出:
// a 1
// b 2
// c 3
注意事项:
(3)for...of 循环
语法:
for (let item of iterable) {
// 循环体
}
说明:
- 用于遍历可迭代对象(如数组、字符串、Map、Set等)。
item是当前遍历的元素值。- 不能直接用于普通对象(因为对象不是可迭代的)。
示例:
const arr = ['a', 'b', 'c'];
for (let value of arr) {
console.log(value);
}
// 输出:a b c
适用场景:
- 遍历数组、字符串、Map、Set 等。
- 代码简洁,避免索引操作。
4.2.2 while 循环
条件为真时重复执行代码块。
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
4.2.3 do...while 循环
先执行一次代码块,再判断条件是否继续循环。
let i = 0;
do {
console.log(i);
i++;
} while (i < 5);
5.概念解释
5.1 变量提升
变量提升是指JavaScript在代码执行前,会先将所有变量声明(var声明的变量)“提升”到当前作用域的顶部,但只有声明被提升,赋值不会提升。这意味着你可以在声明之前访问变量,结果是undefined,而不是报错。
示例:
console.log(a); // 输出 undefined
var a = 10;
等价于:var a;
console.log(a); // undefined
a = 10;
5.2 暂时性死区
暂时性死区是指在使用let或const声明变量的块级作用域内,从块的开始到变量声明之前的这段区域,变量处于“不可访问”的状态。如果在这段时间内访问变量,会导致运行时错误(ReferenceError)。
示例:
这说明变量b虽然在块内,但在声明之前是不可用的,这段时间就是暂时性死区。
console.log(b); // 报错 ReferenceError
let b = 20;
5.3 块级作用域
块级作用域是指变量只在一对大括号{}包围的代码块内部有效。let和const声明的变量具有块级作用域。
示例:
{
let x = 5;
console.log(x); // 5
}
console.log(x); // 报错 ReferenceError,x在块外不可访问
5.4 函数作用域
函数作用域是指用var声明的变量在整个函数内部有效,函数外部不可访问。不同于块级作用域,var声明的变量不受代码块(如if、for)限制,只受函数作用域限制。
示例:
function foo() {
if (true) {
var y = 10;
}
console.log(y); // 10,y在整个函数内有效
}
foo();
console.log(y); // 报错 ReferenceError,y在函数外不可访问

浙公网安备 33010602011771号