1、swift

        用var定义变量,let定义运行时常量
        不存在变量提升,代码顺序执行
import Foundation

let PI = 3.1415926
let APP_NAME = "MYAPP"

printGreetings()
//定义变量
func printGreetings(){
    //var定义可变
    var kb_a = "123"
    kb_a = "456"
    print("可变kb_a的值为\(kb_a)")
    
    //val定义,运行时常量
    let no_kb = "aaa"
    //no_kb = "bbb" //这里报错,不可以重新赋值
    print("不可变kb_a的值为\(no_kb)")

    
     // 获取当前时间
    let currentTime = Date()	
    print("当前时间currentTime:\(currentTime)")
    
    print("获取编译时变量PI:\(PI)")
    print("获取编译时变量APP_NAME:\(APP_NAME)")
 
}
//可变kb_a的值为456
//不可变kb_a的值为aaa
//当前时间currentTime:2025-11-24 08:19:02 +0000
//获取编译时变量PI:3.1415926
//获取编译时变量APP_NAME:MYAPP

        

2、kotlin

        用var定义变量,val定义运行时常量,const val定义编译时常量(但是const val不能用在方法中,一般用于文件头部常量定义)

import java.time.LocalDateTime
//编译时常量,const val只能在顶层(文件级别)或对象声明中使用,不能在函数内部使用
const val PI = 3.1415926
const val APP_NAME = "MYAPP"

fun main() {
    printGreetings()
}
//定义变量
fun printGreetings(){
    //var定义可变
    var kb_a = "123"
    kb_a = "456"
    print("可变kb_a的值为${kb_a}")
    
    //val定义,运行时常量
    val no_kb = "aaa"
    //no_kb = "bbb" //这里报错,不可以重新赋值
    print("不可变kb_a的值为${no_kb}")
    
     // 获取当前时间
    val currentTime = LocalDateTime.now()
    print("当前时间currentTime:$currentTime")
    
    print("获取编译时变量PI:$PI")
    print("获取编译时变量APP_NAME:$APP_NAME")
 
}
//输出 可变kb_a的值为456 
//不可变kb_a的值为aaa
//当前时间currentTime:2025-11-24T08:04:24.177545810 
//获取编译时变量PI:3.1415926 
//获取编译时变量APP_NAME:MYAPP

        不存在变量提升,代码顺序执行

3、dart

        用var定义以及显式指定类型比如

var name = '张三'; // 类型自动推断为 String
var age = 25;     // 类型自动推断为 int
var height = 1.75; // 类型自动推断为 double
String name = '李四';
int age = 30;
double score = 95.5;
bool isStudent = true;

finalconst定义常量,前者是运行时常量,后者是编译时常量

特性1:const中相同的变量共享内存

const list1 = [1, 2, 3];
const list2 = [1, 2, 3];
const list3 = [1, 2, 3];

print(identical(list1, list2)); // ✅ true
print(identical(list1, list3)); // ✅ true
print(identical(list2, list3)); // ✅ true
// 所有这三个变量都指向内存中的同一个列表对象

特性2:const编译后定了值就完全不可以改,引用不能变,内容也不能变

// final 列表 - 引用不能变,但内容可以变
final list1 = [1, 2, 3];

// final - 运行时赋值,只能赋值一次
final currentTime = DateTime.now(); // ✅ 正确
// const currentTime = DateTime.now(); // ❌ 错误,DateTime.now() 不是编译时常量

const:编译时就确定了,

// ✅ const 的基本用法
const pi = 3.14159; // 编译时已知的值
const String appName = '我的应用';

4、js/ts

        用var、 let定义变量,const定义常量

        重点:var和let的用法总结

      (1)let 和 var都会进行预解析(变量提升)

      (2)var可以重复定义,比如var a = 10 ,然后接着又var a = 20,但是let不可以

下面代码中,首先预解析的时候变量提升,function fn(){},var fn = undefined,然后fn()两次调用都能输出我是fn函数 ,但是下面又给fn = 100,所以再次调用就报错了“ fn is not a function”,假如var fn = 100换成let fn = 100,直接报错 Identifier 'fn' has already been declared ,因为fn不能两次定义(验证了两者都可以变量提升,但var可以重复定义let不可以

        fn()
        function fn(){
          console.log("我是fn函数")  
        }
        fn()
        var fn = 100
        fn()   
       

      (3)var预解析的时候默认赋值undefined,但是let变量提升的时候没有初始值

      (4)let 块级作用域,var函数作用域

      (5)在作用域内,如果不定义直接写num= 20 ,那他会申明var定义的全局变量比如下面代码

        function fn(){
          num = 100 
          console.log("num值111:",num) //输出num值111: 100
        }
        fn()
        console.log("num值222:",num) //输出num值111: 100

下面这个也是一样的,直接往上找

下面代码内外都定义了a,赋值给内部定义啊,不是全局,所以两个地方的打印全局a上和下都是undefined

下面这代码直接报错 b is not defined

        var a = b
        a = 10 
        b = 10
        console.log(a)
        console.log(b)

各语言的不可变常量对比总结

语言 运行时常量 编译时常量 类似 Dart 的
Dart final const -
Swift let 无直接对应 final
Kotlin val const val(这个不能用在方法中) final
JavaScript const 无严格区分 final
Java final static final(基本类型) final
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐