Day14——JavaScript 核心知識全解析:變量、類型與操作符深度探秘

接續上文:《前端小白進階 Day13:JavaScript 基礎語法 + 交互技巧 + 知識圖譜,零基礎也能懂》-CSDN博客

點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!!

主頁:一位搞嵌入式的 genius-CSDN博客

系列文章專欄:

https://blog.csdn.net/m0_73589512/category_13011829.html

目錄

Day14(前端:JavaScript基礎階段)

1. JavaScript 語句、分號與注釋體系詳解

1. JavaScript 語句和分號

定義

分號使用規則

2. JavaScript 的注釋類型

2.1 單行注釋

2.2 多行注釋

2.3 文檔注釋

2.4 注釋類型總結

3. 知識小結

2. JavaScript 變量與數據結構詳解

一、JavaScript 的變量和數據結構

1. 內容大綱

2. 程序變量的數據

數據特性:動態變化是核心

典型場景案例(理解變量必要性)

例題:英雄血條變化(變量的實際應用)

3. 變量的命名格式

變量的基本組成

命名核心規則(基礎規范)

類比理解與示例說明

二、知識小結

3. JavaScript 變量的定義與命名規范詳解

一、變量

1. 變量的命名格式

組成部分

1)變量的定義

2)變量的聲明

3)變量的賦值

4)變量的命名格式小結

2. 變量的命名規范

1)變量命名規則(語法要求,必須遵守)

2)變量命名規范(編碼習慣,建議遵守)

規則與規范的區別

二、知識小結

4. JavaScript 變量使用注意事項與數據類型詳解

一、變量的使用注意

1. 未聲明直接使用:報錯

2. 聲明未賦值:默認值為 undefined

3. 不使用 var 聲明:全局污染風險

二、JavaScript 的數據類型

1. 核心概念:值都有類型,變量類型動態

(1)值的類型特性

(2)變量的動態類型

2. JavaScript 常見的數據類型

各核心類型詳解

(1)number 類型:統一的數字類型

(2)string 類型:文本數據

(3)boolean 類型:邏輯真假

(4)undefined vs null:易混淆的 “空值”

(5)object 類型:復雜數據結構

3. 類型檢測:typeof 操作符

三、知識小結

5. JavaScript typeof 操作符詳解:數據類型檢測工具

一、typeof 操作符

1. 操作符的定義:不是函數,是操作符

本質區別

語法對比(操作符 vs 函數)

正確使用方式

2. 松散的類型系統:為什么需要 typeof?

動態類型特性

實際案例

類型檢測需求

3. 應用案例:typeof 操作符演示

例題 1:基礎類型檢測

例題 2:未賦值變量與 undefined 檢測

例題 3:null 的特殊檢測結果(歷史遺留問題)

4. typeof 的返回值:7 種固定結果

5. typeof 的用法:兩種寫法與括號的本質

兩種合法寫法

示例對比

核心理解

6. typeof 操作符的核心總結

核心功能

使用場景

注意事項

二、知識小結


Day14(前端:JavaScript基礎階段)

1. JavaScript 語句、分號與注釋體系詳解

1. JavaScript 語句和分號

定義

語句是向瀏覽器發出的指令,表達一個操作或行為(Action),英文術語為 Statements。 示例:alert("Hello World"); —— 每行代碼通常對應一個語句,用于完成特定功能(如彈出彈窗)。

分號使用規則
  • 推薦原則:建議每條語句末尾添加分號(英文術語:semicolon),明確標記語句結束,避免語法歧義。

  • 省略場景:當語句以換行符分隔時,JavaScript 多數情況下會觸發 “自動插入分號機制”,可省略分號;但特殊場景(如一行寫多條語句、語句以 ( [ 等開頭)可能導致解析錯誤。

  • 新手建議:前期不熟練時,推薦為所有語句添加分號;熟練掌握語法規則后,可根據個人 / 團隊規范選擇是否省略。

2. JavaScript 的注釋類型

注釋用于解釋代碼功能,不會被瀏覽器執行,是提升代碼可讀性和可維護性的關鍵。JavaScript 支持三種常用注釋類型:

2.1 單行注釋
  • 語法:以雙斜杠 // 開頭,后面緊跟注釋內容。

  • 特點:僅能注釋單行內容,從 // 開始到行尾均為注釋區域。

  • 示例:

    // 彈出歡迎彈窗(這是一條單行注釋)
    alert("Welcome!"); 
  • 生成方式:在 VS Code 中,選中目標代碼行或光標定位到行內,按 Ctrl + / 可快速生成 / 取消單行注釋。

  • 適用場景:簡單說明單條語句或代碼塊的功能,如變量定義、函數調用的用途。

2.2 多行注釋
  • 語法:以 /* 開頭,*/ 結尾,注釋內容寫在兩者之間。

  • 特點:支持跨越多行,注釋范圍靈活;語法格式與 CSS 注釋完全一致,便于前端開發者統一記憶。

  • 示例:

    /* 功能:計算兩個數字的和輸入:num1(第一個數字)、num2(第二個數字)輸出:返回兩數之和
    */
    function add(num1, num2) {return num1 + num2;
    }
  • 注意事項:多行注釋不支持嵌套,即不能在 /* */ 內部再寫 /* */,否則會導致注釋提前結束(如 /* 外層注釋 /* 內層注釋 */ 中,內層 */ 會被識別為外層注釋的結束符)。

  • 適用場景:詳細說明復雜邏輯、函數整體功能、代碼塊的設計思路等需要多行文本來解釋的場景。

2.3 文檔注釋
  • 語法:以 /** 開頭,*/ 結尾,內部遵循 JSDoc 標準格式,通過特定標簽(如 @param @return)描述代碼信息。

  • 核心用途:為函數、類、對象等生成標準化的 API 文檔,支持開發工具(如 VS Code)在調用時顯示智能提示(含參數類型、用途、返回值說明等)。

  • 生成方式:在 VS Code 中,光標定位到函數 / 類上方,輸入 /** 后按回車鍵,工具會自動生成文檔注釋模板,開發者只需補充內容即可。

  • 關鍵標簽與示例:

    /*** 計算兩個數字的乘積* @param {number} num1 - 第一個乘數(必須為數字類型)* @param {number} num2 - 第二個乘數(必須為數字類型)* @return {number} 返回兩個數字的乘積* @example * // 輸出 15* multiply(3, 5);*/
    function multiply(num1, num2) {return num1 * num2;
    }

    常用標簽說明:

    • @param {類型} 參數名 - 描述:指定函數參數的類型(如 number string)、參數名和用途;

    • @return {類型} 描述:說明函數返回值的類型和含義;

    • @example:提供函數調用的示例,便于使用者參考。

  • 優勢與限制:

    • 優勢:調用函數時,VS Code 會自動顯示文檔注釋中的所有信息(參數類型提示、示例等),降低使用門檻;適合開源項目或團隊協作,統一 API 文檔風格。

    • 限制:在 HTML 文件內嵌的 <script> 標簽中,文檔注釋的智能提示支持度較差;推薦在獨立的 .js 文件中使用,以獲得最佳效果。

2.4 注釋類型總結
注釋類型語法格式核心特點適用場景
單行注釋// 注釋內容僅單行、簡潔高效單條語句說明、簡單功能標注
多行注釋/* 注釋內容 */支持多行、范圍靈活復雜邏輯解釋、代碼塊功能說明
文檔注釋/** 注釋內容 */遵循 JSDoc、生成智能提示函數 / 類 API 文檔、團隊協作 / 開源項目

通用注意事項

  1. 注釋需簡潔準確,避免冗余(如 “定義變量 a” 這類無意義注釋);

  2. 代碼更新時,需同步更新對應注釋,防止 “注釋與代碼不一致”;

  3. 所有注釋均不支持嵌套,尤其是多行注釋和文檔注釋,嵌套會導致語法錯誤。

3. 知識小結

知識點核心內容考試重點 / 易混淆點難度系數
JavaScript 語句與分號語句是瀏覽器可執行的指令;推薦加分號,換行可省略(依賴自動插入機制)分號使用規范;自動插入分號的特殊失效場景(如行首 ( [??
單行注釋語法 //,僅注釋單行;VS Code 快捷鍵 Ctrl + /與 HTML 注釋(<!-- -->)、CSS 注釋(/* */)的區別?
多行注釋語法 /* */,支持多行;與 CSS 注釋格式一致禁止嵌套注釋的規則;與文檔注釋的語法差異??
文檔注釋語法 /** */,遵循 JSDoc;含 @param @return 等標簽@param 的類型注解格式;HTML 與獨立 JS 文件的支持差異????
函數文檔化通過文檔注釋生成智能提示;需明確參數類型、返回值和示例參數類型聲明的正確性(如 {string} vs string???
開發工具支持VS Code 對獨立 JS 文件的文檔注釋支持完善,HTML 中支持度低文檔注釋模板的自動生成方法??
代碼規范建議工具函數用文檔注釋,復雜邏輯用多行注釋,簡單說明用單行注釋不同注釋類型的應用場景區分???

2. JavaScript 變量與數據結構詳解

一、JavaScript 的變量和數據結構

1. 內容大綱

本模塊圍繞 JavaScript 中 “動態數據存儲與處理” 展開,核心知識點可拆解為 5 個關鍵部分,形成完整的知識邏輯鏈:

  • 變量認識:理解變量的本質(存儲動態數據的容器)及在程序中的核心作用;

  • 變量定義規范:掌握變量命名規則、聲明關鍵字(var/let/const)的使用差異;

  • 數據類型和 typeof 操作符:明確 JavaScript 中的數據類型分類,學會用 typeof 檢測數據類型(注意:typeof 是操作符,而非函數,使用時可加括號 typeof(xxx) 或直接寫 typeof xxx);

  • 常見數據類型:深入學習字符串、數字、布爾值、null、undefined、對象等基礎數據類型的特性;

  • 數據類型轉換:掌握開發中高頻的轉換場景,包括字符串與數字互轉、數字與布爾值互轉、隱式轉換與顯式轉換的區別及應用。

2. 程序變量的數據
數據特性:動態變化是核心

在實際應用程序中,絕大多數數據并非靜態固定,而是會隨用戶操作、時間推移或業務邏輯實時變動。變量的核心價值,就是存儲這些動態變化的數據,確保程序能跟蹤、更新并使用最新數據。

典型場景案例(理解變量必要性)
  • 電商場景:用戶操作購物車時,商品數量(如從 1 件增至 3 件)、商品總價(隨數量同步變化)、選中狀態(從 “未選” 變為 “已選”)等數據,均需通過變量實時記錄;

  • 音樂播放器:播放進度(從 01:20 跳至 03:45)、當前音量(從 50% 調至 80%)、歌詞同步位置等動態數據,依賴變量實現實時更新與展示;

  • 社交應用:未讀消息數量(從 3 條增至 5 條)、用戶在線狀態(從 “在線” 變為 “離線”)、聊天輸入框的內容(隨用戶打字實時變化),均需變量存儲中間狀態;

  • 游戲場景:角色血量(從 1000 降至 600,再通過道具恢復至 800)、金幣數量(完成任務后從 500 增加到 800)、技能冷卻時間(從 10 秒倒計時至 0 秒),變量是記錄這些實時數值的關鍵。

例題:英雄血條變化(變量的實際應用)
  • 需求:模擬游戲中英雄血量的變化過程(初始 1000 → 獲得增益后增至 1500 → 受到攻擊后降至 1300);

  • 變量作用:用一個變量(如 heroHp)存儲血量,通過賦值操作跟蹤全程變化,避免數據 “丟失” 或 “混亂”;

  • 類比理解:變量就像一個 “可重復使用的標簽盒子”—— 盒子上的標簽是 “變量名”(如 heroHp),盒子里裝的是 “變量值”(如 1000、1500),可以隨時打開盒子更換里面的內容(修改變量值);

  • 代碼示例:

    // 1. 聲明變量并存儲初始血量(1000)
    let heroHp = 1000;
    console.log("初始血量:", heroHp); // 輸出:初始血量:1000
    ?
    // 2. 獲得增益,血量增加 500(更新變量值)
    heroHp += 500; // 等價于 heroHp = heroHp + 500
    console.log("增益后血量:", heroHp); // 輸出:增益后血量:1500
    ?
    // 3. 受到攻擊,血量減少 200(再次更新變量值)
    heroHp -= 200; // 等價于 heroHp = heroHp - 200
    console.log("受擊后血量:", heroHp); // 輸出:受擊后血量:1300
3. 變量的命名格式
變量的基本組成

每個變量都包含兩部分,缺一不可:

  • 變量名:相當于 “盒子的標簽”,用于在程序中定位和調用變量(如 heroHpcartCount);

  • 變量值:相當于 “盒子里的內容”,即變量存儲的具體數據(如 1300、5、"未讀消息")。

命名核心規則(基礎規范)

變量命名需遵守 JavaScript 的語法限制,否則會導致代碼報錯,核心規則如下:

  1. 字符組成:只能由字母(A-Z/a-z)、數字(0-9)、下劃線(_)、美元符號($)組成,且不能以數字開頭(如 123name 是錯誤的,name123 是正確的);

  2. 關鍵字禁用:不能使用 JavaScript 的保留關鍵字(如 letvarfunctionif 等)作為變量名(如 let let = 10 會報錯);

  3. 大小寫敏感:變量名區分大小寫,usernameUserName 是兩個不同的變量(如 let username = "張三"; let UserName = "李四"; 兩者互不影響);

  4. 命名風格:推薦使用 “駝峰命名法”(首字母小寫,后續單詞首字母大寫),符合前端開發通用規范(如 shoppingCartTotaluserAvatarUrl,而非 shopping_cart_total)。

類比理解與示例說明
  • 類比:如果把變量比作 “快遞盒”,變量名就是快遞單上的 “收件人姓名 + 電話”(唯一標識,確保能找到對應的盒子),變量值就是快遞盒里的 “物品”(可更換);

  • 正確示例:

    let userName = "李華"; // 駝峰命名,符合規范
    let _age = 20; // 以下劃線開頭,合法
    let $total = 199; // 以美元符號開頭,合法
  • 錯誤示例:

    let 1user = "張三"; // 以數字開頭,語法錯誤
    let let = 10; // 使用關鍵字 let 作為變量名,錯誤
    let user-name = "李四"; // 包含連字符(-),錯誤(連字符會被解析為減號)

二、知識小結

知識點核心內容考試重點 / 易混淆點難度系數
JavaScript 變量概念變量是存儲 “可變數據” 的容器,用于記錄程序運行時的動態值(如購物車數量、游戲血條)1. 變量與常量(如 CSS 中的固定樣式值)的區別;2. 變量存儲 “值” 還是 “引用”(基礎類型存值,引用類型存引用)??
變量定義與規范1. 命名規則(字符組成、關鍵字禁用、駝峰命名);2. 賦值與修改(如 let 血量 = 1000; 血量 += 500;1. 變量命名的細節規范(如不能以數字開頭、大小寫敏感);2. let/var/const 的作用域與修改限制差異??
數據類型基礎1. JavaScript 常見數據類型(字符串、數字、布爾等);2. typeof 操作符檢測類型1. typeof 是操作符而非函數(無需強制加括號);2. JavaScript 是 “動態類型語言”(變量類型可隨時變化)???
數據類型轉換1. 顯式轉換(如 Number("100")String(123));2. 隱式轉換(如 "5" + 1);3. 數字與布爾互轉1. 隱式轉換的風險(如 "5" + 1 = "51" 而非 6);2. parseInt()Number() 的區別(前者按 “字符解析”,后者按 “整體數值” 解析)????
變量應用場景電商購物車(數量 / 總價)、游戲實時數據(血量 / 金幣)、社交應用(消息 / 頭像)1. 理解 “數據可變性” 是變量的核心價值;2. 變量與內存管理的關系(避免未使用變量占用內存)??

3. JavaScript 變量的定義與命名規范詳解

一、變量

1. 變量的命名格式
組成部分

變量包含兩個核心部分:

  • 變量名稱:用于標識變量的標識符(如 hptime

  • 變量值:變量存儲的具體數據(如 100"16:00"

在實際開發中,游戲中的 "血量"、"時間"、"技能冷卻" 等動態變化的概念,都需要通過變量來存儲和管理。

注意:變量名不建議使用中文命名,這與 HTML 中 class 的命名規范一致,主要是為了避免編碼問題和跨平臺兼容性問題。

1)變量的定義
  • 核心概念:變量是用于存儲數據的容器,在 JavaScript 中需要明確告知引擎要定義變量(不能直接使用未定義的變量)。

  • 定義步驟:

    1. 變量聲明:告訴引擎 "我要創建一個變量"

    2. 變量賦值:給創建的變量存入具體數據

  • 應用場景:存儲游戲狀態(如角色血量、剩余時間)、用戶信息(如用戶名、年齡)、表單數據等所有需要動態變化的數據。

2)變量的聲明
  • 聲明方式:使用 var 關鍵字(variable 的縮寫)進行聲明

  • 語法格式var 變量名,例如 var currentTime;

  • 引擎通信var 關鍵字是與 JavaScript 引擎溝通的橋梁,表示 "我要定義一個變量"

  • 其他聲明:ES6 新增了 letconst 聲明方式,功能更完善,但初學階段可先掌握 var 的使用。

3)變量的賦值
  • 賦值符號:使用等號 = 進行賦值操作(注意:= 在這里表示 "賦值",而非數學中的 "等于")

  • 賦值示例var currentTime = "16:00";(聲明變量的同時賦值)

  • 分步操作:

    // 先聲明后賦值(兩條語句)
    var currentTime;
    currentTime = "16:00";
  • 值修改:變量的值可以隨時修改,只需重新賦值即可:

    var currentTime = "16:00";
    currentTime = "17:00"; // 重新賦值,變量值更新為"17:00"
4)變量的命名格式小結
  • 多變量聲明:可以同時聲明多個變量,用逗號分隔:

    var name, age, height; // 同時聲明三個變量
  • 多變量賦值:可以同時聲明并賦值多個變量:

    var name = "why", age = 18, height = 1.88;
  • 開發建議:雖然支持多變量聲明,但推薦逐個聲明,以提高代碼可讀性:

    // 推薦寫法
    var name = "why";
    var age = 18;
    var height = 1.88;
  • 打印變量:使用

    console.log()

    可以打印變量值,支持同時打印多個變量(用逗號分隔):

    var name = "why";
    var age = 18;
    console.log(name); // 打印單個變量
    console.log(name, age); // 打印多個變量,輸出:why 18
  • 打印本質:打印變量時,實際輸出的是變量存儲的值,而非變量名本身。

2. 變量的命名規范
1)變量命名規則(語法要求,必須遵守)
  • 首字符規則:第一個字符必須是字母、下劃線 (_) 或美元符號 ($),不能以數字開頭

    var userName; // 合法(字母開頭)
    var _age; // 合法(下劃線開頭)
    var $total; // 合法(美元符號開頭)
    var 123name; // 錯誤(數字開頭)
  • 后續字符規則:除首字符外,其他字符可以是字母、下劃線、美元符號或數字:

    var user2; // 合法
    var user_name; // 合法
    var user$name; // 合法
  • 大小寫敏感:JavaScript 嚴格區分大小寫,nameName 是兩個完全不同的變量:

    var name = "張三";
    var Name = "李四";
    console.log(name); // 輸出:張三
    console.log(Name); // 輸出:李四
  • 關鍵字限制:不能使用 JavaScript 關鍵字和保留字作為變量名:

    • 關鍵字:對 JavaScript 引擎有特殊含義的單詞,如 varfunctionifelseclass

    • 保留字:目前無特殊含義但未來可能成為關鍵字的單詞,如 interfaceenumprotected

    • 示例:var var = 10;(錯誤,使用關鍵字 var 作為變量名)

      可通過 MDN 文檔查詢完整的關鍵字和保留字列表。

2)變量命名規范(編碼習慣,建議遵守)
  • 駝峰標識:多個單詞組合時,建議使用小駝峰命名法(第一個單詞首字母小寫,后續單詞首字母大寫):

    var currentTime; // 正確(小駝峰)
    var userName; // 正確
    var loginFlag; // 正確

    區別于大駝峰命名法(所有單詞首字母都大寫,如 CurrentTime),小駝峰是 JavaScript 變量命名的主流規范。

  • 空格規范:賦值運算符 = 左右建議各加一個空格,增強可讀性:

    var name = "why"; // 推薦(等號兩邊有空格)
    var age=20; // 不推薦(缺少空格,可讀性差)
  • 分號使用:語句結束建議加分號,雖然 JavaScript 有自動插入分號的機制,但不建議依賴此特性,避免語法歧義:

    var name = "why"; // 推薦(加分號)
    var age = 20 // 不推薦(依賴自動分號插入)
  • 見名知意:變量名應準確反映其存儲的內容,做到 "見名知意":

    var price = 99; // 推薦(明確表示"價格")
    var time = 99; // 不推薦(無法確定是時間、次數還是其他)
規則與規范的區別
  • 必須遵守:命名規則是語法要求,違反會導致代碼報錯(如變量名以數字開頭)

  • 建議遵守:命名規范是編碼習慣,違反不會報錯,但會降低代碼可讀性和可維護性

  • 實際應用:在團隊協作或開源項目中,規范的命名能大幅提高開發效率,減少溝通成本

二、知識小結

知識點核心內容易混淆點 / 重點難度系數
變量概念存儲程序中動態變化的數據變量(可修改)與常量(不可修改)的區別?
變量組成包含變量名和存儲值兩部分變量聲明(var name)與變量賦值(name = "why")的區別??
變量聲明使用 var 關鍵字聲明變量,ES6 新增 letconstvar/let/const 在作用域和修改限制上的差異???
變量賦值通過等號 (=) 進行賦值,支持聲明時賦值和后續賦值連續賦值(var a = b = 10)與分開賦值的區別??
多變量聲明可用逗號分隔同時聲明多個變量,但不推薦多變量聲明導致的代碼可讀性問題??
變量命名規則首字符必須為字母 /_/$,不能以數字開頭數字開頭的變量名會直接報錯???
關鍵字限制不能使用關鍵字 / 保留字作為變量名區分關鍵字(如 function)與普通標識符(如 func????
大小寫敏感Namename 是不同的變量因大小寫錯誤導致的變量未定義問題???
駝峰命名法推薦小駝峰 (camelCase) 命名多單詞變量大駝峰(CamelCase)與小駝峰的區別??
代碼格式規范等號兩邊加空格,語句結束加分號分號使用的最佳實踐(何時必須加,何時可省略)?
見名知意原則變量名應準確反映存儲內容分析錯誤命名(如用 ab 代替有意義的名稱)的弊端??
變量值打印使用 console.log() 打印變量值,支持多參數輸出打印的是變量值而非變量名本身??
數據類型基礎如字符串形式存儲時間數據不同數據類型之間的轉換問題???
全局對象概念未聲明的變量會成為 window 對象的屬性變量作用域的初步理解(全局變量與局部變量)????

4. JavaScript 變量使用注意事項與數據類型詳解

一、變量的使用注意

在 JavaScript 中使用變量時,需規避三類常見問題,否則可能導致代碼報錯或邏輯異常,具體規則如下:

1. 未聲明直接使用:報錯

若變量未通過 var/let/const 聲明,直接在代碼中調用(如打印、賦值),JavaScript 引擎會拋出 ReferenceError(引用錯誤),提示 “變量未定義”。 示例

// 錯誤:message 未聲明直接使用
console.log(message); 
// 報錯:Uncaught ReferenceError: message is not defined

原因:JavaScript 嚴格要求 “先聲明,后使用”,未聲明的變量無法被引擎識別。

2. 聲明未賦值:默認值為 undefined

變量通過關鍵字聲明后,若未立即賦值,引擎會自動為其分配默認值 undefined(表示 “未定義”,是一種特殊數據類型)。 示例

// 聲明變量 info,但未賦值
var info; 
console.log(info); // 輸出:undefined

注意undefined 不等于 “空字符串”("")、“0”(0)或 “null”(null),它特指 “變量已聲明但未賦值” 的狀態。

3. 不使用 var 聲明:全局污染風險

在非嚴格模式下,可直接通過 “變量名 = 值” 的方式賦值(不寫 var/let/const),但此時變量會被自動添加到全局對象 window 上,可能導致全局變量污染(覆蓋已有全局變量)。 示例

// 不使用 var 聲明,直接賦值
admin = "why"; 
console.log(admin); // 輸出:why
console.log(window.admin); // 輸出:why(變量被掛載到 window 上)

風險:若其他代碼也定義了 admin 全局變量,會相互覆蓋,引發邏輯錯誤;推薦做法:始終用 var/let/const 聲明變量,避免全局污染。

二、JavaScript 的數據類型

JavaScript 是 “動態類型語言”,核心特點是 “值有類型,變量無固定類型”。理解數據類型是后續處理數據、避免類型轉換錯誤的基礎。

1. 核心概念:值都有類型,變量類型動態
(1)值的類型特性

JavaScript 中所有的值都有明確的類型,例如:

  • "why""廣州" 是「字符串類型」(文本數據);

  • 183.14 是「數字類型」(數值數據);

  • truefalse 是「布爾類型」(邏輯數據)。

(2)變量的動態類型

變量的類型由 “賦值的值” 決定,且可以隨時改變 —— 前一刻存儲字符串,下一刻可改為數字,這就是 “動態類型” 的靈活性。 示例

// 變量 age 初始存儲數字,類型為 number
var age = 18; 
console.log(typeof age); // 輸出:number// 重新賦值為字符串,類型變為 string
age = "18歲"; 
console.log(typeof age); // 輸出:string

對比靜態類型語言:Java、Swift 等靜態類型語言需 “先聲明變量類型,且類型不可變”(如 Java 中 String name = "why"; 后,name 不能再存儲數字),而 JavaScript 無需顯式聲明類型,更靈活但需注意類型一致性。

2. JavaScript 常見的數據類型

JavaScript 共有 8 種基本數據類型,分為「7 種原始類型」(不可再拆分的基礎數據)和「1 種復雜類型」(可組合多個數據的結構),初學者需重點掌握前 6 種核心類型:

類型分類具體類型核心特點示例
原始類型(7 種)number所有數字統一為 number,不區分整數、浮點數;支持正數、負數、0、NaN183.14-5NaN
string文本數據,用單引號(')、雙引號(")或反引號(`)包裹 | `"why"`、`'廣州'`、Hello``
boolean僅兩個值:true(真)、false(假),用于邏輯判斷truefalse
undefined變量聲明未賦值的默認值;或函數無返回值時的返回值var info;infoundefined
null表示 “空值”,通常用于主動清空對象(如 var obj = null; 表示 obj 為空)null
symbolES6 新增,用于創建唯一標識符(后續進階學習)Symbol("id")
bigint用于存儲超大整數(超過 number 最大安全值,后續進階學習)123nBigInt("123")
復雜類型(1 種)object組合多個數據的結構,如數組、對象、函數等(后續重點講解){ name: "why" }[1, 2]
各核心類型詳解
(1)number 類型:統一的數字類型
  • 特點:JavaScript 不區分 “整數” 和 “浮點數”,所有數字都屬于 number 類型;

  • 特殊值:

    • NaN(Not a Number):表示 “非數字”,如 Number("abc") 會返回 NaN

    • Infinity:表示 “無窮大”,如 1 / 0 會返回 Infinity

  • 示例:

    var num1 = 18; // 整數,number 類型
    var num2 = 3.14; // 浮點數,number 類型
    var num3 = NaN; // 非數字,number 類型
    console.log(typeof num1, typeof num2, typeof num3); // 輸出:number number number
  • 與靜態類型對比:Java 中需用 int(整數)、double(浮點數)區分,JavaScript 用 number 統一,更簡潔。

(2)string 類型:文本數據
  • 包裹符號:支持三種引號,效果一致,但需注意 “引號嵌套”(單引號內可嵌套雙引號,反之亦然);

  • 反引號特性:ES6 新增的反引號(```)支持多行字符串變量插值(后續學習),更靈活;

  • 示例:

    var str1 = "Hello"; // 雙引號
    var str2 = 'World'; // 單引號
    var str3 = `Hello 
    World`; // 反引號,支持多行字符串
    console.log(str3); 
    // 輸出:
    // Hello 
    // World
(3)boolean 類型:邏輯真假
  • 取值:僅 true(真)和 false(假)兩個值,無其他可能;

  • 應用場景:用于條件判斷(如 if 語句)、開關狀態(如 “是否登錄”isLogin: true);

  • 示例:

    var isLogin = true; // 已登錄(真)
    var hasMoney = false; // 沒錢(假)
    if (isLogin) {console.log("歡迎登錄"); // 條件為真,執行此代碼
    }
(4)undefined vs null:易混淆的 “空值”

兩者都表示 “無數據”,但語義和使用場景不同,是面試高頻考點:

類型語義常見場景
undefined“未定義”:引擎自動分配1. 變量聲明未賦值;2. 函數參數未傳值;3. 函數無返回值
null“空值”:開發者主動賦值1. 清空對象(如 var obj = null;);2. 表示 “無結果”
  • 示例:

    // undefined 場景:變量聲明未賦值
    var info;
    console.log(info); // 輸出:undefined// null 場景:主動清空變量
    var user = { name: "why" };
    user = null; // 主動將 user 設為空
    console.log(user); // 輸出:null
(5)object 類型:復雜數據結構

object 是唯一的復雜類型,可將多個不同類型的數據 “打包” 存儲,如:

  • 對象({ name: "why", age: 18 }):存儲鍵值對數據;

  • 數組([1, "a", true]):存儲有序列表數據;

  • 函數(function add(a, b) { return a + b }):可執行的代碼塊;

  • 后續會單獨深入講解 object 類型,此處只需了解其 “組合數據” 的核心特性。

3. 類型檢測:typeof 操作符

若想判斷一個值 / 變量的類型,可使用 typeof 操作符(注意:是操作符,不是函數,可加括號也可不加),返回結果為 “類型名稱的字符串”。 示例

console.log(typeof 18); // 輸出:"number"
console.log(typeof "why"); // 輸出:"string"
console.log(typeof true); // 輸出:"boolean"
console.log(typeof undefined); // 輸出:"undefined"
console.log(typeof null); // 輸出:"object"(歷史bug,需特殊記憶)
console.log(typeof { name: "why" }); // 輸出:"object"

注意typeof null 會返回 "object",這是 JavaScript 的歷史設計缺陷,需單獨記憶(實際 null 是原始類型)。

三、知識小結

知識點核心內容考試重點 / 易混淆點難度系數
變量注意事項1. 未聲明直接使用報錯;2. 聲明未賦值默認 undefined;3. 不寫 var 導致全局污染變量作用域(全局 / 局部)與生命周期;undefinednull 的區別??
數據類型概念JavaScript 中所有值都有類型,變量類型隨賦值動態變化動態類型(JavaScript)與靜態類型(Java/Swift)的區別;變量無類型,值有類型???
原始數據類型核心 5 種:Number/String/Boolean/Undefined/Nullundefinednull 的語義差異;typeof null 返回 "object" 的歷史 bug????
動態類型特性變量類型可隨時改變(如從 number 改為 string與 Java/Swift 類型系統的對比;動態類型的靈活性與風險(如類型轉換錯誤)????
類型系統對比JavaScript 無需顯式聲明類型,Java 需顯式聲明,Swift 支持自動推導自動類型推導機制在不同語言中的差異;顯式類型的安全性 vs 動態類型的靈活性????
Number 類型所有數字統一為 number,不區分整數 / 浮點數與 Java 的 int/double 類型對比;NaNInfinity 的特殊含義??
String 類型支持單引號 / 雙引號 / 反引號,反引號可實現多行字符串三種引號的使用場景;反引號與其他引號的功能差異(如多行、插值)??
Boolean 類型true/false 兩個值,用于邏輯判斷Boolean 類型轉換規則(如 0false,非 0true???
復雜數據類型Object 是唯一復雜類型,包含對象、數組、函數等原始類型(值存儲)與引用類型(地址存儲)的區別;object 類型的擴展性?????
類型轉換案例常見場景:字符串與數字互轉(如 Number("18")String(18)

5. JavaScript typeof 操作符詳解:數據類型檢測工具

一、typeof 操作符

1. 操作符的定義:不是函數,是操作符
本質區別

typeof 是 JavaScript 中的一元操作符(僅需一個操作數),而非函數。這意味著使用時不需要加小括號(雖然加括號也能運行,但并非函數調用),直接跟隨空格和要檢測的變量 / 值即可。

語法對比(操作符 vs 函數)
類型語法特點示例核心區別
typeof 操作符無需括號,直接跟操作數typeof infotypeof 18操作符,用于檢測類型
函數(如 alert必須加括號調用alert("hello")console.log(123)函數,用于執行特定功能
正確使用方式
// 正確:typeof 后接空格 + 變量/值(無括號)
var name = "why";
console.log(typeof name); // 輸出:"string"
console.log(typeof 18);   // 輸出:"number"// 不推薦但合法:加括號(本質是將變量/值作為整體,非函數調用)
console.log(typeof(name)); // 輸出:"string"(與 typeof name 效果完全一致)

注意:不要誤解 typeof(name) 為 “函數調用”,括號在此處僅起到 “將表達式作為整體” 的作用,不改變 typeof 是操作符的本質。

2. 松散的類型系統:為什么需要 typeof?
動態類型特性

JavaScript 是 “動態類型語言”,變量的類型會隨賦值動態變化—— 前一刻是字符串,下一刻可能變成數字或對象,無需提前聲明固定類型。

實際案例
var info = "why"; // 初始為 string 類型
console.log(typeof info); // 輸出:"string"info = 18; // 重新賦值為 number 類型
console.log(typeof info); // 輸出:"number"info = true; // 再次賦值為 boolean 類型
console.log(typeof info); // 輸出:"boolean"
類型檢測需求

正因為變量類型可隨時改變,在開發中經常需要明確當前變量的類型(如判斷是否為數字以執行計算、判斷是否為對象以訪問屬性),typeof 就是滿足這一需求的核心工具。

3. 應用案例:typeof 操作符演示
例題 1:基礎類型檢測

需求:定義變量 info,多次修改其值,用 typeof 跟蹤類型變化。

// 1. 初始賦值為字符串
var info = "why";
console.log("當前類型:", typeof info); // 輸出:"當前類型:string"// 2. 重新賦值為數字
info = 18;
console.log("當前類型:", typeof info); // 輸出:"當前類型:number"// 3. 重新賦值為對象
info = { name: "why", age: 18 };
console.log("當前類型:", typeof info); // 輸出:"當前類型:object"// 4. 重新賦值為布爾值
info = false;
console.log("當前類型:", typeof info); // 輸出:"當前類型:boolean"
例題 2:未賦值變量與 undefined 檢測

需求:檢測 “聲明未賦值” 的變量類型,理解 undefined 的特殊性。

// 聲明變量 age,但未賦值
var age;
console.log(typeof age); // 輸出:"undefined"// 直接檢測 undefined 值(undefined 既是值,也是類型)
console.log(typeof undefined); // 輸出:"undefined"

關鍵結論undefined 有雙重含義 ——① 變量聲明未賦值時的默認值;② 一種獨立的數據類型,typeof 檢測時返回 "undefined"

例題 3:null 的特殊檢測結果(歷史遺留問題)

需求:檢測 null 的類型,理解 typeof null 返回 "object" 的原因。

var address = null; // null 表示“空對象引用”
console.log(typeof address); // 輸出:"object"(而非 "null")

原因說明:這是 JavaScript 的歷史遺留 bug—— 早期引擎將 null 設計為 “空對象的占位符”,導致 typeof 檢測時誤判為 object 類型。實際開發中需單獨處理:若要判斷變量是否為 null,需直接用 === null 對比,而非依賴 typeof

// 正確判斷變量是否為 null
var address = null;
if (address === null) {console.log("變量是 null"); // 輸出:"變量是 null"
}
4. typeof 的返回值:7 種固定結果

typeof 檢測任何值 / 變量時,都會返回字符串形式的類型名稱,共 7 種固定結果(涵蓋核心數據類型):

typeof 返回值對應的數據類型 / 場景示例
"undefined"變量聲明未賦值、直接檢測 undefined 值typeof unassignedVartypeof undefined
"boolean"布爾值(true/false)typeof truetypeof false
"string"字符串(單引號 / 雙引號 / 反引號包裹的文本)typeof "why"typeof '123'
"number"數字(整數、浮點數、NaN、Infinity)typeof 18typeof 3.14typeof NaN
"object"對象、數組、null(歷史 bug)、日期等復雜類型typeof {}typeof []typeof null
"function"函數(特殊的 object 子類型)typeof function() {}typeof console.log
"symbol"ES6 新增的 Symbol 類型(唯一標識符)typeof Symbol("id")

注意BigInt 類型(ES2020 新增,用于超大整數)的 typeof 返回 "bigint",屬于進階內容,初學者可后續了解。

5. typeof 的用法:兩種寫法與括號的本質
兩種合法寫法

typeof 有兩種使用形式,效果完全一致:

  1. 無括號寫法typeof 操作數(推薦,更能體現操作符本質);

  2. 有括號寫法typeof(操作數)(括號僅將操作數作為整體,非函數調用)。

示例對比
var num = 100;// 無括號寫法(推薦)
console.log(typeof num); // 輸出:"number"// 有括號寫法(合法,括號不改變操作符本質)
console.log(typeof(num)); // 輸出:"number"// 括號處理復雜表達式(體現括號的“整體作用”)
console.log(typeof(100 + 200)); // 輸出:"number"(先計算 100+200,再檢測類型)
核心理解

無論是否加括號,typeof 始終是操作符,而非函數。括號的作用僅類似于數學中的 “優先級控制”,將括號內的表達式作為一個整體處理,不影響類型檢測結果。

6. typeof 操作符的核心總結
核心功能
  • 快速檢測變量 / 值的當前數據類型,返回字符串形式的類型名稱;

  • 解決動態類型語言中 “類型不固定” 的問題,為條件判斷提供依據(如 “只有是數字時才執行加法”)。

使用場景
  1. 驗證變量是否為預期類型(如判斷是否為數字以避免字符串拼接錯誤);

  2. 檢測變量是否已聲明(typeof 未聲明變量 返回 "undefined",而非報錯,后續講解);

  3. 區分基本類型與復雜類型(如 typeof 返回 "object""function" 時,為復雜類型)。

注意事項
  1. typeof null 返回 "object" 是歷史 bug,需用 === null 單獨判斷 null

  2. typeof 無法區分 “對象”“數組”“日期” 等復雜類型(均返回 "object"),需用其他方法(如 Array.isArray() 檢測數組);

  3. typeof 檢測函數時返回 "function"(而非 "object"),因為函數是特殊的可執行對象。

二、知識小結

知識點核心內容考試重點 / 易混淆點難度系數
typeof 操作符本質用于獲取變量的數據類型,是操作符而非函數,無需通過括號調用1. 使用時無需括號(typeof x 而非 typeof(x) 函數調用);2. 與 alert() 等函數的語法差異??
操作符與函數的區別操作符直接跟操作數(如 typeof x),函數需加括號調用(如 alert(x)區分 typeof x(操作符)和 alert(x)(函數)的語法差異;typeof(x) 不是函數調用??
typeof 的返回值返回 7 種字符串形式的類型名稱:"undefined"/"boolean"/"string"/"number"/"object"/"function"/"symbol"1. typeof null 返回 "object" 是歷史遺留問題;2. 函數返回 "function" 而非 "object"???
動態類型系統與 typeofJavaScript 變量類型可動態變化,需用 typeof 實時檢測當前類型動態類型的靈活性帶來的類型風險;typeof 在類型校驗中的必要性??
括號的特殊用法typeof(x) 中的括號僅將 x 作為整體,不改變 typeof 是操作符的本質誤解 typeof(x) 為函數調用;括號在操作符中的 “優先級控制” 作用???
類型檢測演示案例未賦值變量(返回 "undefined")、字符串 / 數字(返回對應類型)、null(返回 "object"1. 未賦值變量(var x;)與未聲明變量的 typeof 檢測差異;2. null 的特殊處理??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97008.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97008.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97008.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

anaconda本身有一個python環境(base),想用別的環境就是用anaconda命令行往anaconda里創建虛擬環境

差不多是這個意思&#xff0c;但需要稍微澄清一下&#xff1a;Anaconda 可以管理任意版本的 Python你安裝了 Anaconda 后&#xff0c;默認有一個 base 環境自帶的 Python。如果你想用其他版本&#xff0c;比如 Python 3.9、3.10&#xff0c;可以用 conda create -n py39 python…

畢業項目推薦:28-基于yolov8/yolov5/yolo11的電塔危險物品檢測識別系統(Python+卷積神經網絡)

文章目錄 項目介紹大全&#xff08;可點擊查看&#xff0c;不定時更新中&#xff09;概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式…

字庫原理 GB2312-80

這篇文章介紹的是 在嵌入式開發中 常常會遇見的 中文字體點陣字庫&#xff08;如漢字庫&#xff09; 的核心編碼原理&#xff1a;區位碼 偏移計算 內存映射。我們將會介紹 GB2312-80 字庫的工作機制。 &#x1f4d8;什么是 GB2312-80&#xff1f; GB2312-80 是中國國家標準定…

【Golang】 項目啟動方法

Go 項目啟動方法 1. 常見啟動方式 使用 go run 命令 # 運行主程序文件 go run main.go# 運行多個文件 go run *.go# 運行整個模塊&#xff08;Go 1.11&#xff09; go run .# 運行指定包 go run github.com/yourusername/yourproject先構建再執行 # 構建可執行文件 go build# 運…

3459. 最長 V 形對角線段的長度

Problem: 3459. 最長 V 形對角線段的長度 文章目錄思路解題過程復雜度Code思路 深度優先搜索 記憶數組 解題過程 主函數和先遍歷從每一個1開始搜索&#xff0c;并枚舉每一個方向進入dfs&#xff0c;dfs先檢查是否遍歷過&#xff0c;然后枚舉下一個可以走的方向&#xff0c;最后…

Unity 串口通信

可以通過計算機管理->設備管理器&#xff0c;查看端口串口通訊&#xff0c;通常是指的通過計算機或其他設備上的串行端口實現數據傳輸的過程。 定義與特點&#xff1a;串口通訊是按位&#xff08;bit&#xff09;發送和接收字節的通信方式&#xff0c;它將數據一位一位地順序…

ArcGIS JSAPI 高級教程 - 創建漸變色材質的自定義幾何體

ArcGIS JSAPI 高級教程 - 創建漸變色材質的自定義幾何體核心代碼完整代碼在線示例工作中遇到一個比較復雜的功能&#xff0c;其中用到漸變色&#xff0c;于是研究了一下&#xff0c;發現雖然 JS API 不直接支持漸變色&#xff0c;但是也可以自定義創建漸變色&#xff0c;通過 M…

不增加 GPU,首 Token 延遲下降 50%|LLM 服務負載均衡的新實踐

作者&#xff1a;鈺誠 簡介 傳統的負載均衡算法主要設計用于通用的 Web 服務或微服務架構中&#xff0c;其目標是通過最小化響應時間、最大化吞吐量或保持服務器負載平衡來提高系統的整體效率&#xff0c;常見的負載均衡算法有輪詢、隨機、最小請求數、一致性哈希等。然而&am…

《Linux內存管理:實驗驅動的深度探索》【附錄】【實驗環境搭建 7】【使用buildroot方式構建文件系統】

1. 使用Buildroot 構建的優勢 使用 Buildroot 構建 rootfs 的優點在于 快速、簡潔、可裁剪、可重復&#xff0c;特別適合 中小型嵌入式 Linux 項目&#xff08;如車機、路由器、工業控制設備、IoT 網關&#xff09;。它幫助開發者避免繁瑣的手動編譯和集成工作&#xff0c;專注…

一洽客服系統:網頁咨詢入口設置

一洽客服系統提供了靈活的網頁咨詢入口設置&#xff0c;旨在為用戶提供多樣化的咨詢類別選擇&#xff0c;并根據用戶的需求接入指定的路由線路。以下是該功能的詳細說明&#xff1a;一、網頁咨詢入口設置針對用戶的不同業務提供不同的咨詢類別選擇&#xff0c;用戶選擇業務后接…

Apache Flink錯誤處理實戰手冊:2年生產環境調試經驗總結

作者&#xff1a;_Naci Simsek 前言 在流處理領域&#xff0c;Apache Flink 已經成為企業級實時數據處理的首選框架。然而&#xff0c;在生產環境中&#xff0c;開發者和運維人員經常會遇到各種看似神秘的問題。基于過去兩年中大量客戶在真實場景中的使用案例&#xff0c;可以觀…

嵌入式開發學習 C++:day01

C概述 C誕生 1972年前后&#xff0c;計算機先驅丹尼斯里奇開始設計C語言并用它來重寫Unix系統&#xff0c;里奇的這個決定催生了計算機領域最石破天驚的兩門重炮:Unix和C&#xff0c;這兩者都是IT產業中鼻祖級的存在&#xff0c;Unix是現代蘋果系統和Linux系統的最初來源&#…

LeaferJS創建支持縮放、平移的畫布,并繪制簡單圖形

文章目錄介紹原生JS使用LeaferJS的簡單示例原生JS使用LeaferJS并支持縮放平移畫布Vue中使用LeaferJS并支持縮放平移介紹 LeaferJS官網&#xff1a;https://www.leaferjs.com/ 官方快速上手的教程地址&#xff1a;https://www.leaferjs.com/ui/guide/install/ui/start.html 原…

JumpServer 堡壘機部署與 SSH 公鑰接入服務器教程

前言&#xff1a;在企業運維場景中&#xff0c;服務器的安全訪問與操作管控至關重要。JumpServer 作為開源堡壘機的典型代表&#xff0c;憑借集中管控、權限精細分配、操作全鏈路審計等核心能力&#xff0c;成為保障運維安全合規的關鍵工具。 無論是中小企業簡化運維權限管理&a…

TensorFlow 面試題及詳細答案 120道(21-30)-- 模型構建與神經網絡

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 21. TensorFlow中構建神經…

Qt圖片上傳系統的設計與實現:從客戶端到服務器的完整方案

文章目錄系統架構概覽核心組件解析1. ImageUploadWorker&#xff1a;上傳任務的執行者關鍵方法解析2. ImageUploadManager&#xff1a;線程的"指揮官"3. ImageUploader&#xff1a;網絡通信的"信使"4. 服務器端&#xff1a;圖片的"收納箱"關鍵技…

MySQL InnoDB vs MyISAM

MySQL 兩種引擎&#xff08;InnoDB vs MyISAM&#xff09;核心區別事務與鎖機制??特性??InnoDB??MyISAM??事務支持?支持 ACID 事務&#xff08;原子性、一致性、隔離性、持久性&#xff09;&#xff0c;適用于需強數據一致性的場景&#xff08;如金融交易&#xff09;…

軟件定義汽車(SDV)調試——如何做到 適配軟件定義汽車(SDV)?(上)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

windows下 docker desktop 清理ext4.vhdx文件 并縮小ext4.vhdx文件

1、路徑C:\Users\Administrator\AppData\Local\Docker\wsl\dataext4.vhdx 清理之前30多G&#xff0c;現在只有不到2個G2、清理命令# 1、清?清理懸空鏡像和緩存? docker image prune -f # 刪除未被引用的鏡像層 docker builder prune -f # 清理構建緩存# 2、壓縮虛擬磁盤&a…

超越ChatBI!深度解析衡石HENGSHI SENSE 6.0如何實現全流程AI賦能

在數據智能領域風起云涌的2025年&#xff0c;“ChatBI”已成為一個炙手可熱卻又令人疲憊的概念。市場上充斥著各式各樣的問答式BI工具&#xff0c;它們雖然帶來了交互的新穎體驗&#xff0c;卻往往局限于“問答”這一單一環節&#xff0c;無法解決數據從整合到洞察的全鏈路痛點…