001类比各门语言的变量、常量定义
1、swift
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;
用final和const定义常量,前者是运行时常量,后者是编译时常量
特性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 |
更多推荐


所有评论(0)