JavaScript核心概念一日通:从底层环境到DOM实战的学习笔记
大家好!今天我花了一些时间,集中火力向 AI 助教请教了许多关于 JavaScript 的基础但又极易混淆的问题。从“主机环境”这个宏观概念,到for...in和for...of的细微差别,每一个问题都让我对这门语言的理解加深了一层。为了防止遗忘,也为了能和大家交流,我将今天的学习成果整理成这篇博客。让我们开始吧!从宏观的运行环境,到微观的循环语法,再到实用的 DOM 操作,今天对 JavaScr
摘要: 本文是我在学习 JavaScript 过程中,通过与 AI 助手的问答形式,对一系列核心概念进行梳理和总结的学习记录。内容从 JavaScript 的运行环境(主机环境、浏览器、Node.js)讲起,深入探讨了对象、原型、集合等数据结构,并详细剖析了 JavaScript 与 HTML 交互的核心——DOM 操作。如果你也对这些概念感到困惑,希望这篇笔记能为你点亮一盏灯。
日期: 2025年9月21日
标签:JavaScript,前端,DOM,Node.js,ES6,核心概念
前言
大家好!今天我花了一些时间,集中火力向 AI 助教请教了许多关于 JavaScript 的基础但又极易混淆的问题。从“主机环境”这个宏观概念,到 for...in 和 for...of 的细微差别,每一个问题都让我对这门语言的理解加深了一层。为了防止遗忘,也为了能和大家交流,我将今天的学习成果整理成这篇博客。让我们开始吧!
第一部分:夯实基础 —— JavaScript的运行环境
我们首先要明白,JavaScript 这门语言本身(ECMAScript 标准)只是定义了语法,它需要一个“家”才能运行。这个“家”就是主机环境 (Host Environment)。
- 主机环境: 执行 JS 代码的平台或上下文。它除了提供语言核心能力外,还提供了额外的 API 以便与外界交互。
- Web 浏览器: 最常见的主机环境,运行在客户端。它提供了
window对象、DOM API(如document)来控制网页,让页面动起来。 - Node.js: 让 JS 能在服务器端运行的主机环境。它没有
document,但提供了文件系统(fs)、HTTP服务(http)等后端能力。
一句话总结: 同一种语言(JS),在不同的家(浏览器 vs Node.js),被赋予了不同的超能力(操作网页 vs 操作服务器)。
第二部分:核心基石 —— 深入理解JavaScript对象与数据结构
1. 对象 (Object) 到底是什么?
JS 中万物皆对象!对象是一个容器,装着一系列键值对 (Key-Value Pairs) 的无序集合。
- 属性 (Property): 对象的静态特征,值是普通数据类型,如:
name: "张三"。 - 方法 (Method): 对象的动态行为,值是一个函数,如:
sayHello: function() { ... }。 - 原型 (Prototype): 每个对象都有一个隐藏的链接,指向它的“模板对象”(即原型对象)。当我们试图访问一个对象上不存在的属性或方法时,JS 引擎会去它的原型上查找。
Array.prototype.push就是一个典型的例子,我们创建的任何数组都能使用push方法,正是因为它存在于数组的原型上。
2. 集合 (Set) 是什么?
ES6 引入的新数据结构,它类似于数组,但核心特点是成员唯一,不允许重复。
// Set 的经典应用:数组去重
const duplicateArray = [ "a", "b", "c", "a", "d", "b" ];
const uniqueArray = [...new Set(duplicateArray)];
console.log(uniqueArray); // 输出: [ 'a', 'b', 'c', 'd' ]
Set 提供了 .add(), .has(), .delete(), .size 等简单高效的 API,非常适合需要保证数据唯一性的场景。
第三部分:沟通的桥梁 —— JavaScript与网页的交互 (DOM)
这是今天学习的重点,也是前端开发的精髓所在。
1. “元素 (Element)”是什么?
在 Web 开发的上下文中,“元素”通常指代表 HTML 标签的 JavaScript 对象。浏览器在加载页面时,会把 HTML 代码解析成一个树状的 DOM (文档对象模型),其中的每一个节点(通常是标签),在 JS 中都对应一个可操作的元素对象。
2. 为什么脚本在 <head> 里访问 document.body 是 null?
因为浏览器对 HTML 的解析是自上而下、顺序执行的。
当解析到 <head> 里的脚本时,<body> 标签还没有被浏览器读到,因此 document.body 这个对象还没有被创建,其值为 null。当解析到 <body> 之后,document.body 才能被正常访问。
最佳实践: 通常将
<script>标签放在</body>之前,或使用defer属性,或使用DOMContentLoaded事件来确保所有元素都已加载完毕。
3. document 上的那些“快捷方式”
为了方便我们快速访问页面的核心部分,document 对象上直接提供了一些属性:
document.documentElement: 指向<html>标签,是整个文档的根元素。document.body: 指向<body>标签,包含所有可见内容,最常用。document.head: 指向<head>标签,包含元数据和外部资源链接。
这些快捷方式让我们不必再用 querySelector 去查找这些基础元素。
4. childNodes vs children 的区别
这是一个经典的“坑”!
childNodes: 返回所有类型的子节点,包括元素节点、文本节点(连换行和空格都会被算作文本节点!)、注释节点等。children: 只返回元素节点(即HTML标签),忽略文本和注释。这通常是我们真正想要的。
<body>
<div>Div 1</div>
<div>Div 2</div>
</body>
console.log(document.body.childNodes.length); // 可能是 5 (Text, Div, Text, Comment, Text, Div, Text)
console.log(document.body.children.length); // 绝对是 2 (Div, Div)
所以,当你想遍历一个元素下的所有子标签时,请使用 .children。
第四部分:必备工具 —— 高效遍历与异步操作
1. for...of vs for...in
两者名字相似,但用途天差地别。
| 特性 | for...of (推荐) |
for...in (慎用) |
|---|---|---|
| 遍历内容 | 值 (value) | 键 (key),是字符串 |
| 适用对象 | 数组、字符串、Set、Map 等可迭代对象 | 普通对象 (Object) |
| 数组遍历 | ✅ 强烈推荐 | ❌ 强烈不推荐 |
决策规则: 遍历数组或类数组,用
for...of。遍历普通对象的键,可以用for...in,但更推荐使用Object.keys()搭配for...of。
2. setTimeout 与异步初探
setTimeout(() => console.log("Hello"), 1000); 这行代码是什么语法?
setTimeout(callback, delay): 一个 Web API,它安排一个任务(回调函数callback)在指定的延迟(delay毫秒)后执行。() => ...: ES6 的箭头函数,是function() { ... }的简洁写法。- 核心思想: 这是一种异步操作。代码执行到这里,会立即设置一个定时器然后继续向下执行,而不会“等待”1秒。1秒后,定时器到期,回调函数才会被放入任务队列等待执行。
总结
从宏观的运行环境,到微观的循环语法,再到实用的 DOM 操作,今天对 JavaScript 的认知又清晰了许多。最深的感悟是,很多看似复杂的行为,背后都有着简单直观的原理,比如浏览器的顺序解析机制就解释了 document.body 为 null 和 childNodes 包含文本节点等多个问题。
学习之路,道阻且长,但行则将至。希望这篇笔记对你也有所启发!如果文中有任何错误,欢迎在评论区指正交流!
更多推荐


所有评论(0)