大前端几种开发语言对比

项目

概述

语言

特性

备注

基本类型
Basic Operators

整数、浮点数

C++

整数类型宽度不固定,如 int,自动数值类型转换

Java

没有无符号整数,存在装箱Box类型

C#

Swift

基本 tuple 类型

Kotlin

T? 是 Box 的
支持原生类型数组 IntArray 等
无符号整数是 Beta 的,通过内联类实现

Dart

运算符
Basic Operators

赋值、流程、算术、位、逻辑、关系运算符
下标、后缀、前缀运算符
三元条件运算符
运算符优先级、结合律
运算符重载

C++

取址运算符,指针运算符,函数运算符
位运算符优先级顺序 & ^ | 

Java

C#

Swift

赋值运算符没有返回值
相同比较 === 和 !==
范围运算符 ... ..<
默认值运算符 ??
可溢出算术运算符,开头加 &
位移运算符优先级最高,位与 & 优先级较高,其他位运算符同 + - 的优先级
自定义运算符,如:prefix operator +++ 

Kotlin

位运算符通过一些方法实现,比如:xor()

Dart

字符及字符串
Strings and Characters

字符串字面量
字符
Unicode
常用操作

C++

没有指定的字符集
支持多行连接,需要自己增加换行符

Java

C#

Swift

单字符也用 ”“,多行"""
扩展分割#”,#“”“
值类型,支持变量改写
Unicode,不等长,特殊下标类型,支持转 UTF8/16/32

Kotlin

多行"""
支持字符串模板,嵌入任意表达式

Dart

集合类型
Collection Types

数组、字典
索引、排序
集合操作

C++

内置数组是特殊类型,T t[],不同于 std::array<T>
array 固定长度,vector 可变长度
默认红黑树,支持Hash索引

Java

C#

Swift

数组形式:类型 [T],字典形式:类型 [K:V]
Hash索引,没有顺序,sorted() 排序返回数组
支持运算符 + +=
值类型

Kotlin

Array 固定长度,ArrayList 可变长度

Dart

控制流
Control Flow

条件、循环、条件分支
控制跳转

C++

do while
switch 每一项需要 break,否则继续向下执行

Java

C#

Swift

条件部分没有 () 包围,必须有 { }
条件判断支持 optional,api 检查
repeat while
switch case 支持复杂条件,值绑定,where 条件
支持 break label

Kotlin

when 代替 switch
if、when可以作为表达式,代码块的最后一个表达式的值
跳转的标签

Dart

函数
Functions

支持默认参数
支持可变参数
函数自身可以作为变量、参数、返回值
嵌套函数

C++

可变参数使用 va_args 处理

Java

C#

Swift

Argument Label 强制调用者使用参数 label
支持返回tuple ,没有返回值时,实际返回空 tuple
函数体只有单行表达式时,可以省略 return
可变参数需要类型相同,内部作为数组使用
输入/输出参数修饰,增加了拷贝操作
方法返回不透明类型 some T,可以保留跟多信息

Kotlin

支持具名参数传递
没有返回值时,实际返回 Unit
省略return,返回最后一个表达式的值
单表达式函数,可以省略 {},自动推断返回类型
尾递归函数 tailrec
带有接收者的函数 A.f(T) -> U,隐式 this 参数

Dart

闭包
Closures

函数式编程
上下文变量捕捉

C++

lamda 表达式,指定变量捕捉

Java

C#

Swift

自动管理变量捕捉和生命期,内存;闭包是引用类型
参数、返回值类型写在 { } 里面,in 分割参数和代码体
支持自动推导参数、返回值类型
单行表达式时,可以省略return;可以省略参数名称,用 $n 代替
支持 operator 方法
当作为参数时,可以使用后缀形式;惟一参数,可以继续省略 ()
@escaping 闭包

Kotlin

lamda 表达式,参数写在 {} 里面 -> 开始代码体,省略参数 it,不可return
匿名函数 fun,可以指定返回类型
内联函数 inline,在调用处扩展,此时 lambda 可以非局部 return,具化reified 类型参数 T

Dart

枚举
Enumerations

enum
基础类型指定
枚举项目遍历

C++

不支持遍历,可以通过Qt元数据加强

Java

C#

Swift

支持附加值,可以递归附加同类型枚举
raw value,从 raw value 初始化
CaseIterable 使得枚举可以遍历
值类型

Kotlin

枚举类,可以实现接口,可以遍历

Dart

结构和类
Structures and Classes

类型
结构体(值类型)
类型别名

C++

两者没有多大区别,主要体现在访问控制上

Java

C#

Swift

值和引用类型有很大不同
值类型不能继承,多实例不干扰
修改值类型实例,编译器会实施排他性写入(包括tuple等)
类实例有  === 和 !===

Kotlin

数据类 data,主构造器属性,自动生成一些方法,可以解构
密封类 sealed,只能在相同文件中继承
对象表达式 object,对象声明可以实现单例
伴生对象 companion ,实现类型的属性、方法
内联类 inline ,j基础类型包装类型,性能考虑
委托 by, 实现委托模式

Dart

属性
Properties

实例属性
类型属性

Qt/C++

属性与方法关联, READ WRITE
支持变化通知 NOTIFY
支持动态属性,Qvariant 类型

Java

C#

Swift

Stored属性和Computed属性,没有实例变量
延迟初始化属性
get/set,省略 return,默认参数名称 newValue
属性观察者 willSet didSet
@propertyWrapper wrappedValue projectedValue

Kotlin

后端属性和计算属性,如果引用 field,就是后端属性
延迟初始化 lateinit
属性委托 getValue,setValue,是 operator 方法,比如 lazy
委托给 Map,局部变量委托
类型属性通过“伴生对象”实现

Dart

方法
Methods

实例方法
类型方法

C++

this 指针

Java

C#

Swift

self 属性
值类型需要 mutating 才可以修改属性

Kotlin

中缀表示法 infix

Dart

下标操作
Subscripts

针对类实例使用下标获取子元素,类似数组操作
下标可以是任意类型

C++

支持操作符重载,下标操作符 []

Java

C#

Swift

支持多维下标
subscript 关键字,类似 init
支持类型的下标操作(static)

Kotlin

Dart

继承
Inheritance

override
final

C++

支持跨级调用基类的方法

Java

C#

Swift

调用 super 方法
属性get/set继承,不需要考虑基类属性是stored或者computed
增加属性观察者

Kotlin

需要明确 open/override

Dart

构造
Initialization

属性默认值
自动生成默认构造

C++

自动生成拷贝构造
自动调用父类默认构造

Java

C#

Swift

没有 new 关键字
值类型基于成员初始化形式
Designated Convenience 初始化方法 Two-Phase Initialization
自动继承 Designated 初始化
可能失败的初始化 init?
required 初始化,要求派生类实现
闭包初始化属性

Kotlin

没有 new 关键字
类型有主构造函数,初始化可以引用其中的参数

Dart

析构
Deinitialization

自动生成析构

C++

支持虚析构,可以 delete 基类指针

Java

C#

Swift

没有 delete 关键字,自动引用计数

Kotlin

Dart

可选值链
Optional Chaining

内置的 optional 类型(属性,参数,返回值)
使用 optional 实例的成员(方法、属性)允许链式失败

C++

没有语言内置的 optional 类型

Java

C#

Swift

Kotlin

Dart

异常处理
Error Handling

抛出异常
捕捉异常
永远执行的代码块

C++

任意类型实例都可以作为抛出,但是建议 std::exception 派生类
没有 finally,利用对象析构实现

Java

抛出 Error、Exception 派生类实例
方法强制异常声明 throws,除非 RuntimeError;检查声明的异常类型

C#

Swift

抛出满足 Error 协议的实例
方法强制异常声明 throws
do -catch 需要 try 配合,try! 不处理异常,try? 将异常转为 optional
没有 finally,defer 提前声明清理操作

Kotlin

Dart

类型转换
Type Casting

继承体系的向上、向下转换
运行时类型检查
任意类型

C++

一般没有运行时类型信息,Qt 元数据是一个替代
不建议使用 dynamic cast, 建议 qobject_cast

Java

C#

Swift

有运行时类型信息,转换可能失败 as? as!
支持任意类型 Any,AnyObject

Kotlin

Dart

嵌套类型
Nested Types

类型、方法内定义嵌套类型

C++

Java

支持访问外部类的成员,static 嵌套不支持

C#

Swift

Kotlin

嵌套类 inner,可以访问外部类成员
匿名内部类,使用对象表达式 object 实现

Dart

支持访问外部类的成员

扩展
Extensions

扩展属性,方法,嵌套类型
扩展协议声明
泛型扩展,可附加约束

C++

不支持扩展

Java

接口 default 方法

C#

Swift

可以为空对象 T? 扩展方法
扩展类型的方法、属性( 伴生对象)
在类内部定义扩展,可以 override

Kotlin

Dart

extension

协议(接口)
Protocols

不实现协议的成员(属性,方法)
协议可以多继承
协议可以作为类型使用

C++

没有纯粹的接口,支持用纯虚函数;支持多继承,虚拟继承

Java

C#

Swift

构造函数也可以作为协议要求
协议可以扩展,增加计算属性、方法,以及提供实现默认
基础协议默认实现,协议可以组合作为一个虚拟类型
可选协议支持 @objc

Kotlin

接口 interface ,可以实现方法、计算属性
函数式接口,通过 lambda 实现
函数类型也是接口

Dart

泛型
Generics

泛型函数
泛型类型
参数类型约束 where

C++

不支持 where 约束,模板编译时不检查,实例化时会报错

Java

C#

Swift

协议的附加类型 associatedtype ,可以带约束, where 约束
继承、扩展时可以增加约束

Kotlin

Dart

自动引用计数
Automatic Reference Counting

强引用,弱引用
自动释放计数位0的实例

C++

通过库实现

Java

在语言层面默认强引用,弱引用通过库实现
不会立即释放实例,gc 定期或者有条件释放

C#

Swift

在语言层面默认强引用,支持弱引用
unowned 引用,不影响计数

Kotlin

Dart

访问控制
Access Control

类型访问控制
类型成员的访问控制
包访问控制
文件单元访问

C++

没有包、文件访问控制,protected 权限用于派生类访问基类

Java

没有文件访问控制,protected 权限用于派生类访问基类

C#

Swift

默认 internal 包内可访问
open 访问权限最大,用于类,可以被包外部继承、复写
成员默认 internal 或者与类型相同的更小的权限

Kotlin

没有文件单元的权限
open 只代表可继承,默认不可继承

Dart

反射
Reflect

表示类型的类型
获取类型的成员
通过间接方式访问属性,调用方法

C++

一般不使用运行时类型信息 rtti,使用 Qt 元数据信息

Java

C#

Swift

let metatype : X.Type  = X.self
KeyPath 类似 C++ 的成员指针,但是可以多级
Mirror 反射所有属性

Kotlin

Dart

协程
Coroutines

C++

Java

C#

Swift

Kotlin

Dart

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值