跳到主要内容

JS 数据类型

JavaScript 数据类型

  • 基本数据类型(原始类型,Primitive)

    • Number :数值(包括整数和浮点数、 NaNInfinity )。
    • String :字符串。
    • Boolean :布尔值( true / false )。
    • Undefined :声明但未赋值的变量。
    • Null :空值。
    • Symbol (ES 6):表示唯一的值。
    • BigInt (ES 11):表示任意精度的整数。
  • 引用数据类型(Reference)

    • Object :对象。
    • Array :数组。
    • Function :函数。
    • DateRegExpMapSet 等。
note

JS 的数值类型不像 C 语言那样区分 int、long、float,更简单。


类型检查

  • 使用 typeof 👉 普通类型

    js
    typeof 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() 👉 数组

    js
    Array.isArray([]); // true

类型转换

  • 显式转换

    • 转换为数值:

      js
      Number("123"); // 123
      parseInt("123px"); // 123
      parseFloat("3.14"); // 3.14
    • 转换为字符串:

      js
      String(123); // "123"
      (123).toString(); // "123"
    • 转换为布尔值:

      js
      Boolean(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();