前端的 Python 入门指南(三):数据类型对比 - 彻底的一切皆对象实现和包装对象异同
《前端的 Python 入门指南》系列文章:
- (一):常用语法和关键字对比
- (二):函数的定义、参数、作用域对比
- (三):数据类型对比 - 彻底的一切皆对象实现和包装对象异同
- (四):参数传递方式对比 - 值与引用传递 vs 可变不可变数据
- (五):面向对象特性之继承实现的方式对比 - 基于原型链和基于类各有什么优缺点
- (六):调试方式和技巧对比
- (七):异步场景的实现方案对比 - 内置+显示事件循环 + async+await
JavaScript 和 Python 都是动态类型的编程语言,之前简单介绍了下语法和关键字,以及如何定义函数,虽然可以使用函数式编程(函数也可以作为值),但它们还都有点“一切皆对象”的思想设计。对于熟悉前端开发的程序员来说,理解两者在数据类型上的实现方式和差异,是快速上手 Python 的关键。本篇文章将通过数据类型的对比,帮助你理清 JavaScript 和 Python 的相同点与不同点。
1. 数据类型的分类
JavaScript 的数据类型
JavaScript 的数据类型分为两类:
- 原始类型(Primitive Types):
undefined
,null
,boolean
,number
,bigint
,string
,symbol
- 引用类型(Reference Types):
Object
(包括Array
、Function
、Date
、RegExp
等)
let num = 42; // 原始类型
let obj = { key: "value" };// 引用类型
Python 的数据类型
Python 没有明确的“原始类型”和“引用类型”的区分,因为 所有数据类型都是对象。Python 提供了一组常见的内置数据类型:
- 数字类型:
int
,float
,complex
- 布尔类型:
bool
- 序列类型:
list
,tuple
,range
- 文本类型:
str
- 集合类型:
set
,frozenset
- 映射类型:
dict
- 特殊类型:
NoneType
num = 42 # 数字类型
obj = {"key": "value"} # 字典(映射类型)
主要区别:
- JavaScript 将数据分为“原始类型”和“引用类型”,只有引用类型是对象。
- Python 中 所有类型都是对象,包括整数、布尔值和
None
。
2. 数字类型的实现
JavaScript
JavaScript 的数字类型主要是 number
,它使用 64 位浮点数表示整数和小数。BigInt
提供对任意大小整数的支持。
let intNum = 42; // 整数
let floatNum = 3.14; // 浮点数
let bigIntNum = 123n; // BigInt
Python
Python 的数字类型更加多样化:
- 整数类型(int):支持任意大小的整数。
- 浮点数类型(float):64 位双精度浮点数。
- 复数类型(complex):支持复数计算。
int_num = 42 # 整数
float_num = 3.14 # 浮点数
complex_num = 1 + 2j # 复数
主要区别:
- Python 的整数没有范围限制,而 JavaScript 的
number
类型可能出现精度丢失。console.log(9999999999999999); // 输出 10000000000000000
- JavaScript 的
BigInt
和 Python 的int
都支持大整数,但语法略有不同。let bigInt = 123456789012345678901234567890n; // JavaScript
big_int = 123456789012345678901234567890 # Python
3. 字符串类型
JavaScript
JavaScript 的字符串是不可变的,可以通过双引号、单引号或模板字符串定义。
let str1 = "Hello";
let str2 = 'World';
let str3 = `${str1}, ${str2}!`; // 模板字符串
Python
Python 的字符串同样是不可变的,定义方式包括单引号、双引号和三引号(支持多行)。
str1 = "Hello"
str2 = 'World'
str3 = f"{str1}, {str2}!" # 格式化字符串
主要区别:
- 两者的字符串本质上都不可变,Python 提供了
f"{}"
格式化字符串,与 JavaScript 的模板字符串类似。 - Python 使用三引号支持多行字符串:
multi_line = """This is a multi-line string."""
4. 布尔类型
JavaScript
JavaScript 中的布尔值只有两个:true
和 false
,并且有一组常见的“假值”:
false
,0
,NaN
,""
(空字符串),null
,undefined
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
Python
Python 中的布尔值是 True
和 False
,并且同样有“假值”:
False
,0
,0.0
,""
,[]
,{}
,None
print(bool(0)) # False
print(bool("")) # False
主要区别:
- Python 使用
True
和False
,首字母大写。 - 两者的“假值”定义接近,但 JavaScript 的
null
和undefined
没有直接对应的 Python 类型(它们相当于 Python 的None
)。
5. 列表和数组
JavaScript
JavaScript 的数组是动态的,可以存储任何类型的值。
let arr = [1, "hello", true];
arr.push(4); // 添加元素
console.log(arr); // [1, "hello", true, 4]
Python
Python 使用 list
表示动态数组,也支持存储不同类型的元素。
arr = [1, "hello", True]
arr.append(4) # 添加元素
print(arr) # [1, "hello", True, 4]
主要区别:
- 两者的数组操作非常相似,但 Python 的
list
提供了更多内置方法(如reverse
、sort
)。 - JavaScript 使用
Array
提供动态数组功能,而 Python 的list
是内置类型。
6. 字典和对象
JavaScript
JavaScript 使用对象(Object
)存储键值对,键必须是字符串或符号。
let obj = { key: "value" };
console.log(obj.key); // "value"
Python
Python 使用 dict
存储键值对,键可以是任意不可变类型(如字符串、数字、元组)。
obj = {"key": "value"}
print(obj["key"]) # "value"
主要区别:
- Python 的字典支持更多类型的键,而 JavaScript 的对象键通常是字符串。
- Python 提供了
collections.defaultdict
等高级功能,而 JavaScript 可以通过Map
提供更灵活的键值存储。
7. 集合
JavaScript
JavaScript 的集合通过 Set
实现,集合中的元素是唯一的。
let set = new Set([1, 2, 2, 3]);
console.log(set); // Set {1, 2, 3}
Python
Python 使用 set
表示集合,同样保证元素唯一性。
set_obj = set([1, 2, 2, 3])
print(set_obj) # {1, 2, 3}
主要区别:
- 两者的集合操作类似,但 Python 提供了更多数学集合操作(如
union
,intersection
)。
8. 特殊值
JavaScript
null
:表示空值。undefined
:表示未定义的值。
Python
None
:表示空值。- Python 没有
undefined
,未定义变量会抛出NameError
。
let x = null; // 空值
let y; // undefined
x = None # 空值
9. 总结
特性 | JavaScript | Python |
---|---|---|
数字类型 | number , BigInt | int , float , complex |
字符串 | 不可变,支持模板字符串 | 不可变,支持格式化字符串 |
布尔类型 | true , false | True , False |
数组/列表 | Array ,动态类型 | list ,动态类型 |
字典/对象 | Object ,键为字符串或符号 | dict ,键可为任意不可变类型 |
集合 | Set | set , frozenset |