前端轉后端基礎- 變量和類型
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
PHP、Go、JavaScript三種語言在變量和類型相關的核心語法對照。 一、變量聲明和賦值PHP 變量語法Go 變量語法JavaScript 變量語法二、數據類型詳解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 數據類型JavaScript 數據類型代碼高亮:
// 原始類型(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; } 以上是三種語言在變量和類型方面的詳細對照,涵蓋了基本語法、數據類型、類型轉換、作用域等核心概念。每種語言都有其獨特的特性和最佳實踐。 參考文章:原文鏈接? 該文章在 2026/4/3 10:25:18 編輯過 |
關鍵字查詢
相關文章
正在查詢... |