JavaScript 入门教程
JavaScript 是当今最流行的编程语言之一,主要用于网页开发,为静态页面添加交互功能。本教程将从零开始,全面介绍 JavaScript 的核心概念和用法,帮助初学者系统掌握这门语言。
一、JavaScript 简介
1.1 JavaScript 的历史
JavaScript 由 Netscape 公司的 Brendan Eich 在 1995 年开发,最初命名为 LiveScript,后因与 Sun 公司(现 Oracle)合作而更名为 JavaScript。1997 年,ECMA(欧洲计算机制造商协会)制定了 JavaScript 的标准规范 ECMA-262,称为 ECMAScript。
重要事实:
JavaScript 和 Java 是两种完全不同的语言
JavaScript 的版权目前归 Oracle 所有
ECMAScript 是 JavaScript 的标准规范,JavaScript 是 ECMAScript 的一种实现
1.2 前端开发三大核心技术
现代前端开发建立在三大核心技术之上:
HTML:负责网页的结构和内容
CSS:负责网页的样式和外观
JavaScript:负责网页的行为和交互
三者各司其职,共同构建完整的网页体验。
二、JavaScript 基础
2.1 JavaScript 的引入方式
在 HTML 中使用 JavaScript 有两种主要方式:
内嵌脚本:
<script type="text/javascript">alert("Hello World!"); </script>
外部引入(推荐):
<script src="myscript.js"></script>
遵循 Web 标准,建议将结构(HTML)、样式(CSS)和行为(JavaScript)分离,因此通常采用外部引入的方式。
2.2 变量与数据类型
2.2.1 变量声明
JavaScript 是弱类型语言,变量类型由值决定。声明变量使用 var
、let
或 const
关键字:
var age = 25; // 传统方式
let name = "John"; // ES6新增,块级作用域
const PI = 3.14159; // ES6新增,常量
变量命名规则:
可以包含字母、数字、下划线和美元符号
不能以数字开头
区分大小写
不能使用保留字作为变量名
推荐使用驼峰命名法(如:myVariableName)
2.2.2 数据类型
JavaScript 有 6 种基本数据类型和 1 种复合类型:
类型 | 说明 | 示例 |
---|---|---|
number | 数字(不区分整型浮点型) | var a = 123; var b = 3.14; |
string | 字符串 | var s = "hello"; |
boolean | 布尔值(true/false) | var flag = true; |
undefined | 未定义的值 | var x; (x为undefined) |
null | 空对象引用 | var obj = null; |
symbol | ES6新增的唯一标识符 | let sym = Symbol(); |
object | 复合类型(对象、数组等) | var obj = {name: "John"}; |
类型转换示例:
var num = "123";
console.log(parseInt(num)); // 字符串转整数:123
console.log(parseFloat("3.14")); // 字符串转浮点数:3.14
console.log(String(123)); // 数字转字符串:"123"
console.log(Boolean(1)); // 数字转布尔:true
2.3 运算符
JavaScript 支持多种运算符:
算术运算符:
+ - * / % ++ --
比较运算符:
> >= < <= == === != !==
逻辑运算符:
&& || !
赋值运算符:
= += -= *= /=
特别注意:
==
会进行类型转换,===
不会(推荐使用严格相等===
)"1" == 1
为 true,但"1" === 1
为 false
2.4 流程控制
2.4.1 条件语句
if-else:
if (age > 18) {console.log("成年人");
} else {console.log("未成年人");
}
switch:
switch(day) {case 0: console.log("周日"); break;case 1: console.log("周一"); break;// ...default: console.log("无效日期");
}
三元运算符:
var result = score >= 60 ? "及格" : "不及格";
2.4.2 循环语句
for循环:
for (var i = 0; i < 10; i++) {console.log(i);
}
while循环:
var i = 0;
while (i < 10) {console.log(i);i++;
}
数组去重示例:
var arr = [1,2,2,3,4,4,5];
var uniqueArr = [];
for (var i = 0; i < arr.length; i++) {if (uniqueArr.indexOf(arr[i]) === -1) {uniqueArr.push(arr[i]);}
}
console.log(uniqueArr); // [1,2,3,4,5]
三、函数
3.1 函数定义与调用
JavaScript 有多种定义函数的方式:
函数声明:
function add(a, b) {return a + b;
}
函数表达式:
var add = function(a, b) {return a + b;
};
箭头函数(ES6):
const add = (a, b) => a + b;
立即执行函数(IIFE):
(function() {console.log("立即执行");
})();
3.2 作用域与闭包
变量作用域:
全局变量:函数外部声明,整个程序可访问
局部变量:函数内部声明,仅函数内可访问
闭包示例:
function outer() {var count = 0;return function() {count++;console.log(count);};
}
var inner = outer();
inner(); // 1
inner(); // 2
3.3 函数参数
JavaScript 函数参数灵活,不检查参数个数和类型:
function logArgs() {console.log(arguments); // 类数组对象,包含所有参数
}
logArgs(1, "a", true);
ES6 剩余参数:javascriptfunction sum(...numbers) {return numbers.reduce((a, b) => a + b);
}
sum(1, 2, 3); // 6
四、对象与数组
4.1 对象
对象创建:
// 对象字面量
var person = {name: "John",age: 30,sayHi: function() {console.log("Hello!");}
};// 构造函数
var person = new Object();
person.name = "John";
对象操作:
// 访问属性
console.log(person.name); // "John"
console.log(person["age"]); // 30// 添加/修改属性
person.job = "Developer";// 删除属性
delete person.age;// 遍历属性
for (var key in person) {console.log(key + ": " + person[key]);
}
4.2 数组
数组创建:
var arr1 = [1, 2, 3]; // 字面量
var arr2 = new Array(4, 5, 6); // 构造函数
数组常用方法:
方法 | 描述 | 示例 |
---|---|---|
push/pop | 尾部添加/删除元素 | arr.push(4); arr.pop(); |
unshift/shift | 头部添加/删除元素 | arr.unshift(0); arr.shift(); |
slice | 截取子数组 | arr.slice(1,3) |
splice | 添加/删除元素 | arr.splice(1,0,"a") |
concat | 合并数组 | arr1.concat(arr2) |
join | 数组转字符串 | arr.join("-") |
reverse | 反转数组 | arr.reverse() |
sort | 数组排序 | arr.sort() |
indexOf | 查找元素索引 | arr.indexOf(2) |
forEach | 遍历数组 | arr.forEach(console.log) |
map | 映射新数组 | arr.map(x => x*2) |
filter | 过滤数组 | arr.filter(x => x>2) |
reduce | 累计计算 | arr.reduce((a,b)=>a+b) |
数组示例:
var numbers = [1, 2, 3, 4, 5];// 遍历
numbers.forEach(function(num) {console.log(num);
});// 映射新数组
var doubled = numbers.map(n => n * 2);// 过滤
var evens = numbers.filter(n => n % 2 === 0);// 求和
var sum = numbers.reduce((a, b) => a + b, 0);
五、内置对象
5.1 Date 对象
创建日期对象:
var now = new Date(); // 当前时间
var someDate = new Date("2023-01-15"); // 指定日期
var timestamp = new Date(1642204800000);// 时间戳创建
常用方法:
now.getFullYear(); // 年
now.getMonth(); // 月(0-11)
now.getDate(); // 日(1-31)
now.getDay(); // 星期(0-6)
now.getHours(); // 时(0-23)
now.getMinutes(); // 分(0-59)
now.getSeconds(); // 秒(0-59)
now.getTime(); // 时间戳(毫秒)
5.2 Math 对象
常用属性和方法:
Math.PI; // 圆周率
Math.abs(-5); // 绝对值: 5
Math.ceil(4.1); // 向上取整: 5
Math.floor(4.9); // 向下取整: 4
Math.round(4.5); // 四舍五入: 5
Math.max(1, 3, 2); // 最大值: 3
Math.min(1, 3, 2); // 最小值: 1
Math.pow(2, 3); // 2的3次方: 8
Math.sqrt(9); // 平方根: 3
Math.random(); // 0-1随机数
5.3 JSON 对象
JSON 与对象转换:
var obj = {name: "John", age: 30};// 对象转JSON字符串
var jsonStr = JSON.stringify(obj);
// 结果: '{"name":"John","age":30}'// JSON字符串转对象
var newObj = JSON.parse(jsonStr);
六、DOM 操作
DOM (Document Object Model) 是 JavaScript 操作网页元素的接口。
6.1 获取元素
// 通过ID获取
var elem = document.getElementById("myId");// 通过类名获取(返回HTMLCollection)
var elems = document.getElementsByClassName("myClass");// 通过标签名获取(返回HTMLCollection)
var divs = document.getElementsByTagName("div");// 通过CSS选择器获取
var firstMatch = document.querySelector(".myClass");
var allMatches = document.querySelectorAll("div.myClass");
6.2 操作元素
修改内容:
elem.innerHTML = "<strong>新内容</strong>"; // 解析HTML
elem.textContent = "纯文本内容"; // 不解析HTML
修改样式:
elem.style.color = "red";
elem.style.fontSize = "20px";// 更好的方式是操作class
elem.classList.add("highlight");
elem.classList.remove("old-class");
elem.classList.toggle("active");
修改属性:
elem.setAttribute("data-id", "123");
var id = elem.getAttribute("data-id");
elem.removeAttribute("data-id");
6.3 事件处理
添加事件监听:
elem.addEventListener("click", function(event) {console.log("点击了元素", event.target);
});// 常见事件:
// click - 点击
// mouseover/mouseout - 鼠标移入/移出
// keydown/keyup - 键盘按下/释放
// focus/blur - 获取/失去焦点
// submit - 表单提交
// load - 资源加载完成
事件对象:
document.addEventListener("click", function(e) {console.log("点击位置:", e.clientX, e.clientY);e.preventDefault(); // 阻止默认行为e.stopPropagation(); // 阻止事件冒泡
});
七、BOM 操作
BOM (Browser Object Model) 是 JavaScript 操作浏览器窗口的接口。
7.1 window 对象
// 窗口尺寸
var width = window.innerWidth;
var height = window.innerHeight;// 打开新窗口
window.open("https://example.com");// 定时器
var timer = setTimeout(function() {console.log("3秒后执行");
}, 3000);// 清除定时器
clearTimeout(timer);// 周期性定时器
var interval = setInterval(function() {console.log("每秒执行一次");
}, 1000);
clearInterval(interval);
7.2 location 对象
// 获取当前URL
var url = location.href;// 重定向
location.href = "https://example.com";
location.assign("https://example.com"); // 记录历史
location.replace("https://example.com"); // 不记录历史// 刷新页面
location.reload();
7.3 navigator 对象
// 浏览器信息
console.log(navigator.userAgent);// 检测插件
if (navigator.plugins["Flash"]) {console.log("支持Flash");
}
7.4 screen 对象
console.log("屏幕分辨率:", screen.width, "x", screen.height);
console.log("可用屏幕大小:", screen.availWidth, "x", screen.availHeight);
八、ES6+ 新特性
8.1 let 和 const
let x = 1; // 块级作用域变量
const PI = 3.14; // 常量,不可重新赋值
8.2 箭头函数
const add = (a, b) => a + b;// 等同于
const add = function(a, b) {return a + b;
};
8.3 模板字符串
const name = "John";
console.log(`Hello, ${name}!`); // 支持多行和变量插值
8.4 解构赋值
// 数组解构
const [a, b] = [1, 2];// 对象解构
const {name, age} = {name: "John", age: 30};// 函数参数解构
function greet({name, age}) {console.log(`Hello, ${name}, you are ${age}`);
}
8.5 扩展运算符
// 数组展开
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4]; // [1,2,3,4]// 对象展开
const obj1 = {a: 1, b: 2};
const obj2 = {...obj1, c: 3}; // {a:1, b:2, c:3}
8.6 Promise 和 async/await
// Promise
function fetchData() {return new Promise((resolve, reject) => {setTimeout(() => resolve("数据加载成功"), 1000);});
}fetchData().then(data => console.log(data)).catch(error => console.error(error));// async/await
async function getData() {try {const data = await fetchData();console.log(data);} catch (error) {console.error(error);}
}
九、最佳实践
9.1 代码风格
使用一致的缩进(2或4个空格)
使用分号结束语句
使用驼峰命名法
常量使用全大写
注释清晰,解释复杂逻辑
9.2 性能优化
减少DOM操作,批量更新
使用事件委托处理大量元素事件
避免全局变量污染
使用节流(throttle)和防抖(debounce)优化频繁事件
9.3 调试技巧
使用
console.log()
输出调试信息使用浏览器开发者工具调试
使用
debugger
语句设置断点使用
try-catch
处理潜在错误
十、学习资源推荐
MDN JavaScript 文档:最权威的 JavaScript 参考
《JavaScript 高级程序设计》:经典教材
《你不知道的 JavaScript》:深入理解 JavaScript
ES6 入门教程:阮一峰的在线教程
JavaScript30:30天纯JavaScript挑战项目
通过本教程,你应该对 JavaScript 有了全面的了解。记住,编程最好的学习方式是实践,多写代码,多尝试,逐步提升你的 JavaScript 技能!