前端转后端基础- 变量和类型

PHP、Go、JavaScript三种语言在变量和类型相关的核心语法对照。

一、变量声明和赋值

PHP 变量语法

php 复制代码
<?php
// PHP变量以$符号开头
$name = "张三";
$age = 25;
$height = 175.5;
$isStudent = true;
$score = null;

// 变量命名规则
$firstName = "李";           // 驼峰命名
$last_name = "四";           // 下划线命名
$UserName = "admin";         // 大驼峰命名
$_privateVar = "secret";     // 私有变量
$MAX_VALUE = 100;            // 常量风格

// 动态类型 - 变量类型可以改变
$var = 10;                   // 整数
$var = "hello";              // 字符串
$var = 3.14;                 // 浮点数
$var = [1, 2, 3];            // 数组
$var = new stdClass();       // 对象

// 引用赋值
$a = 5;
$b = &$a;                    // $b是$a的引用
$b = 10;
echo $a;                     // 输出10,$a的值也被改变了

// 可变变量
$varName = "name";
$$varName = "王五";          // 相当于 $name = "王五"
echo $name;                  // 输出"王五"

// 变量解析
$greeting = "Hello";
$message = "$greeting World";    // 双引号中变量会被解析
$message2 = '$greeting World';   // 单引号中变量不会被解析

// 变量变量
$prefix = "user";
${$prefix . "_name"} = "赵六";   // 相当于 $user_name = "赵六"
echo $user_name;                 // 输出"赵六"

// 变量作用域
$globalVar = "全局变量";

function testScope() {
    global $globalVar;           // 使用global关键字访问全局变量
    $localVar = "局部变量";
    echo $globalVar;
}

// 静态变量
function counter() {
    static $count = 0;
    $count++;
    return $count;
}

echo counter();  // 1
echo counter();  // 2
echo counter();  // 3

// 变量销毁
$var = "test";
unset($var);                     // 销毁变量
// echo $var;                    // 会报错:未定义变量

// 变量存在性检查
$var = "exists";
if (isset($var)) {
    echo "变量存在";
}

// 变量类型检查
$var = 123;
if (is_int($var)) {
    echo "是整数";
}

// 变量输出
$var = "test";
echo $var;                       // 直接输出
print $var;                      // print函数输出
var_dump($var);                  // 输出变量类型和值
print_r($var);                   // 打印变量信息

// 变量插值
$name = "张三";
$age = 25;
echo "姓名:$name,年龄:$age";
echo "姓名:{$name},年龄:{$age}";

// 变量赋值运算符
$a = 10;
$a += 5;     // $a = $a + 5
$a -= 3;     // $a = $a - 3
$a *= 2;     // $a = $a * 2
$a /= 4;     // $a = $a / 4
$a %= 3;     // $a = $a % 3
$a .= "test"; // $a = $a . "test" (字符串连接)

// 递增递减运算符
$i = 0;
$i++;        // 后置递增
++$i;        // 前置递增
$i--;        // 后置递减
--$i;        // 前置递减

// 三元运算符
$age = 20;
$status = ($age >= 18) ? "成人" : "未成年";

// 空合并运算符
$username = $_GET['user'] ?? 'guest';

// 变量类型声明(PHP 7+)
function add(int $a, int $b): int {
    return $a + $b;
}

// 严格类型模式
declare(strict_types=1);

// 变量变量的高级用法
$var1 = "value1";
$var2 = "var1";
echo $$var2;  // 输出"value1"

// 变量引用的高级用法
function modifyByRef(&$param) {
    $param = "modified";
}

$value = "original";
modifyByRef($value);
echo $value;  // 输出"modified"
?>

Go 变量语法

go 复制代码
package main

import (
    "fmt"
    "reflect"
)

func main() {
    // 基本变量声明
    var name string = "张三"
    var age int = 25
    var height float64 = 175.5
    var isStudent bool = true
    var score *int = nil
    
    // 简短声明
    firstName := "李"
    lastName := "四"
    userName := "admin"
    
    // 多变量声明
    var (
        city string = "北京"
        population int = 21540000
        area float64 = 16410.54
    )
    
    // 多变量同时赋值
    a, b, c := 1, 2, 3
    x, y := "hello", 3.14
    
    // 变量类型推断
    var inferred = "自动推断类型"  // 推断为string
    inferred2 := 123               // 推断为int
    
    // 常量声明
    const (
        PI = 3.14159
        MAX_SIZE = 100
        DEFAULT_NAME = "guest"
    )
    
    // 枚举常量
    const (
        Sunday = iota
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
    )
    
    // 类型别名
    type Celsius float64
    type Fahrenheit float64
    
    var temperature Celsius = 25.5
    
    // 指针变量
    var ptr *int
    num := 10
    ptr = &num
    fmt.Println(*ptr)  // 解引用
    
    // 数组变量
    var arr [3]int = [3]int{1, 2, 3}
    arr2 := [5]string{"a", "b", "c", "d", "e"}
    
    // 切片变量
    slice := []int{1, 2, 3, 4, 5}
    slice2 := make([]string, 3)
    
    // 映射变量
    m := make(map[string]int)
    m["age"] = 25
    m["score"] = 90
    
    // 结构体变量
    type Person struct {
        Name string
        Age  int
    }
    
    var p Person
    p.Name = "张三"
    p.Age = 25
    
    p2 := Person{Name: "李四", Age: 30}
    
    // 接口变量
    var i interface{}
    i = "hello"
    i = 123
    i = 3.14
    
    // 通道变量
    ch := make(chan int)
    
    // 函数变量
    var add func(int, int) int
    add = func(a, b int) int {
        return a + b
    }
    
    // 变量作用域
    globalVar := "全局作用域"
    
    {
        localVar := "块级作用域"
        fmt.Println(localVar)
    }
    
    // 变量遮蔽
    outer := "outer"
    {
        outer := "inner"  // 遮蔽外层变量
        fmt.Println(outer)  // 输出"inner"
    }
    fmt.Println(outer)  // 输出"outer"
    
    // 变量零值
    var zeroInt int      // 0
    var zeroString string // ""
    var zeroBool bool    // false
    var zeroPtr *int     // nil
    
    // 变量类型转换
    var i1 int = 10
    var f1 float64 = float64(i1)
    var i2 int = int(f1)
    
    // 变量地址和指针
    value := 42
    ptrValue := &value
    fmt.Printf("值: %d, 地址: %p\n", value, ptrValue)
    
    // 变量比较
    str1 := "hello"
    str2 := "hello"
    fmt.Println(str1 == str2)  // true
    
    // 变量打印
    fmt.Println(name, age, height)
    fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
    fmt.Printf("类型: %T, 值: %v\n", name, name)
    
    // 反射获取变量信息
    varName := "test"
    fmt.Println("类型:", reflect.TypeOf(varName))
    fmt.Println("值:", reflect.ValueOf(varName))
    
    // 变量交换
    x1, y1 := 1, 2
    x1, y1 = y1, x1  // 交换值
    
    // 变量初始化
    var initialized string
    initialized = "已初始化"
    
    // 多返回值
    result1, result2 := multipleReturn()
    fmt.Println(result1, result2)
    
    // 匿名变量
    _, nameOnly := getNameAndAge()
    fmt.Println(nameOnly)
    
    // 变量可见性
    // 首字母大写:包外可见
    // 首字母小写:包内可见
    
    // 变量命名规范
    // 使用驼峰命名法
    // 首字母大写表示导出
    // 首字母小写表示私有
    
    // 变量注释
    // 单行注释
    /* 
       多行注释
    */
    
    // 变量文档注释
    // ExportedVar 是一个导出的变量
    var ExportedVar = "exported"
}

// 多返回值函数
func multipleReturn() (int, string) {
    return 1, "hello"
}

// 返回多个值的函数
func getNameAndAge() (string, int) {
    return "张三", 25
}

JavaScript 变量语法

ini 复制代码
// var 声明(函数作用域)
var name = "张三";
var age = 25;
var height = 175.5;
var isStudent = true;
var score = null;
var undefinedVar;

// let 声明(块级作用域)
let firstName = "李";
let lastName = "四";
let userName = "admin";

// const 声明(常量)
const PI = 3.14159;
const MAX_SIZE = 100;
const DEFAULT_NAME = "guest";

// 变量提升
console.log(hoistedVar);  // undefined
var hoistedVar = "提升";

// 暂时性死区
// console.log(tempDead);  // ReferenceError
let tempDead = "暂时性死区";

// 重复声明
var x = 1;
var x = 2;  // 允许
// let y = 1;
// let y = 2;  // SyntaxError: Identifier 'y' has already been declared

// 变量作用域
var globalVar = "全局变量";

function testScope() {
    var functionVar = "函数作用域";
    let blockVar = "块级作用域";
    
    if (true) {
        var ifVar = "if块中的var";
        let ifLetVar = "if块中的let";
    }
    
    console.log(ifVar);     // 可访问
    // console.log(ifLetVar); // ReferenceError
}

// 块级作用域
{
    let blockScoped = "块级作用域变量";
    const blockConst = "块级常量";
}
// console.log(blockScoped);  // ReferenceError

// 变量解构赋值
// 数组解构
let [a, b, c] = [1, 2, 3];
let [first, , third] = [1, 2, 3];  // 跳过第二个元素
let [head, ...tail] = [1, 2, 3, 4, 5];  // rest操作符

// 对象解构
let {name: n, age: a} = {name: "张三", age: 25};
let {city = "北京"} = {};  // 默认值

// 嵌套解构
let {user: {name: userName}} = {user: {name: "李四"}};

// 交换变量
let x1 = 1, y1 = 2;
[x1, y1] = [y1, x1];

// 多返回值解构
function multipleReturn() {
    return [1, "hello", true];
}
let [num, str, bool] = multipleReturn();

// 变量类型
let str = "字符串";
let num = 123;
let float = 3.14;
let bool = true;
let n = null;
let undef = undefined;
let sym = Symbol("unique");
let bigInt = 123n;

// 动态类型
let dynamic = 10;
dynamic = "hello";
dynamic = true;
dynamic = [1, 2, 3];
dynamic = {key: "value"};

// typeof 运算符
console.log(typeof str);      // "string"
console.log(typeof num);      // "number"
console.log(typeof bool);     // "boolean"
console.log(typeof n);        // "object"
console.log(typeof undef);    // "undefined"
console.log(typeof sym);      // "symbol"
console.log(typeof bigInt);   // "bigint"

// 类型转换
// 字符串转换
let strNum = String(123);
let strBool = String(true);
let strNull = String(null);

// 数字转换
let numStr = Number("123");
let numBool = Number(true);
let numParse = parseInt("123");
let floatParse = parseFloat("3.14");

// 布尔转换
let boolStr = Boolean("hello");
let boolNum = Boolean(0);
let boolArr = Boolean([]);

// 隐式类型转换
let result = "5" + 3;      // "53"
let result2 = "5" - 3;     // 2
let result3 = "5" * 3;     // 15

// 变量比较
console.log(5 == "5");      // true (宽松相等)
console.log(5 === "5");     // false (严格相等)
console.log(null == undefined);  // true
console.log(null === undefined); // false

// 变量运算符
let count = 0;
count++;      // 后置递增
++count;      // 前置递增
count--;      // 后置递减
--count;      // 前置递减

count += 5;   // count = count + 5
count -= 3;   // count = count - 3
count *= 2;   // count = count * 2
count /= 4;   // count = count / 4
count %= 3;   // count = count % 3

// 三元运算符
let age = 20;
let status = (age >= 18) ? "成人" : "未成年";

// 逻辑运算符
let andResult = true && "hello";  // "hello"
let orResult = false || "default"; // "default"
let nullish = null ?? "default";  // "default"

// 可选链操作符
let user = {name: "张三"};
let city = user?.address?.city;  // undefined,不会报错

// 空值合并运算符
let username = null ?? "guest";  // "guest"

// 模板字符串
let name = "张三";
let age = 25;
let message = `姓名:${name},年龄:${age}`;
let multiLine = `
    这是
    多行
    字符串
`;

// 变量属性访问
let obj = {key: "value"};
let keyName = "key";
console.log(obj.key);        // 点号访问
console.log(obj["key"]);     // 方括号访问
console.log(obj[keyName]);   // 动态属性名

// 变量方法调用
let str = "hello";
console.log(str.toUpperCase());  // "HELLO"
console.log(str.length);         // 5

// 变量作为函数参数
function greet(name) {
    console.log(`Hello, ${name}!`);
}
greet("张三");

// 变量作为函数返回值
function createPerson(name, age) {
    return {name, age};
}
let person = createPerson("李四", 30);

// 闭包中的变量
function outer() {
    let outerVar = "outer";
    return function inner() {
        console.log(outerVar);
    };
}
let closure = outer();
closure();  // "outer"

// 立即执行函数表达式中的变量
(function() {
    let iifeVar = "IIFE";
    console.log(iifeVar);
})();

// 变量垃圾回收
let largeData = new Array(1000000).fill(0);
largeData = null;  // 允许垃圾回收

// 变量冻结
const obj = {key: "value"};
Object.freeze(obj);
// obj.key = "new";  // 严格模式下会报错

// 变量密封
const sealed = {key: "value"};
Object.seal(sealed);
// sealed.newKey = "new";  // 严格模式下会报错

// 变量属性描述符
let descriptorObj = {};
Object.defineProperty(descriptorObj, 'readOnly', {
    value: "只读",
    writable: false,
    enumerable: true,
    configurable: false
});

// 变量代理
let target = {key: "value"};
let proxy = new Proxy(target, {
    get: function(obj, prop) {
        return prop in obj ? obj[prop] : "默认值";
    }
});

// 变量符号
let sym1 = Symbol("description");
let sym2 = Symbol("description");
console.log(sym1 === sym2);  // false

// 全局符号注册表
let globalSym = Symbol.for("global");
let sameSym = Symbol.for("global");
console.log(globalSym === sameSym);  // true

// 变量迭代
let iterable = [1, 2, 3];
for (let item of iterable) {
    console.log(item);
}

// 变量展开运算符
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5];
let obj1 = {a: 1, b: 2};
let obj2 = {...obj1, c: 3};

// 变量剩余参数
function sum(...numbers) {
    return numbers.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3, 4, 5));  // 15

// 变量标签模板
function tag(strings, ...values) {
    console.log(strings);
    console.log(values);
}
let name = "张三";
tag`Hello ${name}!`;

// 变量私有字段(ES2022+)
class MyClass {
    #privateField = "私有字段";
    getPrivate() {
        return this.#privateField;
    }
}

// 变量静态字段
class MyClass2 {
    static staticField = "静态字段";
}
console.log(MyClass2.staticField);

// 变量装饰器(实验性)
// @decorator
// class DecoratedClass {
//     @readonly
//     method() {}
// }

二、数据类型详解

PHP 数据类型

php 复制代码
<?php
// 标量类型
// 整数类型
$int1 = 123;              // 十进制
$int2 = -123;             // 负数
$int3 = 0123;             // 八进制(123)
$int4 = 0x1A;             // 十六进制(26)
$int5 = 0b11111111;       // 二进制(255)

// 浮点数类型
$float1 = 1.234;
$float2 = 1.2e3;          // 1200
$float3 = 7E-10;          // 0.0000000007

// 字符串类型
$string1 = '单引号字符串';
$string2 = "双引号字符串,可以包含变量 $name";
$string3 = "转义字符:\n 换行,\t 制表符";
$string4 = <<<EOT
    多行字符串
    Heredoc语法
EOT;

// 布尔类型
$bool1 = true;
$bool2 = false;
$bool3 = (bool)1;         // true
$bool4 = (bool)0;         // false
$bool5 = (bool)"0";       // false
$bool6 = (bool)"";        // false
$bool7 = (bool)null;      // false

// 复合类型
// 数组类型
$array1 = array(1, 2, 3);          // 索引数组
$array2 = [1, 2, 3];               // 短数组语法
$array3 = ["a" => 1, "b" => 2];    // 关联数组
$array4 = [1, "a" => 2, 3];        // 混合数组

// 对象类型
class Person {
    public $name;
    public $age;
    
    function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

$obj = new Person("张三", 25);

// 特殊类型
// NULL类型
$null1 = null;
$null2 = NULL;
$null3;  // 未初始化的变量

// 资源类型
$file = fopen("test.txt", "r");
// $file 是一个资源类型

// 回调类型
function callback($param) {
    echo $param;
}
$cb = 'callback';
$cb("test");

// 类型声明
// 标量类型声明(PHP 7+)
function add(int $a, int $b): int {
    return $a + $b;
}

function divide(float $a, float $b): float {
    return $a / $b;
}

function greet(string $name): string {
    return "Hello, $name";
}

function isActive(bool $status): bool {
    return $status;
}

// 返回类型声明
function getArray(): array {
    return [1, 2, 3];
}

function getObject(): Person {
    return new Person("李四", 30);
}

function getCallable(): callable {
    return function() {
        return "callable";
    };
}

// 可空类型
function nullable(?string $name): ?string {
    return $name;
}

// 联合类型(PHP 8+)
function union(int|string $param): int|string {
    return $param;
}

// 交集类型(PHP 8.1+)
function intersection(Traversable&Countable $param) {
    // ...
}

// 类型检查函数
$var = 123;
var_dump(is_int($var));        // true
var_dump(is_float($var));      // false
var_dump(is_string($var));     // false
var_dump(is_bool($var));       // false
var_dump(is_array($var));      // false
var_dump(is_object($var));     // false
var_dump(is_null($var));       // false
var_dump(is_numeric($var));    // true
var_dump(is_scalar($var));     // true

// 类型转换
// 显式转换
$int = (int)"123";
$float = (float)"3.14";
$string = (string)123;
$bool = (bool)"true";
$array = (array)$obj;
$object = (object)$array;

// settype函数
$var = "123";
settype($var, "integer");
var_dump($var);  // int(123)

// 类型比较
var_dump(1 == "1");      // true (宽松比较)
var_dump(1 === "1");     // false (严格比较)
var_dump(0 == false);    // true
var_dump(0 === false);   // false
var_dump(null == 0);     // true
var_dump(null === 0);    // false

// 类型提示
class Container {
    private array $items = [];
    
    public function addItem(string $item): void {
        $this->items[] = $item;
    }
    
    public function getItems(): array {
        return $this->items;
    }
}

// 枚举类型(PHP 8.1+)
enum Status: string {
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
}

$status = Status::PUBLISHED;
echo $status->value;  // "published"

// 只读属性(PHP 8.1+)
class User {
    public readonly string $name;
    
    public function __construct(string $name) {
        $this->name = $name;
    }
}

// 新的初始化器(PHP 8.1+)
class Product {
    public function __construct(
        private string $name,
        private float $price = 0.0,
        private array $tags = []
    ) {}
}

// 属性类型
class Article {
    public string $title;
    public ?string $content = null;
    public array $metadata = [];
    public DateTime $createdAt;
}

// 泛型注释(虽然PHP没有原生泛型)
/**
 * @template T
 * @param T $value
 * @return T
 */
function identity($value) {
    return $value;
}
?>

Go 数据类型

go 复制代码
package main

import (
    "fmt"
    "math"
    "math/big"
    "unsafe"
)

func main() {
    // 布尔类型
    var b1 bool = true
    var b2 bool = false
    fmt.Println(b1, b2)
    
    // 数值类型
    // 整数类型
    var int8Var int8 = 127           // -128 to 127
    var int16Var int16 = 32767       // -32768 to 32767
    var int32Var int32 = 2147483647  // -2147483648 to 2147483647
    var int64Var int64 = 9223372036854775807 // -9223372036854775808 to 9223372036854775807
    var intVar int = 42              // 平台相关,32或64位
    
    // 无符号整数
    var uint8Var uint8 = 255         // 0 to 255
    var uint16Var uint16 = 65535     // 0 to 65535
    var uint32Var uint32 = 4294967295 // 0 to 4294967295
    var uint64Var uint64 = 18446744073709551615 // 0 to 18446744073709551615
    var uintVar uint = 42            // 平台相关
    
    // 浮点数类型
    var float32Var float32 = 3.14    // IEEE-754 32位浮点数
    var float64Var float64 = 3.141592653589793 // IEEE-754 64位浮点数
    
    // 复数类型
    var complex64Var complex64 = 1 + 2i
    var complex128Var complex128 = 3 + 4i
    
    // 字符串类型
    var str1 string = "Hello"
    var str2 string = `Raw string
    多行字符串
    不转义`
    
    // 字节和符文
    var byteVar byte = 'A'           // uint8的别名
    var runeVar rune = '中'          // int32的别名,表示Unicode码点
    
    // 派生类型
    // 指针类型
    var ptr *int
    num := 42
    ptr = &num
    fmt.Println(*ptr)
    
    // 数组类型
    var arr1 [3]int = [3]int{1, 2, 3}
    var arr2 = [5]string{"a", "b", "c", "d", "e"}
    var arr3 = [...]int{1, 2, 3, 4, 5}  // 编译器推断长度
    
    // 切片类型
    var slice1 []int = []int{1, 2, 3}
    var slice2 = make([]string, 3)
    var slice3 = make([]float64, 5, 10) // 长度5,容量10
    
    // 映射类型
    var map1 map[string]int = make(map[string]int)
    var map2 = map[string]string{
        "name": "张三",
        "city": "北京",
    }
    
    // 结构体类型
    type Person struct {
        Name string
        Age  int
    }
    var p1 Person
    var p2 = Person{Name: "李四", Age: 30}
    
    // 接口类型
    var i1 interface{}
    i1 = "hello"
    i1 = 123
    i1 = 3.14
    
    // 函数类型
    var add func(int, int) int
    add = func(a, b int) int {
        return a + b
    }
    
    // 通道类型
    var ch1 chan int = make(chan int)
    var ch2 chan string = make(chan string, 10) // 带缓冲的通道
    
    // 类型别名
    type Celsius float64
    type Fahrenheit float64
    
    var temp Celsius = 25.5
    
    // 类型定义
    type MyInt int
    var myInt MyInt = 42
    
    // 枚举类型(使用iota)
    type Weekday int
    
    const (
        Sunday Weekday = iota
        Monday
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
    )
    
    // 类型转换
    var i int = 42
    var f float64 = float64(i)
    var j int = int(f)
    
    var b byte = byte(i)
    var r rune = rune(i)
    
    // 类型断言
    var val interface{} = "hello"
    str, ok := val.(string)
    if ok {
        fmt.Println(str)
    }
    
    // 类型开关
    switch v := val.(type) {
    case string:
        fmt.Println("字符串:", v)
    case int:
        fmt.Println("整数:", v)
    default:
        fmt.Println("未知类型")
    }
    
    // 类型大小
    fmt.Println("int8大小:", unsafe.Sizeof(int8Var))
    fmt.Println("int64大小:", unsafe.Sizeof(int64Var))
    fmt.Println("float64大小:", unsafe.Sizeof(float64Var))
    
    // 类型零值
    var zeroInt int      // 0
    var zeroFloat float64 // 0.0
    var zeroBool bool    // false
    var zeroString string // ""
    var zeroPtr *int     // nil
    var zeroSlice []int  // nil
    var zeroMap map[string]int // nil
    var zeroFunc func()  // nil
    var zeroChan chan int // nil
    
    // 常量
    const Pi = 3.14159
    const MaxSize = 100
    
    const (
        A = iota  // 0
        B         // 1
        C         // 2
    )
    
    // 无类型常量
    const untyped = 42  // 无类型整数常量
    const untypedFloat = 3.14  // 无类型浮点数常量
    
    // 类型检查
    var x interface{} = 42
    fmt.Println("类型:", fmt.Sprintf("%T", x))
    fmt.Println("值:", x)
    
    // 大数类型
    bigInt := big.NewInt(12345678901234567890)
    fmt.Println("大整数:", bigInt)
    
    // 位运算
    a := 5  // 101
    b := 3  // 011
    fmt.Println("与:", a & b)   // 001 = 1
    fmt.Println("或:", a | b)   // 111 = 7
    fmt.Println("异或:", a ^ b) // 110 = 6
    fmt.Println("左移:", a << 1) // 1010 = 10
    fmt.Println("右移:", a >> 1) // 10 = 2
    
    // 数学常量
    fmt.Println("最大int8:", math.MaxInt8)
    fmt.Println("最小int8:", math.MinInt8)
    fmt.Println("最大float64:", math.MaxFloat64)
    
    // 类型方法
    type MyType int
    
    func (m MyType) Double() MyType {
        return m * 2
    }
    
    var mt MyType = 5
    fmt.Println("Double:", mt.Double())
    
    // 匿名结构体
    anon := struct {
        Name string
        Age  int
    }{
        Name: "匿名",
        Age:  25,
    }
    fmt.Println(anon)
    
    // 嵌入类型
    type Address struct {
        City string
    }
    
    type Employee struct {
        Name    string
        Address // 嵌入
    }
    
    emp := Employee{
        Name: "张三",
        Address: Address{City: "北京"},
    }
    fmt.Println(emp.City)  // 通过嵌入访问
    
    // 标签(struct tags)
    type User struct {
        Name  string `json:"name" validate:"required"`
        Email string `json:"email" validate:"email"`
    }
    
    // 泛型(Go 1.18+)
    type Number interface {
        int | int64 | float64
    }
    
    func Sum[T Number](nums []T) T {
        var sum T
        for _, num := range nums {
            sum += num
        }
        return sum
    }
    
    result := Sum([]int{1, 2, 3, 4, 5})
    fmt.Println("Sum:", result)
}

JavaScript 数据类型

ini 复制代码
// 原始类型(Primitive Types)
// 字符串类型
let str1 = "双引号字符串";
let str2 = '单引号字符串';
let str3 = `模板字符串,可以包含变量 ${name}`;
let str4 = String(123);  // 类型转换
let str5 = new String("对象字符串");  // 不推荐

// 数值类型
let num1 = 123;           // 整数
let num2 = -456;          // 负数
let num3 = 3.14;          // 浮点数
let num4 = 1.23e4;        // 科学计数法 12300
let num5 = 0xFF;          // 十六进制 255
let num6 = 0o777;         // 八进制 511
let num7 = 0b1111;        // 二进制 15
let num8 = Infinity;      // 无穷大
let num9 = -Infinity;     // 负无穷大
let num10 = NaN;          // 非数字
let num11 = Number.MAX_VALUE;  // 最大数值
let num12 = Number.MIN_VALUE;  // 最小数值

// 大整数类型(ES2020+)
let bigInt1 = 123n;
let bigInt2 = BigInt(123);
let bigInt3 = BigInt("123456789012345678901234567890");

// 布尔类型
let bool1 = true;
let bool2 = false;
let bool3 = Boolean(1);       // true
let bool4 = Boolean(0);       // false
let bool5 = Boolean("hello"); // true
let bool6 = Boolean("");      // false
let bool7 = !!value;          // 双重否定转换

// Undefined类型
let undef1;
let undef2 = undefined;
let undef3 = void 0;          // 另一种写法

// Null类型
let null1 = null;

// Symbol类型(ES2015+)
let sym1 = Symbol("description");
let sym2 = Symbol("description");
console.log(sym1 === sym2);  // false,唯一性

// 全局Symbol注册表
let globalSym1 = Symbol.for("global");
let globalSym2 = Symbol.for("global");
console.log(globalSym1 === globalSym2);  // true

// Symbol作为对象属性键
let obj = {
    [Symbol("key")]: "value",
    [Symbol.iterator]: function*() {
        yield 1;
        yield 2;
    }
};

// 对象类型(Object Types)
// 普通对象
let obj1 = {key: "value"};
let obj2 = new Object();
let obj3 = Object.create(null);  // 无原型对象

// 数组
let arr1 = [1, 2, 3];
let arr2 = new Array(1, 2, 3);
let arr3 = Array.of(1, 2, 3);
let arr4 = Array.from("hello");  // ['h', 'e', 'l', 'l', 'o']

// 函数
function func1() {}
let func2 = function() {};
let func3 = () => {};
let func4 = new Function('a', 'b', 'return a + b');

// 日期对象
let date1 = new Date();
let date2 = new Date(2024, 0, 1);  // 2024年1月1日
let date3 = new Date("2024-01-01");

// 正则表达式
let regex1 = /pattern/;
let regex2 = new RegExp("pattern");
let regex3 = /pattern/gi;  // 全局、忽略大小写

// 错误对象
let error1 = new Error("错误信息");
let error2 = new TypeError("类型错误");
let error3 = new RangeError("范围错误");

// Map对象(ES2015+)
let map = new Map();
map.set("key", "value");
map.set(1, "number");
map.set(true, "boolean");

// Set对象(ES2015+)
let set = new Set();
set.add(1);
set.add(2);
set.add(2);  // 重复值不会添加
set.add("string");

// WeakMap对象(ES2015+)
let weakMap = new WeakMap();
let keyObj = {};
weakMap.set(keyObj, "value");

// WeakSet对象(ES2015+)
let weakSet = new WeakSet();
weakSet.add(keyObj);

// Promise对象(ES2015+)
let promise = new Promise((resolve, reject) => {
    resolve("成功");
});

// Proxy对象(ES2015+)
let target = {key: "value"};
let proxy = new Proxy(target, {
    get: function(obj, prop) {
        return prop in obj ? obj[prop] : "默认值";
    }
});

// Reflect对象(ES2015+)
let objReflect = {};
Reflect.set(objReflect, 'key', 'value');
console.log(Reflect.get(objReflect, 'key'));

// 类(ES2015+)
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    
    greet() {
        console.log(`Hello, ${this.name}`);
    }
}

// 静态方法和属性
class MyClass {
    static staticProp = "静态属性";
    
    static staticMethod() {
        return "静态方法";
    }
}

// 私有字段(ES2022+)
class PrivateClass {
    #privateField = "私有字段";
    
    getPrivate() {
        return this.#privateField;
    }
}

// 类型检查
let value = "hello";

console.log(typeof value);        // "string"
console.log(typeof 123);          // "number"
console.log(typeof true);         // "boolean"
console.log(typeof undefined);    // "undefined"
console.log(typeof null);         // "object" (历史遗留问题)
console.log(typeof {});           // "object"
console.log(typeof []);           // "object"
console.log(typeof function(){}); // "function"
console.log(typeof Symbol());     // "symbol"
console.log(typeof 123n);         // "bigint"

// instanceof 检查
console.log([] instanceof Array);        // true
console.log({} instanceof Object);       // true
console.log(function(){} instanceof Function); // true
console.log(new Date() instanceof Date); // true

// Array.isArray 检查
console.log(Array.isArray([]));  // true
console.log(Array.isArray({}));  // false

// Object.prototype.toString 检查
console.log(Object.prototype.toString.call([]));      // "[object Array]"
console.log(Object.prototype.toString.call({}));      // "[object Object]"
console.log(Object.prototype.toString.call(null));    // "[object Null]"
console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]"

// 类型转换
// 字符串转换
let strNum = String(123);
let strBool = String(true);
let strObj = String({key: "value"});
let strNull = String(null);
let strUndef = String(undefined);

// 数字转换
let numStr = Number("123");
let numBool = Number(true);
let numObj = Number({valueOf: () => 42});
let numParseInt = parseInt("123");
let numParseFloat = parseFloat("3.14");

// 布尔转换
let boolStr = Boolean("hello");
let boolNum = Boolean(0);
let boolObj = Boolean({});
let boolArr = Boolean([]);

// 隐式类型转换
let result1 = "5" + 3;      // "53" (字符串拼接)
let result2 = "5" - 3;      // 2 (数字减法)
let result3 = "5" * 3;      // 15 (数字乘法)
let result4 = "5" / 2;      // 2.5 (数字除法)
let result5 = "5" % 2;      // 1 (数字取模)

// == 和 === 的区别
console.log(5 == "5");      // true (类型转换后比较)
console.log(5 === "5");     // false (类型和值都比较)
console.log(0 == false);    // true
console.log(0 === false);   // false
console.log(null == undefined);  // true
console.log(null === undefined); // false

// 类型转换规则
// ToPrimitive - 转换为原始值
let objToPrim = {
    valueOf: function() { return 42; },
    toString: function() { return "hello"; }
};
console.log(+objToPrim);  // 42 (优先调用valueOf)

// ToNumber - 转换为数字
console.log(Number("123"));    // 123
console.log(Number("3.14"));   // 3.14
console.log(Number(""));       // 0
console.log(Number("hello"));  // NaN
console.log(Number(true));     // 1
console.log(Number(false));    // 0
console.log(Number(null));     // 0
console.log(Number(undefined)); // NaN

// ToString - 转换为字符串
console.log(String(123));      // "123"
console.log(String(true));     // "true"
console.log(String(null));     // "null"
console.log(String(undefined)); // "undefined"
console.log(String({}));       // "[object Object]"

// ToBoolean - 转换为布尔值
// 以下值转换为false
console.log(Boolean(false));   // false
console.log(Boolean(0));       // false
console.log(Boolean(-0));      // false
console.log(Boolean(0n));      // false
console.log(Boolean(""));      // false
console.log(Boolean(null));    // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN));     // false

// 其他所有值转换为true
console.log(Boolean("0"));     // true
console.log(Boolean("false")); // true
console.log(Boolean([]));      // true
console.log(Boolean({}));      // true
console.log(Boolean(function(){})); // true

// 类型安全函数
function safeAdd(a, b) {
    if (typeof a !== 'number' || typeof b !== 'number') {
        throw new TypeError('参数必须是数字');
    }
    return a + b;
}

// TypeScript类型注释(虽然不是原生支持)
/**
 * @param {number} a
 * @param {number} b
 * @returns {number}
 */
function add(a, b) {
    return a + b;
}

// JSDoc类型注释
/**
 * @typedef {Object} User
 * @property {string} name
 * @property {number} age
 * @property {string[]} hobbies
 */

/**
 * @param {User} user
 * @returns {string}
 */
function greetUser(user) {
    return `Hello, ${user.name}`;
}

// 类型守卫
function isString(value) {
    return typeof value === 'string';
}

function process(value) {
    if (isString(value)) {
        // TypeScript中这里value会被推断为string类型
        return value.toUpperCase();
    }
    return value;
}

以上是三种语言在变量和类型方面的详细对照,涵盖了基本语法、数据类型、类型转换、作用域等核心概念。每种语言都有其独特的特性和最佳实践。

相关推荐
Cobyte2 小时前
1.基于依赖追踪和触发的响应式系统的本质
前端·javascript·vue.js
主宰者3 小时前
C# CommunityToolkit.Mvvm全局事件
java·前端·c#
前端小咸鱼一条3 小时前
16.迭代器 和 生成器
开发语言·前端·javascript
小江的记录本4 小时前
【注解】常见 Java 注解系统性知识体系总结(附《全方位对比表》+ 思维导图)
java·前端·spring boot·后端·spring·mybatis·web
web守墓人4 小时前
【前端】记一次将ruoyi vue3 element-plus迁移到arco design vue的经历
前端·vue.js·arco design
伊步沁心4 小时前
Webpack & Vite 深度解析
前端
libokaifa4 小时前
OpenSpec + TDD:让 AI 写代码,用测试兜底
前端·ai编程
用户15815963743704 小时前
搭 AI Agent 团队踩了 18 个坑,总结出这 5 个关键步骤
前端
Kellen4 小时前
Fumadocs 基础概念:从内容源到页面渲染
前端