JavaScript 核心基礎:類型檢測、DOM 操作與事件處理

JavaScript 作為松散類型語言,掌握類型檢測規則、DOM 元素獲取方式及事件處理邏輯,是寫出健壯代碼的基礎。本文系統梳理 JS 高頻基礎知識點,結合實戰場景解析原理與用法,幫你建立清晰的知識框架。

一、JS 數據類型與類型檢測(typeof 運算符)

1. 數據類型分類

JS 共 6 種數據類型,分為“基本類型”和“引用類型”,面試回答需準確區分:

  • 5 種基本數據類型:Number(數字)、String(字符串)、Boolean(布爾)、Undefined(未定義)、Null(空值)
  • 1 種引用類型:Object(對象,包含 Array 數組、Function 函數、Date 日期等)

2. typeof 運算符:檢測類型的核心工具

typeof 是檢測變量類型的常用運算符,返回值是表示類型的字符串(共 6 種可能),需牢記其檢測規則與特殊情況:

變量定義typeof 檢測結果關鍵說明
var x = 1;“number”所有數字(整數、浮點數)均返回 “number”
var str = "abc";“string”字符串字面量或 new String() 均返回 “string”
var isTrue = true;“boolean”布爾值 true/false 均返回 “boolean”
var a;(未賦值)“undefined”變量聲明未賦值,或直接使用 undefined,均返回 “undefined”
var b = null;“object”特殊情況:null 是“空對象引用”,typeof 檢測返回 “object”
var obj = new Object();“object”所有對象(含數組、普通對象)均返回 “object”
var arr = [1,2,3];“object”數組本質是 Object 子類,typeof 檢測仍返回 “object”
var fn = function(){};“function”特殊情況:函數雖屬于引用類型,但 typeof 單獨返回 “function”(可理解為 Object 的特殊子類型)

關鍵記憶點

  • 變量未賦值時,typeof 必返回 “undefined”;
  • 只要是對象(含數組、null),typeof 基本返回 “object”,唯一例外是函數返回 “function”。

二、遍歷方式:數組與對象的 2 種核心遍歷

JS 中遍歷主要依賴 for 循環和 for...in(常稱“forEach 式遍歷”),需根據遍歷目標選擇對應方式:

1. for 循環:適合數組遍歷

核心場景:遍歷數組(需通過索引訪問元素),或需要精確控制遍歷順序、終止條件的場景。
語法示例

var arr = [1, 2, 3];
// i 為索引,從 0 開始,小于數組長度(避免越界)
for (var i = 0; i < arr.length; i++) {console.log(arr[i]); // 依次打印:1、2、3
}

2. for…in 循環:適合對象遍歷

核心場景:遍歷對象的屬性(獲取屬性名與屬性值),也可用于數組(但不推薦,因可能遍歷到原型鏈屬性)。
語法示例

var obj = { name: "張三", age: 20 };
// key 為對象的屬性名(字符串類型)
for (var key in obj) {console.log(key + ": " + obj[key]); // 依次打印:name: 張三、age: 20
}

關鍵區別

遍歷方式適用目標訪問方式注意事項
for 循環數組數組[索引]需控制索引范圍,避免越界
for…in對象對象[屬性名]遍歷對象時,需注意過濾原型鏈屬性(可用 obj.hasOwnProperty(key)

三、DOM 操作:元素獲取與屬性設置

DOM(文檔對象模型)是 JS 操作 HTML 的橋梁,核心是“獲取元素”與“操作元素”,需熟練掌握選擇器與屬性設置規則。

1. 元素獲取:querySelector/querySelectorAll 萬能方案

這兩個方法是現代 JS 推薦的元素獲取方式,可替代 ID 選擇器、類選擇器、標簽選擇器等所有傳統方式,語法靈活:

選擇器語法作用示例返回結果
#id獲取指定 ID 的元素document.querySelector("#btn")單個元素(若有多個相同 ID,只返回第一個)
.class獲取指定類名的所有元素document.querySelectorAll(".box")元素集合(類數組,需遍歷訪問)
標簽名獲取指定標簽的所有元素document.querySelectorAll("div")元素集合(類似標簽選擇器)
[name="xxx"]獲取指定 name 屬性的元素document.querySelectorAll('[name="sex"]')元素集合(常用于單選框、復選框)

實戰示例

// 1. 獲取 ID 為 "btn" 的按鈕(單個元素)
var btn = document.querySelector("#btn");// 2. 獲取類名為 "box" 的所有元素(集合,需遍歷)
var boxes = document.querySelectorAll(".box");
for (var i = 0; i < boxes.length; i++) {console.log(boxes[i].innerHTML); // 打印每個 .box 元素的內容
}// 3. 獲取 name 為 "sex" 的單選框(常用于表單)
var radios = document.querySelectorAll('[name="sex"]');
for (var i = 0; i < radios.length; i++) {if (radios[i].checked) { // checked 為 true 表示選中console.log("選中的性別:" + radios[i].value);}
}

2. 元素屬性設置:核心屬性與注意事項

操作元素屬性時,需注意 JS 關鍵字與 HTML 屬性的對應關系:

HTML 屬性JS 中對應寫法作用示例
classclassName設置元素的類名(因 class 是 JS 關鍵字,需用 className 替代)box.className = "active";
innerHTMLinnerHTML設置/獲取元素的 HTML 內容(含標簽)div.innerHTML = "<p>新內容</p>";
valuevalue設置/獲取表單元素(輸入框、單選框等)的值input.value = "默認值";
checkedchecked設置/判斷單選框、復選框是否選中radio.checked = true;(設為選中)

關鍵提醒:盡量避免“DOM 嵌入”(即直接在 HTML 標簽中寫 onclick="xxx()"),這種方式會導致 HTML 與 JS 緊密耦合,不利于維護。

四、事件處理:綁定方式與事件冒泡

事件處理是交互邏輯的核心,需掌握不同綁定方式的區別,以及事件冒泡的原理與控制。

1. 事件綁定的 2 種方式:覆蓋 vs 多播

方式 1:onclick 直接綁定(會覆蓋)

特點:同一元素多次綁定同一事件,后綁定的會覆蓋前綁定的,最終只有最后一個事件生效。
示例

var btn = document.querySelector("#btn");
// 第一個事件:被覆蓋,不生效
btn.onclick = function() {alert("第一個點擊事件");
};
// 第二個事件:覆蓋第一個,最終生效
btn.onclick = function() {alert("第二個點擊事件");
};
方式 2:addEventListener 綁定(多播,不覆蓋)

特點:同一元素多次綁定同一事件,所有事件按綁定順序依次執行,不會覆蓋(稱為“多播事件委托”)。
示例

var btn = document.querySelector("#btn");
// 第一個事件:正常執行
btn.addEventListener("click", function() {alert("第一個點擊事件");
});
// 第二個事件:在第一個之后執行
btn.addEventListener("click", function() {alert("第二個點擊事件");
});

2. 事件冒泡:從子元素到父元素的事件傳播

原理

當元素觸發事件(如點擊)時,事件會從“最內層子元素”向“最外層父元素”逐級傳播,這一過程稱為“事件冒泡”。
示例場景:div 包裹 form,form 包裹按鈕,三者均綁定點擊事件:

<div id="parent"><form id="child"><button id="btn">點擊</button></form>
</div><script>
window.onload = function() {// 按鈕點擊事件(最內層)document.querySelector("#btn").addEventListener("click", function() {alert("按鈕事件");});// form 點擊事件(中間層)document.querySelector("#child").addEventListener("click", function() {alert("form 事件");});// div 點擊事件(最外層)document.querySelector("#parent").addEventListener("click", function() {alert("div 事件");});
};
</script>

執行順序:點擊按鈕后,依次彈出“按鈕事件”→“form 事件”→“div 事件”(從內到外傳播)。

阻止事件冒泡

若需避免父元素事件觸發,可通過事件對象的 stopPropagation() 方法阻止冒泡:

document.querySelector("#btn").addEventListener("click", function(e) {alert("按鈕事件");e.stopPropagation(); // 阻止事件向上傳播,父元素事件不再執行
});

五、JSON 轉換:字符串與 JS 對象的互轉

JSON 是前后端數據交互的常用格式,需掌握“字符串轉對象”和“對象轉字符串”的核心方法:

1. 字符串轉 JS 對象(解析)

將 JSON 格式的字符串(值類型)轉為 JS 對象(引用類型),才能訪問其屬性(如 pwdact),有 2 種常用方法:

方法語法說明
JSON.parse()JSON.parse(jsonStr)推薦方法,安全且高效,專門用于解析 JSON 字符串
eval()eval('(' + jsonStr + ')')不推薦,eval 會執行字符串中的任意代碼,有安全風險

示例

// JSON 格式的字符串(值類型,無法直接訪問屬性)
var jsonStr = '{"act":"admin","pwd":"123456"}';// 1. JSON.parse() 解析(推薦)
var obj1 = JSON.parse(jsonStr);
console.log(obj1.act); // 打印:admin(可正常訪問屬性)// 2. eval() 解析(不推薦)
var obj2 = eval('(' + jsonStr + ')');
console.log(obj2.pwd); // 打印:123456

2. JS 對象轉字符串(序列化)

將 JS 對象(引用類型)轉為 JSON 字符串(值類型),用于數據傳輸(如接口請求),使用 JSON.stringify() 方法:

// JS 對象(引用類型)
var user = { name: "張三", age: 20 };// 轉為 JSON 字符串
var jsonStr = JSON.stringify(user);
console.log(jsonStr); // 打印:{"name":"張三","age":20}(字符串類型)

六、核心注意事項:避免踩坑的關鍵規則

  1. JS 代碼需寫在 window.onload 中:確保 HTML 元素加載完成后再執行 JS,避免因元素未存在導致的報錯;
  2. typeof 檢測 null 為 object:這是 JS 設計遺留問題,需特殊記憶,判斷 null 應直接用 變量 === null
  3. for…in 遍歷對象需過濾原型屬性:若不想遍歷對象原型鏈上的屬性,需加判斷 if (obj.hasOwnProperty(key))
  4. 事件綁定優先用 addEventListener:避免 onclick 綁定的覆蓋問題,且支持事件捕獲/冒泡的控制。

掌握以上知識點,可應對 JS 基礎開發與面試中的大部分場景。建議結合實戰代碼手動練習,尤其是 DOM 操作與事件處理,通過“寫代碼→調試→優化”的流程強化理解,避免只記理論不落地。

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

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

相關文章

軟件開發過程中的維護活動

軟件開發過程中的維護活動軟件維護是軟件生命周期中持續時間最長、成本最高的階段&#xff0c;它并非簡單的“修理”&#xff0c;而是一系列旨在延長軟件生命周期、保持其價值和適應性的工程化活動。研究表明&#xff0c;軟件維護成本可占總成本的60%以上。理解并有效管理維護活…

STC8單片機驅動I2C屏幕:實現時間、日期與溫濕度顯示

STC8 單片機驅動 I2C 屏幕&#xff1a;實現時間、日期與溫濕度顯示 在單片機項目中&#xff0c;“數據可視化” 是核心需求之一 —— 將時間、溫濕度等關鍵信息實時顯示在屏幕上&#xff0c;能讓項目更具實用性。本文以STC8 系列單片機為核心&#xff0c;搭配 I2C 接口的 OLED…

基于SpringBoot+Vue的智能消費記賬系統(AI問答、WebSocket即時通訊、Echarts圖形化分析)

&#x1f388;系統亮點&#xff1a;AI問答、WebSocket即時通訊、Echarts圖形化分析&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17前端&#xff1a; 技術…

[論文筆記] WiscKey: Separating Keys from Values in SSD-Conscious Storage

閱讀 WiscKey 論文時隨手記錄一些筆記。 這篇論文的核心思想理解起來還是很簡單的&#xff0c;但是具體涉及到實現還有一些想不明白的地方&#xff0c;后來看到 TiKV 的 Titan 實現也很有趣&#xff0c;索性把這些問題都記錄下來并拋出來。 本文中和論文相關的內容&#xff0…

week1-[循環嵌套]畫正方形

week1-[循環嵌套]畫正方形 題目描述 輸入一個正整數 nnn&#xff0c;請使用數字 000 到 999 拼成一個這樣的正方形圖案&#xff08;參考樣例輸入輸出&#xff09;&#xff1a;由上至下、由左至右依次由數字 000 到 999 填充。每次使用數字 999 填充后&#xff0c;將從頭使用數字…

在 Vue2 中使用 pdf.js + pdf-lib 實現 PDF 預覽、手寫簽名、文字批注與高保真導出

本文演示如何在前端&#xff08;Vue.js&#xff09;中結合 pdf.js、pdf-lib 與 Canvas 技術實現 PDF 預覽、圖片簽名、手寫批注、文字標注&#xff0c;并導出高保真 PDF。 先上demo截圖&#xff0c;后續會附上代碼倉庫地址&#xff08;目前還有部分問題暫未進行優化&#xff0…

tomcat 定時重啟

tomcat 定時重啟 定時重啟的目的是:修復內存泄漏等問題,tomcat 長時間未重啟,導致頁面卡頓,卡死,無法訪問,影響用戶訪問 1.編寫腳本 su - tomcat [tomcat@u1abomap02 ~]$ ls restart_tomcat_gosi.sh tomcat_gosi.log vi restart_tomcat_gosi.sh #!/bin/bash# 定義日志目…

WinForm 簡單用戶登錄記錄器實現教程

目錄 功能概述 實現思路 一、程序入口&#xff08;Program.cs&#xff09; 二、登錄用戶控件&#xff08;Login.cs&#xff09; 2.1 控件初始化與密碼顯示邏輯 2.2 登錄控件設計器&#xff08;Login.Designer.cs&#xff09; 三、主窗體&#xff08;Form1.cs&#xff09…

docker 安裝 使用

Docker安裝 一鍵安裝命令 sudo curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun啟動docker sudo service docker startpull鏡像加速配置 sudo vi /etc/docker/daemon.json輸入下列內容&#xff0c;最后按ESC&#xff0c;輸入 :wq! 保存退出。 {"regis…

無人機探測器技術解析

一、工作模式 無人機探測器通過多模式協同實現全流程防御閉環&#xff1a; 1. 主動掃描模式 雷達主動探測&#xff1a;發射電磁波&#xff08;如Ka/Ku波段&#xff09;&#xff0c;通過回波時差與多普勒頻移計算目標距離、速度及航向&#xff0c;適用于廣域掃描&#xff08;…

Linux學習-軟件編程(進程與線程)

進程回收wait原型&#xff1a;pid_t wait(int *wstatus); 功能&#xff1a;回收子進程空間 參數&#xff1a;wstatus&#xff1a;存放子進程結束狀態空間的首地址 返回值&#xff1a;成功返回回收到的子進程的PID失敗返回-1WIFEXITED(wstatus)&#xff1a;測試進程是否正常結束…

大模型微調分布式訓練-大模型壓縮訓練(知識蒸餾)-大模型推理部署(分布式推理與量化部署)-大模型評估測試(OpenCompass)

大模型微調分布式訓練 LLama Factory與Xtuner分布式微調大模型 大模型分布式微調訓練的基本概念 為什么需要分布式訓練&#xff1f; 模型規模爆炸&#xff1a;現代大模型&#xff08;如GPT-3、LLaMA等&#xff09;參數量達千億級別&#xff0c;單卡GPU無法存儲完整模型。 …

物聯網、大數據與云計算持續發展,樓宇自控系統應用日益廣泛

在深圳某智慧園區的控制中心&#xff0c;管理人員通過云端平臺實時監控著5公里外園區內每臺空調的運行參數、每盞路燈的開關狀態和每個區域的能耗數據。當系統檢測到某棟樓宇的電梯運行振動異常時&#xff0c;大數據算法自動預判可能的故障點并推送維修建議&#xff1b;物聯網傳…

在實驗室連接地下車庫工控機及其數據采集設備

在實驗室連接地下車庫工控機及其數據采集設備 我們小組為項目的數據采集組&#xff0c;目前在車頂集成了一個工控機、兩個激光雷達、兩個攝像頭、一個戶外電源 由于地下車庫蚊子太多了&#xff0c;我們可受不了這個苦&#xff0c;所以想坐在實驗室吹著空調就能連接工控機來修改…

icmpsh、PingTunnel--安裝、使用

用途限制聲明&#xff0c;本文僅用于網絡安全技術研究、教育與知識分享。文中涉及的滲透測試方法與工具&#xff0c;嚴禁用于未經授權的網絡攻擊、數據竊取或任何違法活動。任何因不當使用本文內容導致的法律后果&#xff0c;作者及發布平臺不承擔任何責任。滲透測試涉及復雜技…

系統思考:情緒內耗與思維模式

我們正在努力解決的問題&#xff0c;很多時候&#xff0c;根源就在我們自己。 在日常的工作和生活中&#xff0c;我們常常感到焦慮、內耗和失控。這些情緒和狀態&#xff0c;似乎總是在不斷循環。但如果停下來仔細思考&#xff0c;會發現&#xff0c;問題的背后&#xff0c;并不…

詳解grafana k6 中stage的核心概念與作用

在Grafana k6中&#xff0c;??Stage&#xff08;階段&#xff09;?? 是負載測試腳本的核心配置概念&#xff0c;用于動態控制虛擬用戶&#xff08;VUs&#xff09;的數量隨時間的變化。通過定義多個階段&#xff0c;用戶可以模擬真實場景中的流量波動&#xff08;如用戶逐步…

JS 和 JSX 的區別

JS 和 JSX 是兩種不同的概念&#xff0c;盡管它們都與 JavaScript 密切相關&#xff0c;尤其是在 React 開發中。以下是它們的主要區別&#xff1a;1. 定義JS (JavaScript): 一種通用的編程語言&#xff0c;用于開發動態網頁、服務器端應用程序等。它是標準的 ECMAScript 語言。…

Linux軟件編程-進程(2)及線程(1)

1.進程回收資源空間&#xff08;1&#xff09;wait函數頭文件&#xff1a;#include <sys/types.h>#include <sys/wait.h>函數接口&#xff1a;pid_t wait(int *wstatus);功能&#xff1a;阻塞等待回收子進程的資源空間參數&#xff1a;wstatus &#xff1a;保存子進…

java 集合 之 集合工具類Collections

前言早期開發者經常需要對集合進行各種操作比如排序、查找最大最小值等等但是當時沒有統一的工具類來處理所以導致代碼重復且容易出錯java.util.Collections 工具類的引入為開發者提供了大量 靜態方法 來操作集合它就像一個經驗豐富的助手和數組工具類 Arrays 一樣避免了我們重…