JavaScript 从零开始学习完整教程(小白友好版)
这篇文章写给完全没写过代码的人。你不用懂任何编程概念,只要会打字、会用浏览器,就能跟着一步步学会 JavaScript。每个概念都会讲”是什么、为什么、怎么用”,并配上可以直接运行的例子。
一、JavaScript 是什么?为什么要学?
JavaScript(简称 JS)是一种编程语言,它的主要工作是让网页”活”起来。
- 没有 JS 的网页:像一张打印好的报纸,只能看,不能动。
- 有了 JS 的网页:像手机 App,可以点击、弹窗、翻页、验证表单、播放动画。
现在全世界几乎每个网站都用到了 JavaScript。学会了它,你就掌握了网页交互的核心能力,这也是前端开发(网页开发)的必修第一课。
和 Java 有关系吗? 没有。JavaScript 和 Java 是两个完全不同的语言,只是名字有点像,别被误导。
JS 能做什么?
- 给网页加交互:点击按钮弹窗、下拉菜单、图片轮播
- 处理数据:计算、筛选、排序
- 和服务器通信:登录、发评论、加载新内容
- 写小程序、小游戏、App(用一些框架)
二、准备工作:只需要一个浏览器和一个编辑器
学 JS 起步不需要安装任何复杂软件。你只需要:
- 一个浏览器:Chrome、Edge、Firefox 都行,推荐 Chrome。
- 一个文本编辑器:新手推荐 VSCode(免费),也可以用系统自带的记事本。
先做个热身——打开开发者工具:
- 打开 Chrome 浏览器
- 随便打开一个网页(比如百度)
- 按键盘上的 F12 键(笔记本可能要按 Fn+F12)
- 在弹出的面板里,点上方选项卡中的 Console(控制台)
控制台就是”让你和 JS 对话的地方”。你在里面写的 JS 代码,回车后立刻执行。
在控制台里打出第一行代码: 在 Console 里输入下面这行,然后按回车:
console.log("你好,世界!");你会看到控制台输出了 你好,世界!。恭喜!你已经运行了人生第一行 JavaScript 代码。
console.log() 的作用:把括号里的内容打印到控制台。它是 JS 学习阶段最常用的调试工具,相当于”跟电脑说:把这个东西显示出来给我看”。
三、怎么在网页里写 JS?三种方式
方式一:直接在控制台写(适合练习)
就像刚才那样,打开 Console 直接输入代码,回车运行。适合随手测试。
方式二:写在 HTML 文件的 script 标签里(最常见)
用记事本新建一个文件,保存为 index.html,内容如下:
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>我的第一个页面</title></head><body> <h1>我的第一个页面</h1> <script> console.log("这段文字会打印到控制台"); alert("这段文字会弹出窗口"); </script></body></html>用浏览器打开这个文件,你会看到:控制台打印了一句话,并且弹出了一个窗口。alert() 的作用是弹出一个提示框,是让新手最快看到”代码生效”的方式。
方式三:写在外部的 .js 文件里(正式项目做法)
把 JS 代码单独保存成 script.js 文件,然后在 HTML 里引入:
<script src="script.js"></script>这样 HTML 和 JS 分离,项目越大越清晰。正式开发都用这种方式。
四、变量:给数据起个名字
程序就是”处理数据”。为了处理数据,我们需要把数据存起来,并给它起个名字——这就是变量。
声明变量的两种方式:
// let:可以变化的量(常用)let age = 18;
// const:不可以变化的量(常量,常用)const name = "小明";怎么理解? 你可以把变量想象成一个带标签的盒子:
let age = 18;就是”拿一个盒子,贴上 age 标签,把 18 放进去”- 之后想用这个数字,直接说 age 就行
规则:
- 变量名只能包含字母、数字、下划线
_、美元符$,且不能以数字开头 - 不能是 JS 保留字(如 let、const、if、for 等)
- 区分大小写:
age和Age是两个不同变量 - 命名习惯:多个单词用小驼峰,如
myName、totalPrice
完整示例:
let age = 18; // 声明变量并赋值age = 19; // 修改值:let 允许重新赋值console.log(age); // 输出 19
const birthday = "2026-01-01";// birthday = "2027-01-01"; // 这行会报错!const 不能再赋值console.log(birthday); // 输出 2026-01-01什么时候用 let,什么时候用 const? 新手记住一条:默认用 const,确定要改的才用 let。这样代码更安全、意图更清楚。
五、数据类型:JS 世界里有什么”东西”?
JS 里常见的数据类型有这些:
| 类型 | 中文 | 例子 | 说明 |
|---|---|---|---|
| number | 数字 | 18、3.14 | 整数和小数都属于 number |
| string | 字符串 | "你好"、'hello' | 文字,用单引号或双引号包起来 |
| boolean | 布尔 | true、false | 只有真/假两个值 |
| null | 空 | null | 表示”故意什么都没有” |
| undefined | 未定义 | 不赋值时的默认值 | 表示”还没有值” |
| array | 数组 | [1, 2, 3] | 一组数据的列表 |
| object | 对象 | {name: "小明", age: 18} | 一组”键值对”的数据 |
逐个看例子:
// 数字let price = 9.9;let count = 3;
// 字符串let message = "Hello";let name2 = '小明';let sentence = "他说:\"你好\""; // 字符串里有引号要加反斜杠转义
// 布尔let isOpen = true;let isClose = false;
// null 和 undefinedlet nothing = null; // 主动置空let notSet; // 没赋值,值是 undefined
// 用 typeof 查看类型console.log(typeof price); // numberconsole.log(typeof message); // stringconsole.log(typeof isOpen); // boolean怎么知道一个值的类型? 用 typeof 运算符,如上所示。
六、运算符:让数据”动起来”
1. 算术运算符
let a = 10;let b = 3;
console.log(a + b); // 13 加console.log(a - b); // 7 减console.log(a * b); // 30 乘console.log(a / b); // 3.333... 除console.log(a % b); // 1 取余数(10 除以 3 余 1)console.log(a ** 2); // 100 次方(10 的 2 次方)2. 字符串拼接(加号的特殊用法)
let firstName = "张";let lastName = "三";let fullName = firstName + lastName; // "张三"console.log(fullName);
let age = 20;console.log("我今年" + age + "岁"); // 我今年20岁3. 模板字符串(更优雅的拼接,用反引号)
let name = "小红";let score = 95;// 反引号 ` 在键盘左上角,Tab 键上方console.log(`你好,${name},你的成绩是${score}分`);// 输出:你好,小红,你的成绩是95分模板字符串用反引号(不是单引号),里面用 ${} 插入变量,写长句子时特别方便。
4. 比较运算符(结果是 true 或 false)
console.log(5 > 3); // true 大于console.log(5 < 3); // false 小于console.log(5 >= 5); // true 大于等于console.log(5 === 5); // true 全等(值和类型都一样)console.log(5 !== 3); // true 不等于重点提醒: 比较相等尽量用 ===(全等),不要用 ==(宽松相等)。因为 == 会把不同类型自动转换,容易出奇怪的 bug:
console.log(1 == "1"); // true !数字1 和 字符串"1" 被认为相等(自动转了类型)console.log(1 === "1"); // false !严格比较,类型不同就不等5. 逻辑运算符(与、或、非)
// && 与:两边都为 true 结果才是 trueconsole.log(true && true); // trueconsole.log(true && false); // false
// || 或:只要一边是 true 结果就是 trueconsole.log(true || false); // trueconsole.log(false || false); // false
// ! 非:取反console.log(!true); // falseconsole.log(!false); // true实际例子: 判断一个分数是否及格且在 60 到 100 之间
let score = 75;let isPass = score >= 60 && score <= 100;console.log(isPass); // true七、条件判断:让程序”会思考”
程序经常要根据情况走不同的路,这就要用 if。
基本 if 语句
let age = 20;
if (age >= 18) { console.log("成年了,可以考驾照");}如果条件成立,就执行大括号里的代码;不成立就跳过。
if / else:二选一
let age = 15;
if (age >= 18) { console.log("成年了");} else { console.log("还没成年");}else if:多选一
let score = 85;
if (score >= 90) { console.log("优秀");} else if (score >= 80) { console.log("良好");} else if (score >= 60) { console.log("及格");} else { console.log("不及格");}执行逻辑: 从上往下检查,第一个满足的条件会执行,后面的都不再判断。
三元运算符(简写版 if else)
let age = 20;let result = age >= 18 ? "成年" : "未成年";console.log(result); // 成年格式:条件 ? 值1 : 值2,条件为 true 取值1,否则取值2。适合简单的二选一。
八、循环:让程序”重复干活”
如果让你输出 1 到 100,你肯定不会手写 100 行。循环就是干这个的。
for 循环(知道要循环几次)
for (let i = 1; i <= 5; i++) { console.log(i);}// 输出:1 2 3 4 5拆解一下 for (let i = 1; i <= 5; i++):
let i = 1:起点,从 1 开始i <= 5:条件,只要成立就继续i++:每次循环结束 i 加 1(等价于 i = i + 1)
while 循环(条件满足就一直循环)
let i = 1;while (i <= 5) { console.log(i); i++;}注意: 如果忘记写 i++,条件永远成立,程序就会死循环卡死。新手最常犯这个错。
循环数组(最常见场景)
let fruits = ["苹果", "香蕉", "橘子"];
for (let i = 0; i < fruits.length; i++) { console.log(fruits[i]);}// 输出:苹果 香蕉 橘子fruits.length 是数组的长度(有几个元素),fruits[i] 是取第 i 个元素。注意下标从 0 开始:第 0 个是”苹果”,第 1 个是”香蕉”。
还有更简洁的 for...of:
for (let fruit of fruits) { console.log(fruit);}for...of 直接拿元素,不用管下标,新手用这个更不容易错。
九、函数:把一段代码打包,随时调用
函数就是把一段可重复使用的代码打包起来,起个名字,用的时候叫它。
定义和调用
// 定义函数function sayHello() { console.log("你好!");}
// 调用函数sayHello();sayHello();调用几次,就执行几次。
带参数:函数像”加工厂”
function greet(name) { console.log(`你好,${name}!`);}
greet("小明"); // 你好,小明!greet("小红"); // 你好,小红!参数就是”加工厂”的原料:同一个函数,传入不同的原料,产出不同的结果。
带返回值:函数还能”给结果”
function add(a, b) { return a + b;}
let sum = add(3, 4);console.log(sum); // 7return 会把结果交还给调用处。注意:函数遇到 return 就立刻结束,后面的代码不会执行。
箭头函数(现代写法,越来越常用)
// 普通写法function add(a, b) { return a + b;}
// 箭头函数写法const add = (a, b) => a + b;箭头函数用 =>,如果函数体只有一行,可以省略大括号和 return。写熟悉普通函数后再学箭头函数,两者效果一样。
十、数组:数据的”列表”
数组用来存一组相关的数据。
创建和访问
let colors = ["红", "绿", "蓝"];console.log(colors[0]); // 红(下标从0开始)console.log(colors[2]); // 蓝console.log(colors.length); // 3 长度增删改查
let list = ["a", "b", "c"];
list.push("d"); // 末尾加:["a","b","c","d"]list.pop(); // 删除末尾:["a","b","c"]list.unshift("x"); // 开头加:["x","a","b","c"]list.shift(); // 删除开头:["a","b","c"]list[1] = "B"; // 修改下标1:["a","B","c"]
// 查找位置console.log(list.indexOf("B")); // 1,找不到返回 -1常用方法
let nums = [3, 1, 4, 1, 5];
// 排序nums.sort();console.log(nums); // [1, 1, 3, 4, 5]
// 遍历(对每个元素做操作)nums.forEach(n => console.log(n));
// 筛选(返回满足条件的新数组)let big = nums.filter(n => n > 2);console.log(big); // [3, 4, 5]
// 映射(每个元素转换)let doubled = nums.map(n => n * 2);console.log(doubled); // [2, 2, 6, 8, 10]
// 求和(累加)let sum = nums.reduce((total, n) => total + n, 0);console.log(sum); // 14filter、map、reduce 这三个方法非常强大,是 JS 处理数组的”三件套”,后面写项目会天天用到。
十一、对象:数据的”档案袋”
对象用来描述一个”事物”,用键值对的形式存数据。
创建和访问
let student = { name: "小明", age: 18, grade: "高三", score: 95};
// 两种访问方式console.log(student.name); // 小明(点号方式)console.log(student["age"]); // 18(方括号方式,变量名是动态时用)修改和添加属性
student.age = 19; // 修改student.hobby = "篮球"; // 新增属性console.log(student);对象里可以放函数(方法)
let calculator = { add: function (a, b) { return a + b; }};
console.log(calculator.add(2, 3)); // 5数组里可以放对象(实际项目最常见的组合)
let students = [ { name: "小明", score: 95 }, { name: "小红", score: 88 }, { name: "小刚", score: 76 }];
for (let s of students) { console.log(`${s.name} 得了 ${s.score} 分`);}理解”数组里放对象”是看懂真实项目代码的关键一步,很多数据(用户列表、商品列表)都是这个结构。
十二、DOM 操作:让 JS 真正操控网页
前面学的都是在控制台里算数据。真正让 JS 发光的是操作网页——这就要用到 DOM(文档对象模型)。简单说,DOM 就是”网页内容的编程接口”,JS 通过它来找到网页上的元素,然后修改它们。
第一步:拿到网页元素
// 通过 id 拿元素(id 在 HTML 里是唯一的)let title = document.getElementById("title");
// 通过标签名拿元素(返回数组,哪怕只有一个)let paragraphs = document.getElementsByTagName("p");
// 通过 CSS 选择器拿元素(最灵活,推荐)let first = document.querySelector(".box"); // 第一个 class 为 box 的元素let all = document.querySelectorAll(".box"); // 所有 class 为 box 的元素第二步:修改内容
<h1 id="title">旧标题</h1><script> let title = document.getElementById("title"); title.textContent = "新标题!"; // 修改文字 title.style.color = "red"; // 修改样式(CSS 属性用驼峰命名) title.style.fontSize = "30px"; // CSS 里是 font-size,JS 里写 fontSize</script>第三步:响应用户操作(事件)
<button id="btn">点我</button><p id="msg">还没点</p>
<script> let btn = document.getElementById("btn"); let msg = document.getElementById("msg");
// 监听点击事件 btn.addEventListener("click", function () { msg.textContent = "你点了我!"; msg.style.color = "green"; });</script>addEventListener("click", 函数) 的意思是:当用户点击这个按钮时,执行后面的函数。这是网页交互的核心写法。
一个小练习:点击计数器
把下面代码保存成 counter.html,用浏览器打开试试:
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>计数器</title></head><body> <h1>点击计数器</h1> <p>点击次数:<span id="count">0</span></p> <button id="btn">+1</button>
<script> let num = 0; let countEl = document.getElementById("count"); let btn = document.getElementById("btn");
btn.addEventListener("click", function () { num = num + 1; // 每次点击加 1 countEl.textContent = num; // 把数字显示到页面上 }); </script></body></html>每次点按钮,页面上的数字就会 +1。恭喜你,你已经写出了第一个真正的”交互程序”!
十三、新手常犯的错误和排错方法
- 忘记加分号:JS 大多能自动补分号,但建议自己写清楚
- 大小写写错:
Console.log是错的,必须是console.log - 变量未定义就用:要先
let x = ...再使用 - 数组下标越界:
arr[10]但数组只有 3 个元素,结果是 undefined - 死循环:while 条件永远为真,页面卡死(把浏览器关了重开)
- 函数忘记调用:只写了函数定义,没写
函数名(),所以没反应
排错万能方法: 在可疑位置加 console.log(变量),把中间结果打印出来看。这比猜快一百倍。
看报错: 代码出错时,Console 会显示红色的错误信息,点开会告诉你是哪一行出错、什么错误。学会读报错是程序员的必修课。
十四、学习路线:接下来学什么?
你已经掌握了 JS 的全部基础语法。接下来按这个顺序进阶:
- ES6+ 新特性:解构赋值、展开运算符、模块化 import/export
- 异步编程:setTimeout、Promise、async/await(处理网络请求的关键)
- 网络请求:fetch 请求后端数据
- HTML + CSS 强化:把页面做得更漂亮
- 框架:Vue / React(目前最流行的两个,二选一深入)
- 动手做项目:待办清单 App、天气查询页、简易商城
给新手的三个建议:
- 代码一定要自己敲,不要复制粘贴。手敲才能形成肌肉记忆
- 每学一个概念,就写一个小例子验证,哪怕只有三行
- 遇到不懂的先自己查(MDN 文档是官方权威资料),实在不行再问
十五、总结
这一篇我们从头到尾学会了:
- JavaScript 是什么、怎么在控制台和 HTML 里运行
- 变量(let / const)、常见数据类型
- 运算符:算术、比较、逻辑
- 条件判断 if / else
- 循环 for / while
- 函数与箭头函数
- 数组的增删改查和 filter / map / reduce
- 对象以及”数组里放对象”的数据结构
- 用 DOM 操作网页:找元素、改内容、监听点击事件
从按下 F12 输出第一行 console.log,到写出能点击加一的计数器,你已经完成了从零到入门的过程。接下来就是多写多练——编程没有捷径,唯一的捷径就是自己动手写。加油!