跳到主要内容JavaScript 完整语法指南 | 极客日志JavaScriptNode.jsReact Native大前端
JavaScript 完整语法指南
综述由AI生成系统讲解了 JavaScript 的核心语法知识。涵盖变量声明(let/const/var)、八种数据类型及转换方式。详细介绍算术、逻辑、比较运算符及三元表达式。阐述流程控制语句(if/switch/for/while)与函数定义(声明/箭头/闭包)。深入对象数组操作、解构赋值、模板字符串等 ES6+ 特性。讲解异步编程模型(Promise/async-await/Fetch API)及 DOM 操作方法。最后提供常见错误调试技巧与最佳实践建议,适合初学者构建完整的 JavaScript 知识体系。
灵魂摆渡12K 浏览 JavaScript 语法完全指南
一、JavaScript 简介
1.1 什么是 JavaScript?
JavaScript(简称 JS)是一种解释型的编程语言,主要用于:
- 网页交互:让网页"动起来"(点击按钮、表单验证等)
- 后端开发:Node.js 让 JavaScript 可以在服务器运行
- 移动开发:React Native、Ionic 等框架
- 桌面应用:Electron 框架
1.2 JavaScript 的特点
- ✅ 解释型语言:不需要编译,浏览器直接执行
- ✅ 弱类型语言:变量类型可以自动转换
- ✅ 动态语言:可以在运行时修改对象和函数
- ✅ 跨平台:可以在浏览器、服务器、移动设备运行
1.3 第一个 JavaScript 程序
console.log("Hello, World!");
说明:
console.log():在控制台输出内容
//:单行注释
/* */:多行注释
二、变量与数据类型
2.1 变量声明
var(旧方式,不推荐)
var name = "张三";
var age = 20;
var isStudent = true;
var name = "李四";
let(推荐,块级作用域)
let name = "张三";
let age = 20;
let name = "李四";
name = ;
"李四"
const(常量,推荐)
const PI = 3.14159;
const MAX_SIZE = 100;
PI = 3.14;
const name;
- ✅ 优先使用
const:如果值不会改变
- ✅ 使用
let:如果值需要改变
- ❌ 避免使用
var:有作用域问题
2.2 数据类型
1. 基本类型(Primitive Types)
Number(数字)
let age = 20;
let price = 99.99;
let temperature = -10;
let infinity = Infinity;
let notANumber = NaN;
let bigNumber = 1e6;
let smallNumber = 1e-3;
console.log(typeof age);
String(字符串)
let name1 = "张三";
let name2 = '李四';
let name3 = `王五`;
let fullName = name1 + " " + name2;
let message = `你好,我是${name1}`;
let text = "Hello World";
console.log(text.length);
console.log(text.toUpperCase());
console.log(text.toLowerCase());
console.log(text.substring(0, 5));
Boolean(布尔值)
let isStudent = true;
let isWorking = false;
console.log(Boolean(1));
console.log(Boolean(0));
console.log(Boolean(""));
console.log(Boolean("hello"));
console.log(Boolean(null));
console.log(Boolean(undefined));
Undefined(未定义)
let name;
console.log(name);
console.log(typeof name);
Null(空值)
let user = null;
console.log(user);
console.log(typeof user);
Symbol(符号,ES6)
let id1 = Symbol("id");
let id2 = Symbol("id");
console.log(id1 === id2);
let user = {[id1]: "12345"};
BigInt(大整数,ES2020)
let bigNumber = 9007199254740991n;
let anotherBig = BigInt("9007199254740991");
console.log(bigNumber + 1n);
2. 引用类型(Reference Types)
Object(对象)
let user = {
name: "张三",
age: 20,
isStudent: true,
sayHello: function() {
console.log("你好!");
}
};
console.log(user.name);
console.log(user["age"]);
user.sayHello();
user.email = "[email protected]";
delete user.isStudent;
Array(数组)
let fruits = ["苹果", "香蕉", "橙子"];
console.log(fruits[0]);
console.log(fruits.length);
fruits.push("葡萄");
fruits.unshift("草莓");
fruits.pop();
fruits.shift();
fruits.forEach(function(fruit) {
console.log(fruit);
});
2.3 类型转换
隐式转换(自动转换)
let num = 10;
let str = num + "";
let str2 = "20";
let num2 = +str2;
let num3 = str2 * 1;
let bool = !!str2;
显式转换(手动转换)
String(123);
(123).toString();
Number("123");
parseInt("123.45");
parseFloat("123.45");
Boolean(1);
Boolean(0);
2.4 类型检查
typeof 123;
typeof "hello";
typeof true;
typeof undefined;
typeof null;
typeof {};
typeof [];
[] instanceof Array;
{} instanceof Object;
Array.isArray([]);
Array.isArray({});
三、运算符
3.1 算术运算符
let a = 10;
let b = 3;
console.log(a + b);
console.log(a - b);
console.log(a * b);
console.log(a / b);
console.log(a % b);
console.log(a ** b);
let x = 5;
x++;
++x;
x--;
--x;
let y = 5;
let result1 = ++y;
let z = 5;
let result2 = z++;
3.2 赋值运算符
let x = 10;
x += 5;
x -= 3;
x *= 2;
x /= 4;
x %= 5;
3.3 比较运算符
let a = 5;
let b = "5";
console.log(a == b);
console.log(a === b);
console.log(a != b);
console.log(a !== b);
console.log(5 > 3);
console.log(5 < 3);
console.log(5 >= 5);
console.log(5 <= 3);
3.4 逻辑运算符
let x = 5;
let y = 10;
console.log(x > 0 && y > 0);
console.log(x > 0 && y < 0);
console.log(x > 0 || y < 0);
console.log(x < 0 || y < 0);
console.log(!true);
console.log(!false);
let result = x > 0 && y++;
let result2 = x < 0 && y++;
3.5 三元运算符(条件运算符)
let age = 20;
let status = age >= 18 ? "成年人" : "未成年人";
console.log(status);
let status2;
if (age >= 18) {
status2 = "成年人";
} else {
status2 = "未成年人";
}
let score = 85;
let grade = score >= 90 ? "优秀" : score >= 80 ? "良好" : score >= 60 ? "及格" : "不及格";
console.log(grade);
3.6 其他运算符
let name = null;
let displayName = name ?? "匿名";
let user = {name: "张三", address: {city: "北京"}};
console.log(user.address?.city);
console.log(user.address?.zipCode);
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5];
let obj1 = {a: 1, b: 2};
let obj2 = {...obj1, c: 3};
四、流程控制
4.1 if 语句
let age = 20;
if (age >= 18) {
console.log("成年人");
}
if (age >= 18) {
console.log("成年人");
} else {
console.log("未成年人");
}
if (age < 13) {
console.log("儿童");
} else if (age < 18) {
console.log("青少年");
} else if (age < 60) {
console.log("成年人");
} else {
console.log("老年人");
}
4.2 switch 语句
let day = 3;
let dayName;
switch (day) {
case 1: dayName = "星期一"; break;
case 2: dayName = "星期二"; break;
case 3: dayName = "星期三"; break;
case 4: dayName = "星期四"; break;
case 5: dayName = "星期五"; break;
case 6:
case 7: dayName = "周末"; break;
default: dayName = "未知";
}
console.log(dayName);
4.3 for 循环
for (let i = 0; i < 5; i++) {
console.log(i);
}
let person = {name: "张三", age: 20, city: "北京"};
for (let key in person) {
console.log(key + ": " + person[key]);
}
let fruits = ["苹果", "香蕉", "橙子"];
for (let fruit of fruits) {
console.log(fruit);
}
4.4 while 循环
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
let j = 0;
do {
console.log(j);
j++;
} while (j < 5);
4.5 循环控制
for (let i = 0; i < 10; i++) {
if (i === 5) {
break;
}
console.log(i);
}
for (let i = 0; i < 10; i++) {
if (i === 5) {
continue;
}
console.log(i);
}
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break outer;
}
console.log(i, j);
}
}
五、函数
5.1 函数声明
function greet(name) {
return "你好," + name + "!";
}
console.log(greet("张三"));
const greet2 = function(name) {
return "你好," + name + "!";
};
const greet3 = (name) => {
return "你好," + name + "!";
};
const greet4 = (name) => "你好," + name + "!";
const greet5 = name => "你好," + name + "!";
5.2 函数参数
function greet(name = "匿名") {
return "你好," + name + "!";
}
console.log(greet());
console.log(greet("张三"));
function sum(...numbers) {
let total = 0;
for (let num of numbers) {
total += num;
}
return total;
}
console.log(sum(1, 2, 3));
console.log(sum(1, 2, 3, 4, 5));
function greetUser({ name, age }) {
return `你好,${name},你今年${age}岁!`;
}
console.log(greetUser({name: "张三", age: 20}));
5.3 返回值
function add(a, b) {
return a + b;
}
let result = add(3, 5);
function sayHello(name) {
console.log("你好," + name);
}
let result2 = sayHello("张三");
function checkAge(age) {
if (age < 0) {
return "年龄不能为负数";
}
if (age < 18) {
return "未成年人";
}
return "成年人";
}
5.4 作用域
let globalVar = "全局变量";
function test() {
let localVar = "局部变量";
console.log(globalVar);
console.log(localVar);
}
test();
console.log(globalVar);
console.log(localVar);
if (true) {
let blockVar = "块级变量";
console.log(blockVar);
}
console.log(blockVar);
if (true) {
var oldVar = "旧变量";
}
console.log(oldVar);
5.5 闭包
function outer() {
let count = 0;
function inner() {
count++;
return count;
}
return inner;
}
const counter = outer();
console.log(counter());
console.log(counter());
console.log(counter());
function createCounter() {
let count = 0;
return {
increment: () => ++count,
decrement: () => --count,
getCount: () => count
};
}
const myCounter = createCounter();
console.log(myCounter.increment());
console.log(myCounter.increment());
console.log(myCounter.getCount());
5.6 高阶函数
function processArray(arr, callback) {
let result = [];
for (let item of arr) {
result.push(callback(item));
}
return result;
}
let numbers = [1, 2, 3, 4, 5];
let doubled = processArray(numbers, x => x * 2);
console.log(doubled);
function multiplyBy(factor) {
return function(number) {
return number * factor;
};
}
const double = multiplyBy(2);
const triple = multiplyBy(3);
console.log(double(5));
console.log(triple(5));
5.7 数组方法(函数式编程)
let numbers = [1, 2, 3, 4, 5];
let doubled = numbers.map(x => x * 2);
console.log(doubled);
let evens = numbers.filter(x => x % 2 === 0);
console.log(evens);
let sum = numbers.reduce((acc, x) => acc + x, 0);
console.log(sum);
numbers.forEach(x => console.log(x));
let found = numbers.find(x => x > 3);
console.log(found);
let hasEven = numbers.some(x => x % 2 === 0);
console.log(hasEven);
let allPositive = numbers.every(x => x > 0);
console.log(allPositive);
六、对象与数组
6.1 对象(Object)
let user = {
name: "张三",
age: 20,
email: "[email protected]",
sayHello: function() {
return "你好,我是" + this.name;
}
};
console.log(user.name);
console.log(user["age"]);
console.log(user.sayHello());
user.city = "北京";
user["country"] = "中国";
user.age = 21;
delete user.email;
console.log("name" in user);
console.log(user.hasOwnProperty("name"));
for (let key in user) {
console.log(key + ": " + user[key]);
}
console.log(Object.keys(user));
console.log(Object.values(user));
console.log(Object.entries(user));
6.2 数组(Array)
let fruits = ["苹果", "香蕉", "橙子"];
let numbers = new Array(1, 2, 3);
console.log(fruits[0]);
console.log(fruits.length);
fruits.push("葡萄");
fruits.unshift("草莓");
fruits.splice(2, 0, "芒果");
fruits.pop();
fruits.shift();
fruits.splice(1, 1);
console.log(fruits.indexOf("香蕉"));
console.log(fruits.includes("苹果"));
let numbers = [1, 2, 3, 4, 5];
let slice = numbers.slice(1, 3);
let combined = numbers.concat([6, 7]);
numbers.reverse();
let unsorted = [3, 1, 4, 1, 5];
unsorted.sort();
unsorted.sort((a, b) => b - a);
6.3 解构赋值(ES6)
let [a, b, c] = [1, 2, 3];
console.log(a, b, c);
let [x, , z] = [1, 2, 3];
console.log(x, z);
let [first, ...rest] = [1, 2, 3, 4, 5];
console.log(first);
console.log(rest);
let { name, age } = {name: "张三", age: 20, city: "北京"};
console.log(name, age);
let {name: userName, age: userAge} = {name: "张三", age: 20};
console.log(userName, userAge);
let {name = "匿名", age = 0} = {name: "张三"};
console.log(name, age);
let user = {name: "张三", address: {city: "北京", zipCode: "100000"}};
let {address: {city}} = user;
console.log(city);
七、字符串操作
7.1 字符串方法
let text = "Hello World";
console.log(text.length);
console.log(text.toUpperCase());
console.log(text.toLowerCase());
console.log(text.indexOf("World"));
console.log(text.lastIndexOf("o"));
console.log(text.includes("World"));
console.log(text.startsWith("Hello"));
console.log(text.endsWith("World"));
console.log(text.substring(0, 5));
console.log(text.slice(0, 5));
console.log(text.slice(-5));
console.log(text.replace("World", "JavaScript"));
console.log(text.replaceAll("l", "L"));
let words = text.split(" ");
let chars = text.split("");
let spaced = " Hello World ";
console.log(spaced.trim());
console.log(spaced.trimStart());
console.log(spaced.trimEnd());
console.log("Hello".repeat(3));
7.2 模板字符串(ES6)
let name = "张三";
let age = 20;
let message1 = "你好,我是" + name + ",今年" + age + "岁";
let message2 = `你好,我是${name},今年${age}岁`;
let multiLine = `
第一行
第二行
第三行
`;
let a = 5;
let b = 10;
let result = `${a} + ${b} = ${a + b}`;
function greet(name) {
return `你好,${name}!`;
}
let greeting = `${greet("张三")}`;
八、ES6+ 新特性
8.1 let 和 const
if (true) {
let x = 10;
}
console.log(x);
const PI = 3.14159;
PI = 3.14;
const user = {name: "张三"};
user.name = "李四";
user = {};
8.2 箭头函数
function add(a, b) {
return a + b;
}
const add2 = (a, b) => a + b;
let obj = {
name: "张三",
sayHello1: function() {
console.log("你好," + this.name);
},
sayHello2: () => {
console.log("你好," + this.name);
}
};
obj.sayHello1();
obj.sayHello2();
8.3 解构赋值
let [a, b] = [1, 2];
let {name, age} = {name: "张三", age: 20};
function greet({name, age}) {
return `你好,${name},${age}岁`;
}
8.4 展开运算符
let arr1 = [1, 2, 3];
let arr2 = [...arr1, 4, 5];
let obj1 = {a: 1, b: 2};
let obj2 = {...obj1, c: 3};
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3);
8.5 Promise 和 async/await
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("数据获取成功");
}, 1000);
});
}
fetchData().then(data => console.log(data)).catch(error => console.error(error));
async function getData() {
try {
let data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
8.6 类(Class,ES6)
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
return `你好,我是${this.name},${this.age}岁`;
}
}
let person = new Person("张三", 20);
console.log(person.sayHello());
class Student extends Person {
constructor(name, age, school) {
super(name, age);
this.school = school;
}
study() {
return `${this.name}在${this.school}学习`;
}
}
let student = new Student("李四", 18, "北京大学");
console.log(student.sayHello());
console.log(student.study());
九、异步编程
9.1 回调函数
function fetchData(callback) {
setTimeout(() => {
callback("数据获取成功");
}, 1000);
}
fetchData(function(data) {
console.log(data);
});
fetchData(function(data1) {
fetchData(function(data2) {
fetchData(function(data3) {
console.log(data1, data2, data3);
});
});
});
9.2 Promise
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
let success = true;
if (success) {
resolve("操作成功");
} else {
reject("操作失败");
}
}, 1000);
});
promise.then(result => {
console.log(result);
return "下一步";
}).then(result => {
console.log(result);
}).catch(error => {
console.error(error);
}).finally(() => {
console.log("完成");
});
Promise.all([fetchData1(), fetchData2(), fetchData3()]).then(results => {
console.log(results);
});
Promise.race([fetchData1(), fetchData2()]).then(result => {
console.log(result);
});
9.3 async/await
async function fetchUserData() {
try {
let user = await fetchUser();
let posts = await fetchPosts(user.id);
let comments = await fetchComments(posts[0].id);
return {user, posts, comments};
} catch (error) {
console.error("错误:", error);
throw error;
}
}
fetchUserData().then(data => console.log(data)).catch(error => console.error(error));
async function fetchAllData() {
let [user, posts, comments] = await Promise.all([
fetchUser(),
fetchPosts(),
fetchComments()
]);
return {user, posts, comments};
}
9.4 Fetch API
fetch("https://api.example.com/data").then(response => {
if (!response.ok) {
throw new Error("网络错误");
}
return response.json();
}).then(data => {
console.log(data);
}).catch(error => {
console.error("错误:", error);
});
async function fetchData() {
try {
let response = await fetch("https://api.example.com/data");
if (!response.ok) {
throw new Error("网络错误");
}
let data = await response.json();
console.log(data);
} catch (error) {
console.error("错误:", error);
}
}
async function postData(url, data) {
let response = await fetch(url, {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify(data)
});
return response.json();
}
十、DOM 操作
10.1 选择元素
let element = document.getElementById("myId");
let element2 = document.querySelector(".myClass");
let element3 = document.querySelector("#myId");
let elements = document.getElementsByClassName("myClass");
let elements2 = document.getElementsByTagName("div");
let elements3 = document.querySelectorAll(".myClass");
elements3.forEach(element => {
console.log(element);
});
10.2 修改内容
let element = document.getElementById("myId");
element.textContent = "新文本";
element.innerText = "新文本";
element.innerHTML = "<strong>新文本</strong>";
element.setAttribute("class", "newClass");
element.className = "newClass";
element.id = "newId";
element.style.color = "red";
element.style.fontSize = "20px";
element.style.backgroundColor = "yellow";
10.3 创建和删除元素
let newDiv = document.createElement("div");
newDiv.textContent = "新元素";
newDiv.className = "myClass";
let parent = document.getElementById("parent");
parent.appendChild(newDiv);
let beforeElement = document.getElementById("before");
parent.insertBefore(newDiv, beforeElement);
parent.removeChild(newDiv);
newDiv.remove();
10.4 事件处理
let button = document.getElementById("myButton");
button.addEventListener("click", function() {
console.log("按钮被点击了");
});
button.onclick = function() {
console.log("按钮被点击了");
};
button.addEventListener("click", function(event) {
console.log(event.target);
console.log(event.type);
event.preventDefault();
event.stopPropagation();
});
element.addEventListener("click", handler);
element.addEventListener("mouseenter", handler);
element.addEventListener("mouseleave", handler);
element.addEventListener("input", handler);
element.addEventListener("submit", handler);
element.addEventListener("load", handler);
十一、常见错误与调试
11.1 常见错误
console.log(undefinedVar);
let num = 10;
num.toUpperCase();
let x = 10;
let user = null;
console.log(user.name);
function test() {
if (true) {
var x = 10;
}
console.log(x);
}
11.2 调试技巧
console.log("变量值:", variable);
console.error("错误信息:", error);
console.warn("警告信息:", warning);
let users = [{name: "张三", age: 20}, {name: "李四", age: 25}];
console.table(users);
function complexFunction() {
debugger;
}
try {
let result = riskyOperation();
} catch (error) {
console.error("错误:", error.message);
} finally {
console.log("完成");
}
十二、最佳实践
12.1 代码风格
const PI = 3.14159;
let count = 0;
const add = (a, b) => a + b;
const message = `你好,${name}!`;
const {name, age} = user;
if (x === y) {
}
const userName = "张三";
12.2 性能优化
const element = document.getElementById("myId");
document.addEventListener("click", function(event) {
if (event.target.classList.contains("button")) {
}
});
(function() {
let localVar = "局部变量";
})();
let doubled = numbers.map(x => x * 2);
12.3 代码组织
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
import {add, subtract} from './math.js';
console.log(add(1, 2));
const Calculator = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b
};
class Calculator {
add(a, b) {
return a + b;
}
subtract(a, b) {
return a - b;
}
}
十三、总结
13.1 核心概念
- 变量:使用
let 和 const,避免 var
- 数据类型:8 种类型(Number、String、Boolean、Undefined、Null、Symbol、BigInt、Object)
- 函数:函数声明、函数表达式、箭头函数
- 对象和数组:解构赋值、展开运算符
- 异步编程:Promise、async/await
13.2 学习路径
- 基础语法:变量、数据类型、运算符、流程控制
- 函数:函数定义、参数、返回值、作用域
- 对象和数组:创建、访问、修改、遍历
- ES6+ 特性:let/const、箭头函数、解构、模板字符串
- 异步编程:Promise、async/await
- DOM 操作:选择元素、修改内容、事件处理
13.3 推荐资源
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online