六维教程

JavaScript 数据类型与 typeof

变量是数据的名字,那 JavaScript 里有哪些数据?数据是有类型的,数字是数字、文字是文字,不同类型有不同行为。这一篇认识 JavaScript 的类型体系,以及如何查看一个数据的类型。

动态类型语言

JavaScript 是动态类型语言,意思是变量本身不绑定类型,可以随时装入不同类型的数据,类型在运行时才确定。

let value = 42;
console.log(value); // 输出 42

value = '现在是字符串';
console.log(value); // 输出 现在是字符串

value = true;
console.log(value); // 输出 true

同一个变量,一会儿是数字、一会儿是字符串、一会儿是布尔值,都能正常工作。这带来灵活性,但也要求开发者心里清楚当前装的是什么。对比静态类型语言,变量声明时就要定死类型,各有利弊。

基本类型

JavaScript 的基本类型包括 number、string、boolean、undefined、null 五种。基本类型也叫原始类型,各自举一个例子

const age = 18;           // number 数字
const name = '小明';      // string 字符串
const isLogin = true;     // boolean 布尔值
let temp;                 // undefined 未定义
const empty = null;       // null 空值
  • number 表示数字,包括整数和小数。
  • string 表示文本,用引号包裹。
  • boolean 只有 true 和 false 两个值,表示真和假。
  • undefined 表示变量声明了但没有赋值,let temp 的默认值就是 undefined。
  • null 表示值为空,通常由开发者主动设置。

引用类型 object

引用类型只有一类,object 对象。对象是键值对的集合,可以包含各种数据。数组和函数本质上也属于对象。

const user = { name: '小明', age: 18 }; // 对象
const list = [1, 2, 3];                // 数组,一种特殊的对象
function sayHi() {}                     // 函数,一种可调用的对象

对象的具体知识后面有专门篇章,现在只需要记住,除了五种基本类型,剩下的都是对象。

undefined 与 null 的区别

两者都表示”没有”,但语境不同。undefined 表示变量声明了但还没有赋值,属于系统的默认状态。null 表示值是空,通常是程序员主动赋的。

let a;            // a 是 undefined,引擎自动给的值
let b = null;     // b 是 null,程序员主动置空

一个常见的做法是用 null 表示”暂无数据”,比如用户没有填写某个字段,赋值 null。区别不需要死记,遇到实际场景自然就理解了。

typeof 运算符

typeof 是一个运算符,作用是返回操作数的类型名称字符串,可以用来检查一个变量装着什么类型的数据。

console.log(typeof 42);        // 输出 number
console.log(typeof 'abc');     // 输出 string
console.log(typeof true);      // 输出 boolean
console.log(typeof undefined); // 输出 undefined
console.log(typeof {});        // 输出 object

typeof 有一个著名的陷阱,typeof null 返回 ‘object’,这是语言诞生时的历史遗留 bug,一直没修,因为修复会破坏已有代码。

console.log(typeof null); // 输出 object,历史遗留 bug,null 其实是基本类型

遇到时知道这是正常现象就好,判断 null 通常直接比较变量和 null,不依赖 typeof。

基本类型与引用类型的根本区别

这是理解 JavaScript 数据模型的关键。可以用栈和堆来比喻,基本类型的数据直接存在栈里,引用类型的数据存在堆里,变量里存的是指向堆的地址。

先看基本类型,变量复制是拷贝一份值,两个变量互不影响

let a = 10;
let b = a;   // b 得到一份 a 的拷贝
b = 20;
console.log(a); // 输出 10,a 没有受影响

再看引用类型,复制变量只是复制地址,两个变量指向同一个对象,改一个另一个也变

const obj1 = { name: '小明' };
const obj2 = obj1;     // 复制的是地址,obj2 和 obj1 指向同一个对象
obj2.name = '小红';
console.log(obj1.name); // 输出 小红,obj1 也变了

把这个例子和基本类型的例子对比,差异一目了然。基本类型是”给了你一份复印件”,引用类型是”给了你同一把钥匙”。这个区别在函数传参、数组复制时会频繁踩坑,务必记牢。

小结

  • JavaScript 是动态类型语言,变量可以随时装不同类型的数据,类型在运行时确定。
  • 基本类型包括 number、string、boolean、undefined、null。
  • 引用类型是 object,数组和函数都是对象。
  • undefined 表示未赋值,null 表示值为空。
  • typeof 返回类型名称字符串,typeof null 返回 ‘object’ 是历史遗留 bug。
  • 基本类型直接存值,复制互不影响,引用类型存地址,复制后两个变量指向同一个对象。
上一篇
JavaScript 变量声明 let 与 const
下一篇
JavaScript 数字与基本运算