JS 数据类型
JavaScript 数据类型
-
基本数据类型(原始类型,Primitive)
Number:数值(包括整数和浮点数、NaN、Infinity)。String:字符串。Boolean:布尔值(true/false)。Undefined:声明但未赋值的变量。Null:空值。Symbol(ES 6):表示唯一的值。BigInt(ES 11):表示任意精度的整数。
-
引用数据类型(Reference)
Object:对象。Array:数组。Function:函数。Date、RegExp、Map、Set等。
note
JS 的数值类型不像 C 语言那样区分 int、long、float,更简单。
类型检查
-
使用
typeof👉 普通类型jstypeof 123; // "number"
typeof "hi"; // "string"
typeof null; // "object" (历史遗留问题)
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 123n; // "bigint" -
使用
instanceof👉 对象js[] instanceof Array; // true
{} instanceof Object; // true -
使用
Array.isArray()👉 数组jsArray.isArray([]); // true
类型转换
-
显式转换
-
转换为数值:
jsNumber("123"); // 123
parseInt("123px"); // 123
parseFloat("3.14"); // 3.14 -
转换为字符串:
jsString(123); // "123"
(123).toString(); // "123" -
转换为布尔值:
jsBoolean(0); // false
Boolean(""); // false
Boolean(null); // false
Boolean("hi"); // true
-
-
隐式转换
-
在运算或比较时自动发生:
js"5" + 1; // "51" (字符串拼接)
"5" - 1; // 4 (字符串转数值)
1 == "1"; // true (非严格相等会类型转换)
1 === "1"; // false (严格相等不做转换)
-
理解值拷贝与引用拷贝
值拷贝
对数据拷贝
javascript
// 值拷贝
let appleA = "🍎"; // 给变量 A 分配一块内存并赋值
let appleB = appleA; // 给变量 B 分配一块内存并赋值(从变量 A 的内存拷贝而来)
appleA = "🍏"; // 修改变量 A 的值
console.log(appleA, appleB);
// 🍏 🍎
// 修改变量 A 不会影响变量 B,因为两块内存互不影响。
引用拷贝
让变量指向同一块内存地址。
javascript
// 引用拷贝:两个变量使用同一块内存
let boxA = { fruit: "🍎" }; // 给对象 A 分配一块内存并赋值
let boxB = boxA; // 给对象 B 分配同一块内存。此时对象 A、B 互为别名。
boxA.fruit = "🍌"; // 修改对象 A 的值
console.log(boxA, boxB);
// { fruit: '🍌' } { fruit: '🍌' }
// 记住,引用拷贝,不过是同一块内存的不同名字罢了。
异步
回调
js
function printTime() {
console.log(new Date().toLocaleTimeString());
}
printTime();
setTimeout(printTime, 1000); //延时一秒后执行printTime函数
执行输出
bash
17:51:26
17:51:27
等效 C 语言
c
#include <stdio.h>
#include <time.h>
#include <unistd.h> // sleep
void printTime() {
time_t now = time(NULL);
struct tm *local = localtime(&now);
printf("%02d:%02d:%02d\n",
local->tm_hour,
local->tm_min,
local->tm_sec);
}
int main() {
printTime(); //
sleep(1); // 延时 1 秒
printTime(); //
return 0;
}
Promise 与 async/await
异步操作
在 JavaScript 中,异步操作随处可见,比如请求网络数据、读取文件、定时器等。如果用回调函数处理,代码会嵌套得很深,不好维护。为了解决这个问题,JavaScript 引入了 Promise 。而 async/await 则是 Promise 的语法糖。
Promise 是一个“承诺”,代表某个异步操作最终的结果。它有三种状态:
- Pending:初始状态,既不是成功,也不是失败状态
- Fulfilled(成功完成)
- Rejected(失败)
使用场景:电商系统
js
// 定义一个电商系统类
class ECommerce {
constructor(userId) {
this.userId = userId;
}
// 获取用户信息
getUser() {
return new Promise(resolve => {
setTimeout(() => resolve({ id: this.userId, name: "Alice" }), 500);
});
}
// 下订单
placeOrder(user) {
return new Promise(resolve => {
setTimeout(() => resolve({ orderId: 101, user, item: "Laptop" }), 500);
});
}
// 支付订单
payOrder(order) {
return new Promise(resolve => {
setTimeout(() => resolve({ ...order, paid: true }), 500);
});
}
// 发货
shipOrder(order) {
return new Promise(resolve => {
setTimeout(() => resolve({ ...order, shipped: true }), 500);
});
}
}
Promise 链式写法
js
let app = new ECommerce(1);
app.getUser()
.then(user => {
console.log("用户信息:", user);
return app.placeOrder(user); // 下单
})
.then(order => {
console.log("订单信息:", order);
return app.payOrder(order); // 支付
})
.then(paidOrder => {
console.log("支付完成:", paidOrder);
return app.shipOrder(paidOrder); // 发货
})
.then(finalOrder => {
console.log("发货完成:", finalOrder);
})
.catch(err => console.error("流程出错:", err));
async/await 写法
js
async function runBusiness() {
try {
let app = new ECommerce(1);
let user = await app.getUser();
console.log("用户信息:", user);
let order = await app.placeOrder(user);
console.log("订单信息:", order);
let paidOrder = await app.payOrder(order);
console.log("支付完成:", paidOrder);
let finalOrder = await app.shipOrder(paidOrder);
console.log("发货完成:", finalOrder);
} catch (err) {
console.error("流程出错:", err);
}
}
runBusiness();