网站

JavaScript 数据类型 - W3School

JavaScript 数据类型和数据结构 | MDN

引入

JS 中的大部分数据都是值类型,也叫原始类型。

用户输入的文本、商品价格、是否登录、未赋值的变量,这些都属于值类型。理解值类型是理解 JS 数据的基础。

正文

定义

定义

值类型(原始类型)是 JS 中最基本的数据类型,数据直接保存在栈内存中,赋值时会复制一份独立的值。

值类型的特点

值类型直接保存数据本身,不保存地址。

let a = 10;
let b = a;
 
a = 20;
 
console.log(a);
console.log(b);

输出结果:

20
10

b 拿到的是 a 当时的值的副本,后面 a 怎么改都不影响 b

7 种值类型

JS 共有 7 种值类型:

类型关键字说明示例
字符串string一段文本"hello"
数字number整数或小数1003.14
布尔值boolean真或假truefalse
空值null主动表示空null
未定义undefined还没有值undefined
Symbolsymbol唯一标识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 数字

布尔值

布尔值只有 truefalse 两个值。

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";

变量名和数据直接对应:

变量
a10
b20
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"

唯一例外是 nulltypeof 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”。

每种值类型都有自己的用途:字符串存文本,数字存数量,布尔值存状态,nullundefined 表示”没有值”,Symbol 生成唯一标识,BigInt 存超大整数。

日常开发中用得最多的是字符串、数字、布尔值这三种,nullundefined、Symbol 和 BigInt 会在特定场景出现。

引出

理解了值类型后,可以继续学习每种值类型的详细内容:JS 字符串JS 数字JS 布尔值JS Null 和 UndefinedJS Symbol

也可以对比学习 JS 引用类型,理解赋值和传参时的不同行为。