跳至内容

JavaScript 基础

JavaScript(官方名称 ECMAScript)是浏览器端的脚本语言,与 HTML 定义内容、CSS 描述样式共同构成前端三大基石。本文覆盖 ES5/ES6 核心语法:变量、数据类型、对象、运算符、流程控制和函数,适合快速建立 JS 知识框架。

简介

JavaScript 是一种基于对象、事件驱动的轻量级脚本语言,可直接插入 HTML 页面由浏览器执行。其主要特点:

  • 脚本语言,无需编译,由浏览器运行时解释执行
  • 弱类型(动态类型),同一变量可指向任意类型
  • 跨平台,所有现代浏览器均支持
  • 通过 Node.js 也可运行在服务端

ECMAScript 与 JavaScript 的关系:ECMAScript 是规范(由 ECMA 标准化),JavaScript 是该规范的一种实现。当前主流版本是 ES5.1 和 ES6(ES2015)及以上。

JS 与 Java 没有关系,当年纯粹是为了蹭 Java 热度而起名。

引入方式有两种:

<!-- 方式 1:script 标签内直接书写 -->
<script>
  console.log('hello')
</script>

<!-- 方式 2:引入外部 js 文件 -->
<script src="app.js"></script>

注释语法:

// 单行注释

/*
  多行注释
  多行注释
*/

JavaScript 的三大组成部分:

部分全称作用
ECMAScript核心语法规范
DOMDocument Object Model整合 JS、CSS、HTML,操作页面元素
BOMBrowser Object Model整合 JS 与浏览器,操作浏览器窗口

变量

变量名可由字母、数字、下划线、$ 组成,不能以数字开头,不能使用保留关键字。

// ES5:var 声明
var name = 'jason'

// ES6:let 声明(推荐)
let name = 'jason'

// 常量:const(ES6),声明后不可重新赋值
const PI = 3.14

varlet 的区别var 声明的变量是函数作用域,在 for 循环内声明也会泄漏到外部;let 是块级作用域,只在声明的代码块内有效。

JS 推荐驼峰命名法(如 userNamedataOfDb),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:空字符串 ""0nullundefinedNaN

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
JS 代码本身没有强制缩进要求(与 Python 不同),大括号 {} 划定代码块,圆括号 () 包裹条件。

函数

// 有名函数
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()();
最后更新于