1. 变量与数据类型
变量的声明
在 JavaScript 中,我们可以使用 var、let 和 const 这三种关键词来声明变量。下面是每种声明方式的详细解释和示例:
var 关键词
var 是 JavaScript 中最早用来声明变量的关键词。
var name = "Alice";console.log(name); // 输出:Alicevar name = "Bob";console.log(name); // 输出:Bob
它有一些特性需要注意:
- 变量可以重新声明。
- 变量提升,即变量可以在声明之前使用(但值为
undefined)。
let 关键词
let 是 ES6 引入的,用来声明局部变量,它比 var 更加严格和安全。
let age = 25;console.log(age); // 输出:25age = 26;console.log(age); // 输出:26
特性:
- 变量不能重新声明。
- 变量提升,但不能在声明之前使用。
const 关键词
const 也是 ES6 引入的,用来声明常量,一旦声明,不能更改。
const PI = 3.14;console.log(PI); // 输出:3.14// PI = 3.1415; // 会报错:Assignment to constant variable.
特性:
- 变量不能重新声明和更改。
- 变量提升,但不能在声明之前使用。
常见数据类型
JavaScript 提供了多种数据类型,分为原始类型和引用类型。
原始类型
- 数字(Number)
let count = 10;let price = 99.99;
- 字符串(String)
let greeting = "Hello, World!";
- 布尔值(Boolean)
let isActive = true;let isLogged = false;
- null
let emptyValue = null;
- undefined
let notAssigned;console.log(notAssigned); // 输出:undefined
引用类型
- 对象(Object)
let person = {name: "John",age: 30,};
- 数组(Array)
let numbers = [1, 2, 3, 4, 5];
- 函数(Function)
function greet() {console.log("Hello!");}
数据类型转换
JavaScript 允许我们在不同的数据类型之间进行转换。
显式转换
通过 JavaScript 提供的内置函数进行转换:
- 转为字符串
let num = 123;let str = String(num);console.log(str); // 输出:"123"
- 转为数字
let str = "123";let num = Number(str);console.log(num); // 输出:123
- 转为布尔值
let truthyStr = "Hello";let falsyStr = "";console.log(Boolean(truthyStr)); // 输出:trueconsole.log(Boolean(falsyStr)); // 输出:false
隐式转换
JavaScript 会在某些情况下自动进行类型转换:
- 字符串与数字相加
let result = 1 + "2";console.log(result); // 输出:"12"
- 布尔值与数字相乘
let result = true * 2;console.log(result); // 输出:2
2. 运算符与表达式
算术运算符
JavaScript 提供了多种算术运算符用于数学计算:
- 加法运算符 (+)
let sum = 10 + 5;console.log(sum); // 输出:15
- 减法运算符 (-)
let difference = 10 - 5;console.log(difference); // 输出:5
- 乘法运算符 (*)
let product = 10 * 5;console.log(product); // 输出:50
- 除法运算符 (/)
let quotient = 10 / 5;console.log(quotient); // 输出:2
- 取余运算符 (%)
let remainder = 10 % 3;console.log(remainder); // 输出:1
比较运算符
用于比较两个值,并返回布尔值:
- 等于 () 和全等 (=)
console.log(5 == "5"); // 输出:trueconsole.log(5 === "5"); // 输出:false
- 不等于 (!=) 和全不等 (!==)
console.log(5 != "5"); // 输出:falseconsole.log(5 !== "5"); // 输出:true
- 大于 (>) 和大于等于 (>=)
console.log(5 > 3); // 输出:trueconsole.log(5 >= 5); // 输出:true
- 小于 (<) 和小于等于 (<=)
console.log(5 < 3); // 输出:falseconsole.log(5 <= 5); // 输出:true
逻辑运算符
用于逻辑判断:
- 逻辑与 (&&)
console.log(true && false); // 输出:false
- 逻辑或 (||)
console.log(true || false); // 输出:true
- 逻辑非 (!)
console.log(!true); // 输出:false
3. 字符串操作
字符串的定义与操作
字符串可以用单引号、双引号或反引号定义:
let singleQuoteStr = "Hello";let doubleQuoteStr = "World";let templateStr = `Hello, World!`;
字符串连接与模板字符串
- 字符串连接
let greeting = "Hello, " + "World!";console.log(greeting); // 输出:"Hello, World!"
- 模板字符串
let name = "Alice";let greeting = `Hello, ${name}!`;console.log(greeting); // 输出:"Hello, Alice!"
常用字符串方法
- length 属性
let str = "Hello";console.log(str.length); // 输出:5
- toUpperCase() 和 toLowerCase() 方法
let str = "Hello";console.log(str.toUpperCase()); // 输出:HELLOconsole.log(str.toLowerCase()); // 输出:hello
- charAt() 方法
let str = "Hello";console.log(str.charAt(0)); // 输出:H
- substring() 方法
let str = "Hello, World!";console.log(str.substring(0, 5)); // 输出:Hello
- split() 方法
let str = "apple, banana, cherry";let fruits = str.split(", ");console.log(fruits); // 输出:["apple", "banana", "cherry"]
- trim() 方法
let str = " Hello, World! ";console.log(str.trim()); // 输出:"Hello, World!"
- replace() 方法
let str = "Hello, World!";let newStr = str.replace("World", "JavaScript");console.log(newStr); // 输出:"Hello, JavaScript!"
4. 数组
数组的定义与操作
数组是一种特殊的对象,用于存储有序的集合:
let fruits = ["apple", "banana", "cherry"];console.log(fruits[0]); // 输出:apple
常用数组方法
- push() 和 pop() 方法
let fruits = ["apple", "banana"];fruits.push("cherry");console.log(fruits); // 输出:["apple", "banana", "cherry"]let lastFruit = fruits.pop();console.log(lastFruit); // 输出:cherryconsole.log(fruits); // 输出:["apple", "banana"]
- shift() 和 unshift() 方法
let fruits = ["apple", "banana"];let firstFruit = fruits.shift();console.log(firstFruit); // 输出:appleconsole.log(fruits); // 输出:["banana"]fruits.unshift("cherry");console.log(fruits); // 输出:["cherry", "banana"]
- concat() 方法
let fruits1 = ["apple", "banana"];let fruits2 = ["cherry", "date"];let allFruits = fruits1.concat(fruits2);console.log(allFruits); // 输出:["apple", "banana", "cherry", "date"]
- slice() 方法
let fruits = ["apple", "banana", "cherry", "date"];let someFruits = fruits.slice(1, 3);console.log(someFruits); // 输出:["banana", "cherry"]
- splice() 方法
let fruits = ["apple", "banana", "cherry"];fruits.splice(1, 1, "date");console.log(fruits); // 输出:["apple", "date", "cherry"]
- indexOf() 方法
let fruits = ["apple", "banana", "cherry"];console.log(fruits.indexOf("banana")); // 输出:1
- includes() 方法
let fruits = ["apple", "banana", "cherry"];console.log(fruits.includes("banana")); // 输出:true
数组的迭代方法
- forEach() 方法
let fruits = ["apple", "banana", "cherry"];fruits.forEach(function (fruit) {console.log(fruit);});// 输出:// apple// banana// cherry
- map() 方法
let numbers = [1, 2, 3];let doubleNumbers = numbers.map(function (num) {return num * 2;});console.log(doubleNumbers); // 输出:[2, 4, 6]
- filter() 方法
let numbers = [1, 2, 3, 4, 5];let evenNumbers = numbers.filter(function (num) {return num % 2 === 0;});console.log(evenNumbers); // 输出:[2, 4]
- reduce() 方法
let numbers = [1, 2, 3, 4, 5];let sum = numbers.reduce(function (total, num) {return total + num;}, 0);console.log(sum); // 输出:15
