接續上文:《前端小白進階 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 文檔、團隊協作 / 開源項目 |
通用注意事項:
-
注釋需簡潔準確,避免冗余(如 “定義變量 a” 這類無意義注釋);
-
代碼更新時,需同步更新對應注釋,防止 “注釋與代碼不一致”;
-
所有注釋均不支持嵌套,尤其是多行注釋和文檔注釋,嵌套會導致語法錯誤。
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. 變量的命名格式
變量的基本組成
每個變量都包含兩部分,缺一不可:
-
變量名:相當于 “盒子的標簽”,用于在程序中定位和調用變量(如
heroHp
、cartCount
); -
變量值:相當于 “盒子里的內容”,即變量存儲的具體數據(如 1300、5、"未讀消息")。
命名核心規則(基礎規范)
變量命名需遵守 JavaScript 的語法限制,否則會導致代碼報錯,核心規則如下:
-
字符組成:只能由字母(A-Z/a-z)、數字(0-9)、下劃線(_)、美元符號($)組成,且不能以數字開頭(如
123name
是錯誤的,name123
是正確的); -
關鍵字禁用:不能使用 JavaScript 的保留關鍵字(如
let
、var
、function
、if
等)作為變量名(如let let = 10
會報錯); -
大小寫敏感:變量名區分大小寫,
username
和UserName
是兩個不同的變量(如let username = "張三"; let UserName = "李四";
兩者互不影響); -
命名風格:推薦使用 “駝峰命名法”(首字母小寫,后續單詞首字母大寫),符合前端開發通用規范(如
shoppingCartTotal
、userAvatarUrl
,而非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. 變量的命名格式
組成部分
變量包含兩個核心部分:
-
變量名稱:用于標識變量的標識符(如
hp
、time
) -
變量值:變量存儲的具體數據(如
100
、"16:00"
)
在實際開發中,游戲中的 "血量"、"時間"、"技能冷卻" 等動態變化的概念,都需要通過變量來存儲和管理。
注意:變量名不建議使用中文命名,這與 HTML 中 class
的命名規范一致,主要是為了避免編碼問題和跨平臺兼容性問題。
1)變量的定義
-
核心概念:變量是用于存儲數據的容器,在 JavaScript 中需要明確告知引擎要定義變量(不能直接使用未定義的變量)。
-
定義步驟:
-
變量聲明:告訴引擎 "我要創建一個變量"
-
變量賦值:給創建的變量存入具體數據
-
-
應用場景:存儲游戲狀態(如角色血量、剩余時間)、用戶信息(如用戶名、年齡)、表單數據等所有需要動態變化的數據。
2)變量的聲明
-
聲明方式:使用
var
關鍵字(variable
的縮寫)進行聲明 -
語法格式:
var 變量名
,例如var currentTime;
-
引擎通信:
var
關鍵字是與 JavaScript 引擎溝通的橋梁,表示 "我要定義一個變量" -
其他聲明:ES6 新增了
let
和const
聲明方式,功能更完善,但初學階段可先掌握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 嚴格區分大小寫,
name
和Name
是兩個完全不同的變量:var name = "張三"; var Name = "李四"; console.log(name); // 輸出:張三 console.log(Name); // 輸出:李四
-
關鍵字限制:不能使用 JavaScript 關鍵字和保留字作為變量名:
-
關鍵字:對 JavaScript 引擎有特殊含義的單詞,如
var
、function
、if
、else
、class
等 -
保留字:目前無特殊含義但未來可能成為關鍵字的單詞,如
interface
、enum
、protected
等 -
示例:
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 新增 let 和 const | var /let /const 在作用域和修改限制上的差異 | ??? |
變量賦值 | 通過等號 (= ) 進行賦值,支持聲明時賦值和后續賦值 | 連續賦值(var a = b = 10 )與分開賦值的區別 | ?? |
多變量聲明 | 可用逗號分隔同時聲明多個變量,但不推薦 | 多變量聲明導致的代碼可讀性問題 | ?? |
變量命名規則 | 首字符必須為字母 /_ /$ ,不能以數字開頭 | 數字開頭的變量名會直接報錯 | ??? |
關鍵字限制 | 不能使用關鍵字 / 保留字作為變量名 | 區分關鍵字(如 function )與普通標識符(如 func ) | ???? |
大小寫敏感 | Name 和 name 是不同的變量 | 因大小寫錯誤導致的變量未定義問題 | ??? |
駝峰命名法 | 推薦小駝峰 (camelCase ) 命名多單詞變量 | 大駝峰(CamelCase )與小駝峰的區別 | ?? |
代碼格式規范 | 等號兩邊加空格,語句結束加分號 | 分號使用的最佳實踐(何時必須加,何時可省略) | ? |
見名知意原則 | 變量名應準確反映存儲內容 | 分析錯誤命名(如用 a 、b 代替有意義的名稱)的弊端 | ?? |
變量值打印 | 使用 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"
、"廣州"
是「字符串類型」(文本數據); -
18
、3.14
是「數字類型」(數值數據); -
true
、false
是「布爾類型」(邏輯數據)。
(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、NaN | 18 、3.14 、-5 、NaN |
string | 文本數據,用單引號(' )、雙引號(" )或反引號(`)包裹 | `"why"`、`'廣州'`、 Hello`` | ||
boolean | 僅兩個值:true (真)、false (假),用于邏輯判斷 | true 、false | |
undefined | 變量聲明未賦值的默認值;或函數無返回值時的返回值 | var info; (info 為 undefined ) | |
null | 表示 “空值”,通常用于主動清空對象(如 var obj = null; 表示 obj 為空) | null | |
symbol | ES6 新增,用于創建唯一標識符(后續進階學習) | Symbol("id") | |
bigint | 用于存儲超大整數(超過 number 最大安全值,后續進階學習) | 123n 、BigInt("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 導致全局污染 | 變量作用域(全局 / 局部)與生命周期;undefined 與 null 的區別 | ?? |
數據類型概念 | JavaScript 中所有值都有類型,變量類型隨賦值動態變化 | 動態類型(JavaScript)與靜態類型(Java/Swift)的區別;變量無類型,值有類型 | ??? |
原始數據類型 | 核心 5 種:Number /String /Boolean /Undefined /Null | undefined 與 null 的語義差異;typeof null 返回 "object" 的歷史 bug | ???? |
動態類型特性 | 變量類型可隨時改變(如從 number 改為 string ) | 與 Java/Swift 類型系統的對比;動態類型的靈活性與風險(如類型轉換錯誤) | ???? |
類型系統對比 | JavaScript 無需顯式聲明類型,Java 需顯式聲明,Swift 支持自動推導 | 自動類型推導機制在不同語言中的差異;顯式類型的安全性 vs 動態類型的靈活性 | ???? |
Number 類型 | 所有數字統一為 number ,不區分整數 / 浮點數 | 與 Java 的 int /double 類型對比;NaN 和 Infinity 的特殊含義 | ?? |
String 類型 | 支持單引號 / 雙引號 / 反引號,反引號可實現多行字符串 | 三種引號的使用場景;反引號與其他引號的功能差異(如多行、插值) | ?? |
Boolean 類型 | 僅 true /false 兩個值,用于邏輯判斷 | Boolean 類型轉換規則(如 0 轉 false ,非 0 轉 true ) | ??? |
復雜數據類型 | Object 是唯一復雜類型,包含對象、數組、函數等 | 原始類型(值存儲)與引用類型(地址存儲)的區別;object 類型的擴展性 | ????? |
類型轉換案例 | 常見場景:字符串與數字互轉(如 Number("18") 、String(18) ) |
5. JavaScript typeof 操作符詳解:數據類型檢測工具
一、typeof 操作符
1. 操作符的定義:不是函數,是操作符
本質區別
typeof
是 JavaScript 中的一元操作符(僅需一個操作數),而非函數。這意味著使用時不需要加小括號(雖然加括號也能運行,但并非函數調用),直接跟隨空格和要檢測的變量 / 值即可。
語法對比(操作符 vs 函數)
類型 | 語法特點 | 示例 | 核心區別 |
---|---|---|---|
typeof 操作符 | 無需括號,直接跟操作數 | typeof info 、typeof 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 unassignedVar 、typeof undefined |
"boolean" | 布爾值(true/false) | typeof true 、typeof false |
"string" | 字符串(單引號 / 雙引號 / 反引號包裹的文本) | typeof "why" 、typeof '123' |
"number" | 數字(整數、浮點數、NaN、Infinity) | typeof 18 、typeof 3.14 、typeof 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
有兩種使用形式,效果完全一致:
-
無括號寫法:
typeof 操作數
(推薦,更能體現操作符本質); -
有括號寫法:
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 操作符的核心總結
核心功能
-
快速檢測變量 / 值的當前數據類型,返回字符串形式的類型名稱;
-
解決動態類型語言中 “類型不固定” 的問題,為條件判斷提供依據(如 “只有是數字時才執行加法”)。
使用場景
-
驗證變量是否為預期類型(如判斷是否為數字以避免字符串拼接錯誤);
-
檢測變量是否已聲明(
typeof 未聲明變量
返回"undefined"
,而非報錯,后續講解); -
區分基本類型與復雜類型(如
typeof
返回"object"
或"function"
時,為復雜類型)。
注意事項
-
typeof null
返回"object"
是歷史 bug,需用=== null
單獨判斷null
; -
typeof
無法區分 “對象”“數組”“日期” 等復雜類型(均返回"object"
),需用其他方法(如Array.isArray()
檢測數組); -
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" | ??? |
動態類型系統與 typeof | JavaScript 變量類型可動態變化,需用 typeof 實時檢測當前類型 | 動態類型的靈活性帶來的類型風險;typeof 在類型校驗中的必要性 | ?? |
括號的特殊用法 | typeof(x) 中的括號僅將 x 作為整體,不改變 typeof 是操作符的本質 | 誤解 typeof(x) 為函數調用;括號在操作符中的 “優先級控制” 作用 | ??? |
類型檢測演示案例 | 未賦值變量(返回 "undefined" )、字符串 / 數字(返回對應類型)、null(返回 "object" ) | 1. 未賦值變量(var x; )與未聲明變量的 typeof 檢測差異;2. null 的特殊處理 | ?? |