编程基础-数据类型 发表于 2026-01-21 更新于 2026-01-21
长沙
数据类型概述 数据类型是编程语言中的基本概念,它定义了数据的性质、存储方式和可以进行的操作。选择正确的数据类型可以提高代码的可读性、性能和可靠性。
为什么需要数据类型
内存管理 :不同类型占用的内存空间不同
数据验证 :防止无效数据的输入和处理
代码优化 :编译器/解释器可以根据类型进行优化
代码安全 :避免类型相关的运行时错误
类型系统分类 静态类型 vs 动态类型
特性
静态类型
动态类型
类型检查时机
编译时
运行时
示例语言
Java, C++, TypeScript
JavaScript, Python, Ruby
优点
类型安全,性能好,IDE支持强
开发速度快,灵活性强
缺点
开发较繁琐,学习曲线陡
运行时错误,难以调试
强类型 vs 弱类型
特性
强类型
弱类型
类型转换
严格限制,需要显式转换
允许隐式转换
示例语言
Python, Java
JavaScript, PHP
安全性
高
低,容易产生意外错误
基本数据类型 1. 数值类型 整型 (Integer) 表示整数,如 1, 42, -10
1 2 3 let age = 25 ;let count = -5 ;let bigNumber = 9007199254740991 ;
注意事项:
不同语言整型范围不同(8位、16位、32位、64位)
注意整数溢出问题
浮点型 (Float) 表示小数,如 3.14, -0.5
1 2 let pi = 3.14159 ;let temperature = -15.5 ;
浮点数精度问题:
1 2 3 4 5 6 7 8 console .log (0.1 + 0.2 ); console .log (0.1 + 0.2 === 0.3 ); function equal (a, b, epsilon = 0.00001 ) { return Math .abs (a - b) < epsilon; } console .log (equal (0.1 + 0.2 , 0.3 ));
BigInt(大整数) 用于表示超出安全整数范围的大数
1 2 let hugeNumber = 9007199254740992n ;let result = hugeNumber + 1n ;
2. 字符串类型 (String) 用于表示文本数据,用引号包裹:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 let name = "知识库" ;let message = "Hello \"World\"" ; let greeting = 'Hello World' ;let template = `Hello ${name} , today is ${new Date ().toLocaleDateString()} ` ;let multiLine = ` 第一行 第二行 第三行 ` ;
常用字符串方法:
1 2 3 4 5 6 7 8 9 let str = "Hello World" ;console .log (str.length ); console .log (str.toUpperCase ()); console .log (str.toLowerCase ()); console .log (str.substring (0 , 5 )); console .log (str.split (" " )); console .log (str.includes ("World" )); console .log (str.replace ("World" , "JavaScript" ));
3. 布尔类型 (Boolean) 只有两个值:true 和 false
1 2 3 4 5 6 7 8 9 10 11 12 let isTrue = true ;let isFalse = false ;console .log (Boolean (0 )); console .log (Boolean (1 )); console .log (Boolean ("" )); console .log (Boolean ("text" )); console .log (Boolean (null )); console .log (Boolean (undefined )); console .log (Boolean ({})); console .log (Boolean ([]));
4. 空值类型 null 表示”无值”或”空值”,是显式设置的空值
1 2 3 4 let empty = null ;console .log (typeof null ); console .log (null === undefined ); console .log (null == undefined );
undefined 表示变量已声明但未赋值
1 2 3 4 5 6 let notAssigned;console .log (notAssigned); console .log (typeof undefined ); function noReturn ( ) {}console .log (noReturn ());
null vs undefined 的区别:
1 2 3 4 5 6 let data = null ;let undefinedVar;console .log (Object .nonExistent );
5. Symbol(符号,ES6新增) 表示唯一的、不可变的数据类型,常用于对象属性键
1 2 3 4 5 6 7 8 9 const id1 = Symbol ("id" );const id2 = Symbol ("id" );console .log (id1 === id2); const obj = { [id1]: "value1" , [id2]: "value2" };
复合数据类型 1. 数组 (Array) 有序的数据集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 let fruits = ["apple" , "banana" , "orange" ];let numbers = [1 , 2 , 3 , 4 , 5 ];let mixed = [1 , "text" , true , null ];console .log (fruits.length ); console .log (fruits[0 ]); console .log (fruits.push ("grape" )); console .log (fruits.pop ()); console .log (fruits.shift ()); console .log (fruits.unshift ("pear" )); fruits.forEach ((fruit, index ) => { console .log (`${index} : ${fruit} ` ); }); console .log (fruits.map (f => f.toUpperCase ())); console .log (fruits.filter (f => f.length > 5 )); console .log (fruits.reduce ((acc, curr ) => acc + curr, "" ));
2. 对象 (Object) 键值对的无序集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 let person = { name : "张三" , age : 25 , city : "北京" , greet : function ( ) { console .log (`你好,我是${this .name} ` ); } }; console .log (person.name ); console .log (person["age" ]); let key = "city" ;console .log (person[key]); person.email = "zhangsan@example.com" ; person.age = 26 ; delete person.email ;console .log (Object .keys (person)); console .log (Object .values (person)); console .log (Object .entries (person)); const { name, age } = person;
3. 函数 (Function) 函数也是一种数据类型,可以赋值给变量、作为参数传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function add (a, b ) { return a + b; } const multiply = function (a, b ) { return a * b; }; const divide = (a, b ) => a / b;function operate (a, b, operation ) { return operation (a, b); } console .log (operate (5 , 3 , add)); console .log (operate (6 , 2 , multiply));
数据类型转换 隐式转换 JavaScript在某些操作中会自动进行类型转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 let num = "5" ;let result = num * 2 ; let addResult = num + 2 ; console .log (1 == true ); console .log (0 == false ); console .log ("" == false ); console .log ("5" == 5 ); console .log ("10" > 5 ); console .log ("abc" > 5 );
隐式转换的危险:
1 2 3 4 5 6 7 8 9 let value = "0" ;if (value) { console .log ("值为真" ); } if (value == false ) { console .log ("等于false" ); }
显式转换 使用专门的函数进行类型转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let num = 123 ;let str1 = String (num); let str2 = num.toString (); let str3 = "" + num; let str4 = `${num} ` ; let text = "456" ;let num1 = Number (text); let num2 = parseInt (text); let num3 = parseFloat ("3.14" ); let num4 = +text; let bool1 = Boolean (1 ); let bool2 = !!1 ;
转换失败处理:
1 2 3 4 5 6 7 8 9 console .log (Number ("hello" )); console .log (parseInt ("hello" )); console .log (Number ("" )); console .log (Number (null )); console .log (Number (undefined )); console .log (isNaN (NaN )); console .log (Number .isNaN (NaN ));
类型检查 typeof 运算符 1 2 3 4 5 6 7 8 9 console .log (typeof 42 ); console .log (typeof "hello" ); console .log (typeof true ); console .log (typeof undefined ); console .log (typeof null ); console .log (typeof {}); console .log (typeof []); console .log (typeof function ( ){}); console .log (typeof Symbol ());
instanceof 运算符 检查对象是否是某个类的实例
1 2 3 4 5 6 7 let arr = [1 , 2 , 3 ];let obj = { name : "test" };console .log (arr instanceof Array ); console .log (arr instanceof Object ); console .log (obj instanceof Object ); console .log (obj instanceof Array );
准确的类型检查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const isArray = Array .isArray ([1 , 2 , 3 ]); const isNull = value => value === null ;const isUndefined = value => value === undefined ;function getType (value ) { if (value === null ) return 'null' ; if (Array .isArray (value)) return 'array' ; return typeof value; } console .log (getType (null )); console .log (getType ([])); console .log (getType ({})); console .log (getType (42 ));
常见错误和解决方案 1. 类型混淆错误 问题:
解决方案:
1 2 3 let result = Number ("10" ) + 5 ; let result = parseInt ("10" ) + 5 ;
2. NaN 的处理 问题:
1 2 let result = "hello" * 5 ; console .log (result === NaN );
解决方案:
1 2 3 4 5 6 7 8 9 let result = "hello" * 5 ;if (isNaN (result)) { console .log ("计算结果无效" ); } if (Number .isNaN (result)) { console .log ("结果确实是 NaN" ); }
3. 空值检查 问题:
1 2 let data;console .log (data.length );
解决方案:
1 2 3 4 5 6 7 8 console .log (data?.length ); let length = data?.length ?? 0 ;let length = data ? data.length : 0 ;
4. 数组 vs 对象混淆 问题:
1 2 let list = {};list.push ("item" );
解决方案:
1 2 3 4 5 6 7 let list = [];list.push ("item" ); if (Array .isArray (list)) { list.push ("item" ); }
性能优化建议 1. 避免频繁的类型转换 1 2 3 4 5 6 7 8 9 10 for (let i = 0 ; i < 1000000 ; i++) { result = Number ("123" ) * i; } const num = Number ("123" );for (let i = 0 ; i < 1000000 ; i++) { result = num * i; }
2. 使用适当的数据类型 1 2 3 4 5 6 7 8 9 let parts = ["Hello" , "World" , "from" , "JavaScript" ];let result = parts.join (" " );let sum = 0 ;for (let num of numbers) { sum += num; }
3. 类型缓存 1 2 3 4 5 6 7 8 9 10 11 function processValue (value ) { const isString = typeof value === 'string' ; const isNumber = typeof value === 'number' ; if (isString) { } else if (isNumber) { } }
跨语言数据类型对比
数据类型
JavaScript
Python
Java
C++
整型
Number
int
int, long, short
int, long, long long
浮点型
Number
float
float, double
float, double
字符串
String
str
String
std::string
布尔型
Boolean
bool
boolean
bool
数组
Array
list, tuple
Array
std::vector, std::array
对象/字典
Object
dict
HashMap
std::map
空值
null, undefined
None
null
nullptr
无类型
-
Any
Object
void*
最佳实践 1. 类型一致性 1 2 3 4 5 6 7 8 9 10 function calculateSum (numbers ) { let sum = 0 ; for (let num of numbers) { if (typeof num === 'number' ) { sum += num; } } return sum; }
2. 类型检查和验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function processUserData (data ) { if (typeof data !== 'object' || data === null ) { throw new Error ('数据必须是对象' ); } if (!data.name || typeof data.name !== 'string' ) { throw new Error ('name 必须是非空字符串' ); } if (typeof data.age !== 'number' || data.age < 0 ) { throw new Error ('age 必须是非负数' ); } }
3. 使用 TypeScript 提供类型安全 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 interface User { name : string ; age : number ; email ?: string ; } function greetUser (user : User ): string { return `你好,${user.name} ,今年${user.age} 岁` ; } const user : User = { name : "张三" , age : 25 };
4. 防御性编程 1 2 3 4 5 6 7 8 9 function getUserName (user ) { return user?.profile ?.name ?? "匿名用户" ; } function processList (list = [] ) { return list.filter (item => item.isValid ); }
5. 代码文档 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function calculateAverage (numbers ) { if (!Array .isArray (numbers)) { throw new Error ('输入必须是数组' ); } if (numbers.length === 0 ) { return 0 ; } const sum = numbers.reduce ((acc, num ) => { if (typeof num !== 'number' || isNaN (num)) { throw new Error ('数组必须只包含有效数字' ); } return acc + num; }, 0 ); return sum / numbers.length ; }
进阶话题 1. 类型推断 现代编程语言可以自动推断变量类型
1 2 3 4 5 6 7 let x = 10 ; let y = "hello" ; let inferred = 42 ; const constant = "text" ;
2. 泛型(TypeScript) 1 2 3 4 5 6 7 8 9 function identity<T>(arg : T): T { return arg; } const num = identity<number >(42 ); const str = identity<string >("hello" ); const bool = identity (true );
3. 联合类型 1 2 3 4 5 6 7 8 9 type ID = string | number ;function printID (id : ID ) { console .log (`ID: ${id} ` ); } printID (123 ); printID ("abc-123" );
4. 类型守卫 1 2 3 4 5 6 7 8 9 function processValue (value : string | number ) { if (typeof value === 'string' ) { console .log (value.toUpperCase ()); } else { console .log (value.toFixed (2 )); } }