各编程语言对比总结-Java, JavaScript, Python, C, C++

基础数据类型

Posted by Yuankun Li on 2022-01-08

基础数据类型

类型/语言 JavaScript Java Python C C++
整数类型 number(64位双精度浮点数,统一整数和浮点)1 byte(8位,-128~127)、short(16位)、int(32位)、long(64位) int(动态精度,理论无限大) short(16位)、int(32位)、long(32/64位)、long long(64位) 同 C,新增固定宽度类型(如 int32_tint64_t1,3
浮点数类型 number(64位双精度)1 float(32位)、double(64位) float(64位双精度) float(32位)、double(64位)、long double(80/128位) 同 C,支持 long double(更高精度,80/128位)3,5
字符类型 无独立类型,用 string 表示 char(16位 Unicode) 无独立类型,用长度为1的 str 表示 char(8位,-128~127) char(同 C),新增 wchar_t(宽字符,16/32位)1,3
布尔类型 booleantrue/false boolean(逻辑值,JVM 依赖) Bpytool(继承自 int,True=1,False=0) _Bool(C99+,0/1)4 booltrue/false,1字节)1,2
空值表示 nullundefined 原始类型无空值(引用类型默认 null, null 不能直接赋值给基本类型(如 int、boolean),否则会导致编译错误) None(NoneType 数据类型的唯一值) NULL(空指针宏)2 nullptr(类型安全空指针,C++11+)2,5
大整数支持 BigInt(ES2020+,后缀 n,支持任意精度整数) 无原生支持,需通过 BigInteger 类 原生 int 支持任意精度,无需特殊类型
特殊类型 Symbol(唯一标识符) 指针(*)、联合体(union)、枚举(enum4 引用(&)、类(class)、模板(泛型)2,5
类型转换规则 隐式转换频繁(如 "5" + 2 = "52" 严格类型检查,窄化需显式强制转换 隐式转换仅限数字,其他需显式转换 隐式转换宽松(如 intfloat),强制转换用 (type)4 支持显式转换(static_castreinterpret_cast 等)5
内存管理 自动垃圾回收 自动垃圾回收(对象堆分配) 自动垃圾回收 malloc/free(手动)4 new/delete(面向对象),兼容 C 风格5
类型系统特性 动态弱类型 静态强类型 动态强类型 弱类型(无编译时检查)4 强类型(支持编译时检查,引入 const 和类型转换操作符)1,5

关键差异总结

  1. ​整数与浮点数
  • ​C/C++:明确区分位宽(如 short、long),C++扩展 long long58。
  • ​Java:严格固定位宽(如 int=32位)。
  • ​Python/JS:动态类型,无固定位宽限制。
  1. ​布尔类型
    ​C:依赖C99的 _Bool,本质是整数0/19。
    ​C++:原生 bool,逻辑更清晰6。
    ​Python:bool 是 int 的子类,兼容1/0。

  2. ​空值与指针
    ​C:NULL 是宏定义的 (void*)0,易引发类型问题。
    ​C++:nullptr 类型安全,避免歧义。
    ​Java:原始类型无空值,引用类型默认 null。Java 的 null 是引用类型变量的“无值”状态,需通过判空和规范使用避免 NullPointerException。理解其特性(如类型限制、默认值规则)是编写健壮代码的基础,而与其他语言的对比则体现了 Java 在类型安全上的设计取舍。
    JavaScript 有 null 和 undefined
    Python 用 None

    语言 ​空值表示 ​特性
    ​Java null 仅用于引用类型,强制类型安全,需显式判空。
    ​Python None 类似 null,但所有变量均为对象,无基本类型限制。
    ​C++ NULL 宏定义为 0 或 nullptr(C++11+),用于指针类型。
  3. 类型安全与转换
    ​C/C++:C允许隐式危险转换,C++引入显式转换操作符增强安全性。
    ​Java:编译时严格检查,避免隐式窄化转换。

  4. ​内存管理
    ​C/C++:手动管理(malloc/new),C++支持RAII和智能指针。
    ​其他语言:自动垃圾回收,减少内存泄漏风险。

  5. ​类型系统:
    ​JavaScript:动态弱类型,仅 number 统一表示数字78。
    ​Java:静态强类型,8种原始类型均有固定位数和范围1011。
    ​Python:动态强类型,基本类型为对象,但 int 支持无限精度1213。

  6. ​数值精度:
    JavaScript 和 Python 的浮点数均为64位双精度,但 Java 提供单/双精度选项71012。
    大整数支持:JavaScript 需 BigInt,Java 依赖类库,Python 原生支持81012。

  7. ​字符处理:
    仅 Java 有独立 char 类型,JavaScript 和 Python 用字符串表示字符71012。

  8. ​类型安全:
    Java 最严格(编译时类型检查),JavaScript 和 Python 更灵活但易产生隐式错误。
    此表格综合了三者在设计哲学和应用场景上的差异:JavaScript 强调灵活性,Java 注重性能与类型安全,Python 以简洁和动态性见长。

​补充说明

​C++特有类型:引用(变量别名)、类对象、模板(泛型)、智能指针(如 std::unique_ptr)。
​C语言局限:无原生面向对象支持,需通过结构体和函数指针模拟。
​跨语言对比:C/C++注重底层控制,Java/Python/JS侧重开发效率与安全性。

操作符

操作符类别 JavaScript Java Python C/C++ 异同说明
算术运算符 +, -, *, /, %, ** (ES6) +, -, *, /, %, Math.pow() +, -, *, /, %, ** (幂) +, -, *, /, %, pow() - /:Python和JS中整数除法结果为浮点,Java/C/C++中整数除法取整1,5
- **:Python和JS支持幂运算,C/C++/Java需调用函数10
赋值运算符 =, +=, -=, *=, /= =, +=, -=, *=, /= =, +=, -=, *=, /= =, +=, -=, *=, /= - ++/--:C/C++/Java/JS支持自增自减,Python不支持1,10
比较运算符 ==, ===, !=, !==, >, <, >=, <= ==, !=, >, <, >=, <= ==, !=, >, <, >=, <=, is ==, !=, >, <, >=, <= - ===:JS严格比较值和类型,其他语言无此符8
- is:Python比较对象身份(内存地址)8
逻辑运算符 &&, \|\|, ! &&, \|\|, ! and, or, not &&, \|\|, ! - Python用关键字,其他语言用符号10
位运算符 &, \|, ^, ~, <<, >>, >>> &, \|, ^, ~, <<, >>, >>> &, \|, ^, ~, <<, >> &, \|, ^, ~, <<, >> - >>>:JS/Java无符号右移,Python/C/C++无此操作符6,10
成员/类型检查 in, instanceof instanceof in, isinstance() - in:JS检查对象属性,Python检查可迭代对象成员8,11
- C/C++无内置操作符
其他操作符 typeof, ?. (可选链) instanceof, ?: (三元) ** (幂), // (整除) -> (指针), :: (作用域) - ?.:JS可选链避免空值错误,其他语言无11
- ->:C/C++指针成员访问8

关键差异说明

  1. 类型松散性

    • JavaScript和Python:动态类型,操作符可能隐式转换类型(如"5" + 2在JS中为"52"8,9
    • Java/C/C++:静态类型,操作符两侧需类型严格匹配(如int + String会报错)1,8
  2. 字符串比较

    • JS用==比较值,===比较值和类型;Java用.equals()比较内容,==比较引用1,7
    • Python用==比较值,is比较对象身份(类似Java的==8,9
  3. 运算符重载

    • C++:支持操作符重载(如自定义+行为)2,5
    • Java/JavaScript:不支持操作符重载(除+用于字符串拼接)7,10


show git comment