网站
引入
JS 中的大部分数据都是值类型,也叫原始类型。
用户输入的文本、商品价格、是否登录、未赋值的变量,这些都属于值类型。理解值类型是理解 JS 数据的基础。
正文
定义
定义
值类型(原始类型)是 JS 中最基本的数据类型,数据直接保存在栈内存中,赋值时会复制一份独立的值。
值类型的特点
值类型直接保存数据本身,不保存地址。
let a = 10;
let b = a;
a = 20;
console.log(a);
console.log(b);输出结果:
20
10b 拿到的是 a 当时的值的副本,后面 a 怎么改都不影响 b。
7 种值类型
JS 共有 7 种值类型:
| 类型 | 关键字 | 说明 | 示例 |
|---|---|---|---|
| 字符串 | string | 一段文本 | "hello" |
| 数字 | number | 整数或小数 | 100、3.14 |
| 布尔值 | boolean | 真或假 | true、false |
| 空值 | null | 主动表示空 | null |
| 未定义 | undefined | 还没有值 | undefined |
| Symbol | symbol | 唯一标识 | Symbol() |
| 大整数 | bigint | 超大整数 | 123n |
字符串
字符串用于保存文本。
let name = "Tom";
let message = "你好";使用 typeof 查看:
console.log(typeof name);输出结果:
"string"详细内容见 JS 字符串。
数字
JS 只有一种数字类型,整数和小数都是 number。
let age = 18;
let price = 9.9;console.log(typeof age);
console.log(typeof price);输出结果:
"number"
"number"详细内容见 JS 数字。
布尔值
布尔值只有 true 和 false 两个值。
let isLogin = true;
let hasStock = false;console.log(typeof isLogin);输出结果:
"boolean"详细内容见 JS 布尔值。
Null
null 表示一个变量被主动设置为空。
let selectedUser = null;console.log(typeof selectedUser);输出结果:
"object"这是 JS 的一个已知 bug,null 并不是对象。
详细内容见 JS Null 和 Undefined。
Undefined
undefined 表示变量已声明但还没有赋值。
let result;
console.log(result);
console.log(typeof result);输出结果:
undefined
"undefined"详细内容见 JS Null 和 Undefined。
Symbol
Symbol() 每次调用都会创建一个唯一的值。
let id1 = Symbol("id");
let id2 = Symbol("id");
console.log(id1 === id2);输出结果:
false即使描述一样,两个 Symbol 也不相等。
详细内容见 JS Symbol。
BigInt
BigInt 用于表示超出 number 范围的大整数。
let big = 9007199254740991n;
let another = BigInt("12345678901234567890");console.log(typeof big);输出结果:
"bigint"BigInt 不能和 number 直接混合运算。
console.log(1n + 2);这种写法会报错,需要先转换类型。
值类型的赋值行为
值类型赋值时,是把值复制一份给新变量。
let x = 100;
let y = x;
y = 200;
console.log(x);
console.log(y);输出结果:
100
200两个变量各自独立,修改互不影响。
值类型在栈内存中
值类型的数据直接保存在栈内存中。
let a = 10;
let b = 20;
let c = "hello";变量名和数据直接对应:
| 变量 | 值 |
|---|---|
a | 10 |
b | 20 |
c | "hello" |
这也是值类型赋值会复制的原因,因为数据就在变量自己的位置上。
值类型不可变
值类型的数据本身不能被修改,只能整体替换。
let text = "hello";
text[0] = "H";
console.log(text);输出结果:
"hello"字符串的单个字符不能通过下标修改,想要改变只能赋一个新字符串。
let text = "hello";
text = "Hello";
console.log(text);输出结果:
"Hello"用 typeof 检查值类型
typeof 对值类型大多能正确识别:
console.log(typeof "hello");
console.log(typeof 100);
console.log(typeof true);
console.log(typeof undefined);
console.log(typeof Symbol());
console.log(typeof 123n);
console.log(typeof null);输出结果:
"string"
"number"
"boolean"
"undefined"
"symbol"
"bigint"
"object"唯一例外是 null,typeof null 返回 "object",需要用 === null 来判断。
let value = null;
console.log(value === null);输出结果:
true例子
不同类型赋值互不影响
let name = "Tom";
let copyName = name;
name = "Jerry";
console.log(copyName);输出结果:
"Tom"函数传参是传值
let count = 10;
function change(n) {
n = 20;
}
change(count);
console.log(count);输出结果:
10值类型传给函数时,传的是值的副本,函数内修改不影响外部变量。
特点
- 值类型也叫原始类型,共 7 种
- 数据直接保存在栈内存中
- 赋值时复制值,修改互不影响
- 值类型的数据本身不可变,只能整体替换
typeof能正确识别大部分值类型typeof null返回"object"是已知 bug- 函数传参时,值类型传的是副本
理解
可以把值类型理解为便利贴上的字。你写了一张”10”贴在自己本子上,别人也抄了一张”10”贴在自己本子上。后面你把自己的改成”20”,别人那张还是”10”。
每种值类型都有自己的用途:字符串存文本,数字存数量,布尔值存状态,null 和 undefined 表示”没有值”,Symbol 生成唯一标识,BigInt 存超大整数。
日常开发中用得最多的是字符串、数字、布尔值这三种,null、undefined、Symbol 和 BigInt 会在特定场景出现。
引出
理解了值类型后,可以继续学习每种值类型的详细内容:JS 字符串、JS 数字、JS 布尔值、JS Null 和 Undefined、JS Symbol。
也可以对比学习 JS 引用类型,理解赋值和传参时的不同行为。