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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 一样避免了我们重…