JavaScript 基础
JavaScript(官方名称 ECMAScript)是浏览器端的脚本语言,与 HTML 定义内容、CSS 描述样式共同构成前端三大基石。本文覆盖 ES5/ES6 核心语法:变量、数据类型、对象、运算符、流程控制和函数,适合快速建立 JS 知识框架。
简介
JavaScript 是一种基于对象、事件驱动的轻量级脚本语言,可直接插入 HTML 页面由浏览器执行。其主要特点:
- 脚本语言,无需编译,由浏览器运行时解释执行
- 弱类型(动态类型),同一变量可指向任意类型
- 跨平台,所有现代浏览器均支持
- 通过 Node.js 也可运行在服务端
ECMAScript 与 JavaScript 的关系:ECMAScript 是规范(由 ECMA 标准化),JavaScript 是该规范的一种实现。当前主流版本是 ES5.1 和 ES6(ES2015)及以上。
引入方式有两种:
<!-- 方式 1:script 标签内直接书写 -->
<script>
console.log('hello')
</script>
<!-- 方式 2:引入外部 js 文件 -->
<script src="app.js"></script>注释语法:
// 单行注释
/*
多行注释
多行注释
*/JavaScript 的三大组成部分:
| 部分 | 全称 | 作用 |
|---|---|---|
| ECMAScript | — | 核心语法规范 |
| DOM | Document Object Model | 整合 JS、CSS、HTML,操作页面元素 |
| BOM | Browser Object Model | 整合 JS 与浏览器,操作浏览器窗口 |
变量
变量名可由字母、数字、下划线、$ 组成,不能以数字开头,不能使用保留关键字。
// ES5:var 声明
var name = 'jason'
// ES6:let 声明(推荐)
let name = 'jason'
// 常量:const(ES6),声明后不可重新赋值
const PI = 3.14var 与 let 的区别:var 声明的变量是函数作用域,在 for 循环内声明也会泄漏到外部;let 是块级作用域,只在声明的代码块内有效。
JS 推荐驼峰命名法(如 userName、dataOfDb),Python 风格的下划线命名也可用但不是 JS 惯例。
数据类型
JS 是动态类型语言,同一变量可以指向任意类型的值。用 typeof 运算符查看变量类型。
数值(number)
JS 不区分整型和浮点型,统一用 number 表示。
var a = 11;
var b = 11.11;
typeof a // "number"
typeof b // "number"
特殊值 NaN(Not a Number)是数值类型,表示非法运算结果。类型转换函数:
parseInt("123") // 123
parseInt("ABC") // NaN
parseFloat("3.14") // 3.14
字符串(string)
var a = "Hello";
var b = 'world';
var c = a + b; // "Helloworld"(JS 中用 + 拼接字符串)
// 模板字符串(ES6,反引号):支持多行和变量插值
var name = 'jason';
var age = 18;
var s = `my name is ${name} and my age is ${age}`;常用字符串方法(类比 Python):
| 方法 | 说明 |
|---|---|
.length | 返回字符串长度 |
.trim() / .trimLeft() / .trimRight() | 移除空白 |
.charAt(n) | 返回第 n 个字符 |
.indexOf(sub, start) | 子序列位置 |
.substring(from, to) | 根据索引取子串(不支持负数) |
.slice(start, end) | 切片(支持负数索引,推荐) |
.toLowerCase() / .toUpperCase() | 大小写转换 |
.split(delimiter, limit) | 分割为数组 |
.concat(val, ...) | 拼接 |
var s = '$$jason$$';
s.charAt(0) // "$"
s.indexOf('as') // 3
s.slice(0, -1) // "$$jason$"
s.split('$') // ["", "", "jason", "", ""]
布尔(boolean)
// JS 布尔值全小写(Python 是首字母大写)
true
false以下值在布尔上下文中视为 false:空字符串 ""、0、null、undefined、NaN。
null 与 undefined
| 值 | 含义 |
|---|---|
null | 表示"值为空",通常用来主动清空一个变量 |
undefined | 变量已声明但未赋值;函数无返回值时也返回 undefined |
对象
JS 中"一切皆对象"。typeof 对数组和 null 都返回 "object"。
数组(Array)
类似 Python 的 list,可存储混合类型,不支持负数索引。
var l = [111, 222, 333, 444, 555, 666];
l[0] // 111
l[-1] // undefined(不支持负数)
typeof l // "object"
常用方法:
| 方法 | 说明 |
|---|---|
.length | 数组大小 |
.push(ele) | 尾部追加 |
.pop() | 删除并返回尾部元素 |
.unshift(ele) | 头部插入 |
.shift() | 删除并返回头部元素 |
.slice(start, end) | 切片(不修改原数组) |
.reverse() | 原地反转 |
.join(seq) | 以 seq 为分隔符连接成字符串 |
.concat(arr) | 连接数组(返回新数组) |
.sort() | 原地排序 |
.forEach(fn) | 遍历,回调参数:(value, index, arr) |
.splice(start, n, ...items) | 从 start 删除 n 个元素,并可插入新元素 |
.map(fn) | 返回回调处理后的新数组 |
var l = [111, 222, 333, 444, 555, 666];
l.push(777) // [111, ..., 777]
l.pop() // 777,l 恢复为 6 个
l.join('$') // "111$222$333$444$555$666"
l.reverse() // [666, 555, 444, 333, 222, 111]
// forEach 遍历
l.forEach(function(value, index) {
console.log(value, index)
})
// splice:删除前 3 个元素
l.splice(0, 3) // 返回 [666, 555, 444]
// map:每个元素乘 2
[1, 2, 3].map(function(value) { return value * 2 }) // [2, 4, 6]
typeof 类型查询
typeof 是一元运算符,返回值为字符串:
typeof "abc" // "string"
typeof 123 // "number"
typeof true // "boolean"
typeof null // "object"(历史遗留问题)
typeof [] // "object"
typeof {} // "object"
typeof undefined // "undefined"
自定义对象
类似 Python 的字典,但访问属性更方便(支持点语法)。
// 方式 1:字面量
var d = { name: 'jason', age: 18 };
d['name'] // "jason"
d.name // "jason"(JS 特有的点语法)
// 遍历(for...in 暴露的是键)
for (let key in d) {
console.log(key, d[key])
}
// 方式 2:new Object()
var d2 = new Object();
d2.name = 'jason';
d2['age'] = 18;Date 对象
let d = new Date();
d.toLocaleString() // "2026/6/26 下午2:30:00"
// 手动指定时间(月份从 0 开始)
let d2 = new Date('2200/11/11 11:11:11');
let d3 = new Date(2026, 5, 26, 14, 30, 0); // 第 6 个月(索引 5)
// 常用方法
d.getFullYear() // 年
d.getMonth() // 月(0-11)
d.getDate() // 日
d.getDay() // 星期(0=周日)
d.getHours() // 时
d.getMinutes() // 分
d.getSeconds() // 秒
d.getTime() // 时间戳(毫秒)
JSON 对象
JSON 序列化与反序列化(对应 Python 的 json.dumps / json.loads):
let obj = { name: 'jason', age: 18 };
// 序列化
let s = JSON.stringify(obj); // '{"name":"jason","age":18}'
// 反序列化
JSON.parse(s); // { name: 'jason', age: 18 }
RegExp 对象
// 创建正则(推荐字面量写法)
let reg = /^[a-zA-Z][a-zA-Z0-9]{5,11}/;
// 测试匹配
reg.test('egondsb') // true
reg.test('123abc') // false
// 全局匹配(g 标志)
let s = 'egondsb dsb dsb';
s.match(/s/) // 找到第一个就停止
s.match(/s/g) // ["s", "s", "s"]
g 标志的正则对象有 lastIndex 属性,多次调用 test() 会交替返回 true/false。避免对同一个全局正则对象重复调用 test(),或在每次调用前手动重置 lastIndex = 0。Math 对象
| 方法 | 说明 |
|---|---|
Math.abs(x) | 绝对值 |
Math.floor(x) | 向下取整 |
Math.ceil(x) | 向上取整 |
Math.round(x) | 四舍五入 |
Math.max(x, y) | 最大值 |
Math.min(x, y) | 最小值 |
Math.pow(x, y) | x 的 y 次幂 |
Math.sqrt(x) | 平方根 |
Math.random() | 0~1 之间的随机数 |
运算符
// 算术运算符
var x = 10;
var res1 = x++; // 先赋值后自增,res1 = 10,x = 11
var res2 = ++x; // 先自增后赋值,res2 = 12,x = 12
// 比较运算符
1 == '1' // true(弱等于,自动类型转换)
1 === '1' // false(强等于,不做类型转换,推荐使用 ===)
1 != '1' // false
1 !== '1' // true
// 逻辑运算符(对应 Python 的 and/or/not)
5 && '5' // '5'(返回最后一个真值)
0 || 1 // 1(返回第一个真值)
!5 // false
// 赋值运算符
// = += -= *= /= 等(与 Python 一致)
流程控制
// if / else if / else
var age = 28;
if (age < 18) {
console.log('未成年');
} else if (age < 60) {
console.log('成年');
} else {
console.log('老年');
}
// switch(提前列举可能的条件)
var num = 2;
switch (num) {
case 0: console.log('喝酒'); break;
case 1: console.log('唱歌'); break;
case 2: console.log('洗脚'); break;
default: console.log('默认流程');
}
// for 循环
for (let i = 0; i < 10; i++) {
console.log(i);
}
// while 循环
var i = 0;
while (i < 100) {
console.log(i);
i++;
}
// 三元运算符(Python:1 if 1>2 else 3)
var res = 2 > 5 ? 8 : 10; // 10
{} 划定代码块,圆括号 () 包裹条件。函数
// 有名函数
function func(a, b) {
console.log(a, b);
}
func(1, 2); // 1 2
func(1, 2, 3, 4); // 1 2(多余的参数忽略)
func(1); // 1 undefined(缺少的参数为 undefined)
// arguments 关键字:获取所有实参
function func(a, b) {
console.log(arguments.length); // 实参个数
console.log(arguments); // 类数组对象
}
// 返回值(只能返回一个值,多值用数组或对象包装)
function index() {
return [666, 777, 888];
}
// 匿名函数(赋值给变量)
var greet = function() {
console.log('hello');
};
greet();
// 箭头函数(ES6,适合简单逻辑)
var double = v => v * 2;
// 等价于:var double = function(v) { return v * 2; }
var add = (a, b) => a + b;作用域
// JS 查找变量的顺序:当前作用域 → 外层 → 全局(与 Python 类似)
var city = 'BeiJing';
function f() {
var city = 'ShangHai';
function inner() {
var city = 'ShenZhen';
console.log(city); // ShenZhen
}
inner();
}
f();
// 闭包:inner 捕获的是定义时的外层作用域
function f2() {
var city = 'ShangHai';
function inner() {
console.log(city); // ShangHai(不是全局的 BeiJing)
}
return inner;
}
f2()();