10.1 JavaScript概述
JavaScript 是一种广泛使用的轻量级编程语言,主要用于实现网页上的动态效果。它由 Netscape 公司在 1995 年开发,并成为了 Web 开发不可或缺的一部分。
10.1.1 JavaScript简介
1 简单性
JavaScript 设计之初就考虑到了非专业程序员的使用,因此它的语法相对简单,容易上手。
2 动态性
JavaScript 是一种解释型语言,代码可以在运行时被解释执行,这使得 JavaScript 具有高度的灵活性和动态性。
3 跨平台性
JavaScript 可以在多种操作系统和浏览器上运行,无需编译即可跨平台使用。
4 安全性
为了保护用户的安全,JavaScript 在浏览器中运行时受到沙箱环境的限制,不能直接访问用户的硬盘数据或执行其他可能危害系统的操作。
5 基于对象的语言
虽然 JavaScript 不是完全面向对象的编程语言,但它支持基于对象的编程方式,可以通过对象来组织代码,实现复杂的功能。
10.1.2 JavaScript入门案例
1. 用 JavaScript 输出文本
这是最基础的 JavaScript 案例,通过 alert、console.log 和 document.write 等方法在网页上显示文本。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JavaScript 输出文本</title>
</head>
<body><script>// 使用 alert 显示警告框alert('Hello, World!');// 使用 console.log 在控制台输出console.log('Hello, Console!');// 使用 document.write 在页面中输出document.write('Hello, Document!');</script>
</body>
</html>
说明:
- alert('Hello, World!'); 会在浏览器中弹出一个警告框,显示 "Hello, World!"。
- console.log('Hello, Console!'); 会在浏览器的开发者工具控制台中输出 "Hello, Console!"。
- document.write('Hello, Document!'); 会将 "Hello, Document!" 直接写入到 HTML 文档中。
2. 用 JavaScript 改变 HTML 元素
通过 JavaScript 可以动态地改变 HTML 元素的内容、属性或样式。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JavaScript 改变 HTML 元素</title>
</head>
<body><p id="demo">这是一个段落。</p><button onclick="changeText()">点击改变文本</button><script>function changeText() {document.getElementById('demo').innerHTML = '文本已被改变。';}</script>
</body>
</html>
说明:
- document.getElementById('demo') 通过 ID 选择器获取指定的 HTML 元素。
- innerHTML 属性用于设置或获取元素的 HTML 内容。
- οnclick="changeText()" 为按钮添加点击事件处理器,当按钮被点击时调用 changeText 函数。
3. 一个外部 JavaScript 文件
将 JavaScript 代码放在外部文件中,可以提高代码的可维护性和重用性。
HTML 文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>外部 JavaScript 文件</title>
</head>
<body><p id="external-demo">这是一个段落。</p><button onclick="externalChangeText()">点击改变文本</button><script src="external-script.js"></script>
</body>
</html>
外部 JavaScript 文件 (external-script.js):
function externalChangeText() {document.getElementById('external-demo').innerHTML = '文本已被外部脚本改变。';
}
说明:
- src="external-script.js" 通过 src 属性引入外部 JavaScript 文件。
- 外部 JavaScript 文件中的函数可以在 HTML 文件中调用。
4. 响应用户事件
JavaScript 可以监听和响应各种用户事件,如点击、双击、键盘输入等。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>响应用户事件</title>
</head>
<body><input type="text" id="input-text" placeholder="请输入文本"><p id="event-demo"></p><script>document.getElementById('input-text').addEventListener('keyup', function(event) {document.getElementById('event-demo').innerText = '你输入了: ' + event.target.value;});</script>
</body>
</html>
说明:
- addEventListener 方法用于为元素添加事件监听器。
- keyup 事件在用户释放键盘上的键时触发。
- event.target.value 获取输入框中的当前值。
5. 使用条件语句
JavaScript 中的条件语句(如 if...else)用于根据不同的条件执行不同的代码块。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>条件语句</title>
</head>
<body><input type="number" id="age-input" placeholder="请输入年龄"><button onclick="checkAge()">检查年龄</button><p id="age-result"></p><script>function checkAge() {var age = document.getElementById('age-input').value;if (age >= 18) {document.getElementById('age-result').innerText = '你已成年。';} else {document.getElementById('age-result').innerText = '你还未成年。';}}</script>
</body>
</html>
说明:
- if (age >= 18) 检查输入的年龄是否大于或等于 18。
- else 分支用于处理不符合条件的情况。
10.1.3 JavaScript放置的位置
1 head标记中的脚本
将 <script> 标签放在 <head> 标签内是一种常见的做法,特别是在需要在页面加载前执行某些初始化代码时。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JavaScript in Head</title><script>function initialize() {console.log('Page initialization');}window.onload = initialize;</script>
</head>
<body><h1>Welcome to My Website</h1>
</body>
</html>
优点:
- 确保在页面完全加载之前不会阻塞或运行 JavaScript 代码。
- 适合放置全局变量和函数定义,尤其是那些需要在页面加载时立即执行的代码。
缺点:
- 如果脚本较大,可能会延迟页面的渲染,导致用户看到空白页面。
- 不利于页面内容的快速呈现。
2 body标记中的脚本
将 <script> 标签放在 <body> 标签内,特别是放在页面内容的底部,是一种推荐的做法,可以确保页面内容在 JavaScript 代码执行前已经加载完毕。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JavaScript in Body</title>
</head>
<body><h1>Welcome to My Website</h1><p>This is some content.</p><script>function initialize() {console.log('Page initialization');}initialize();</script>
</body>
</html>
优点:
- 确保页面内容在 JavaScript 代码执行前已经加载完毕,提高用户体验。
- 适合放置需要操作 DOM 的代码,因为此时 DOM 已经构建完成。
缺点:
- 如果脚本需要在页面加载前执行,可能会导致延迟。
3 外部js文件中的脚本
将 JavaScript 代码放在外部文件中,然后通过 <script> 标签的 src 属性引入,是一种常见的做法,有助于代码的重用和维护。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>External JavaScript File</title>
</head>
<body><h1>Welcome to My Website</h1><p>This is some content.</p><script src="script.js"></script>
</body>
</html>
外部 JavaScript 文件 (script.js):
function initialize() {console.log('Page initialization');
}initialize();
优点:
- 代码重用性高,多个页面可以共享同一个 JavaScript 文件。
- 有利于代码的组织和维护,使 HTML 文件更加简洁。
- 浏览器可以缓存外部 JavaScript 文件,提高页面加载速度。
缺点:
- 需要额外的 HTTP 请求来获取外部文件,可能会增加页面的加载时间。
4 事件处理代码中的脚本
将 JavaScript 代码直接嵌入到 HTML 标签的事件属性中,如 onclick、onload 等,是一种内联的方式,适合简单的事件处理。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Inline Event Handlers</title>
</head>
<body><h1>Welcome to My Website</h1><button onclick="alert('Button clicked!')">Click Me</button>
</body>
</html>
优点:
- 简单直观,适用于简单的事件处理。
- 代码和事件处理逻辑紧密结合,便于理解。
缺点:
- 违反了内容与行为分离的原则,不利于代码的维护和复用。
- 如果页面中有大量内联 JavaScript,会导致 HTML 代码变得混乱且难以管理。
10.2 JavaScript语法
10.2.1 语法基础
1 区分大小写
JavaScript 是一种区分大小写的语言,这意味着变量名 myVariable 和 myvariable 被视为两个不同的变量。
2 变量不区分类型
JavaScript 是一种弱类型语言,变量在声明时不需要指定类型,类型会根据赋给变量的值自动确定。
3 每行代码结尾可以省略分号
虽然分号用于表示语句的结束,但在大多数情况下,JavaScript 解析器能够自动插入分号。
4 注释与C、C++、Java等语言相同
单行注释使用 //,多行注释使用 /* */
10.2.2 标识符和常用变量
1 标识符
用于命名变量、函数等的名称,必须以字母、下划线 _ 或美元符号 $ 开始,后续字符可以是字母、数字、下划线或美元符号。
2 变量声明
在 JavaScript 中,变量用于存储数据值。变量可以通过 var、let 或 const 关键字来声明。var 是最早的变量声明方式,但 let 和 const 是 ES6 引入的新关键字,提供了更好的块级作用域和常量支持。
示例代码:
var x = 10; // 使用 var 声明变量
let y = 20; // 使用 let 声明变量
const z = 30; // 使用 const 声明常量
注意事项:
- var 声明的变量具有函数级作用域,即使在块 {} 内声明,也会提升到函数顶部。
- let 和 const 声明的变量具有块级作用域,仅在声明它们的块 {} 内有效。
- const 声明的变量必须初始化,并且不能重新赋值,但如果是对象或数组,其属性或元素可以修改。
3 变量类型
- JavaScript 有多种数据类型,包括原始数据类型和引用数据类型。
原始数据类型:
- number:数字,包括整数和浮点数。
- string:字符串,可以使用单引号或双引号表示。
- boolean:布尔值,只有 true 和 false 两个值。
- null:表示空值或不存在的对象。
- undefined:表示未定义的值。
- symbol:ES6 引入的一种新数据类型,用于创建唯一的标识符。
- 引用数据类型:
- object:对象,可以包含多个属性和方法。
- array:数组,用于存储多个值。
- function:函数,可以作为值传递和返回。
示例代码:
let num = 10; // number
let str = "Hello, World!"; // string
let bool = true; // boolean
let n = null; // null
let u = undefined; // undefined
let sym = Symbol("key"); // symbol
let obj = { name: "Alice", age: 25 }; // object
let arr = [1, 2, 3]; // array
let func = function() { console.log("Hello"); }; // function
注意事项:
- typeof 运算符可以用于获取变量的数据类型。
- null 和 undefined 的 typeof 结果分别为 "object" 和 "undefined",这是 JavaScript 的一个历史遗留问题。
10.2.3 运算符与表达式
1 算术运算符和表达式
- +:加法
- -:减法
- *:乘法
- /:除法
- %:取模
- **:幂运算
示例代码:
let a = 10;
let b = 5;
console.log(a + b); // 15
console.log(a - b); // 5
console.log(a * b); // 50
console.log(a / b); // 2
console.log(a % b); // 0
console.log(a ** b); // 100000
2 关系运算符和表达式
==
:等于===
:严格等于(值和类型都相等)!=
:不等于!==
:严格不等于>
:大于<
:小于>=
:大于等于<=
:小于等于
示例代码:
let x = 10;
let y = "10";
console.log(x == y); // true
console.log(x === y); // false
console.log(x != y); // false
console.log(x !== y); // true
console.log(x > y); // false
console.log(x < y); // false
console.log(x >= y); // true
console.log(x <= y); // true
3 逻辑运算符和表达式
&&
:逻辑与||
:逻辑或!
:逻辑非
示例代码:
let p = true;
let q = false;
console.log(p && q); // false
console.log(p || q); // true
console.log(!p); // false
4 赋值运算符和表达式
=
:简单赋值+=
:加法赋值-=
:减法赋值*=
:乘法赋值/=
:除法赋值%=
:取模赋值**=
:幂赋值
示例代码:
let a = 10;
a += 5; // a = a + 5
console.log(a); // 15
a -= 3; // a = a - 3
console.log(a); // 12
a *= 2; // a = a * 2
console.log(a); // 24
a /= 4; // a = a / 4
console.log(a); // 6
a %= 2; // a = a % 2
console.log(a); // 0
a **= 2; // a = a ** 2
console.log(a); // 0
5 条件运算符和表达式
条件运算符(三目运算符)用于在一行代码中完成条件判断和赋值操作。语法如下:
condition ? expr1 : expr2
示例代码:
let age = 20;
let message = (age >= 18) ? "成年人" : "未成年人";
console.log(message); // 成年人
注意事项:
- 条件运算符的优先级较高,使用时需要注意括号的使用。
6 逗号运算符和表达式
表达式是由一个或多个变量、常量、运算符和括号组成的序列。它可以是一个简单的值,也可以是一个复杂的计算过程。表达式求值按运算符的优先级和结合性规定的顺序进行。
示例代码:
let a = 10;
let b = 5;
let c = 3;let result = (a + b) * c;
console.log(result); // 45
注意事项:
- 括号可以改变运算符的优先级。
- 表达式可以嵌套使用,形成更复杂的逻辑。
7. 位运算符
位运算符用于对二进制数进行位操作。JavaScript 支持的位运算符如下:
&
:按位与|
:按位或^
:按位异或~
:按位非<<
:左移>>
:右移>>>
:无符号右移
示例代码:
let a = 5; // 二进制 0101
let b = 3; // 二进制 0011console.log(a & b); // 1 (二进制 0001)
console.log(a | b); // 7 (二进制 0111)
console.log(a ^ b); // 6 (二进制 0110)
console.log(~a); // -6 (二进制 1010)
console.log(a << 1); // 10 (二进制 1010)
console.log(a >> 1); // 2 (二进制 0010)
console.log(a >>> 1); // 2 (二进制 0010)
注意事项:
- 位运算符通常用于低级别的数据操作,如图像处理、网络通信等。
10.2.4 程序设计
1 条件分支语句
条件语句:
if
语句if-else
语句if-else if-else
语句switch
语句
示例代码:
let age = 20;if (age < 18) {console.log("未成年");
} else if (age >= 18 && age < 60) {console.log("成年");
} else {console.log("老年");
}let grade = "A";switch (grade) {case "A":console.log("优秀");break;case "B":console.log("良好");break;case "C":console.log("及格");break;default:console.log("不及格");
}
2 循环语句
for
循环while
循环do-while
循环for-in
循环for-of
循环
示例代码:
// for 循环
for (let i = 0; i < 5; i++) {console.log(i);
}// while 循环
let j = 0;
while (j < 5) {console.log(j);j++;
}// do-while 循环
let k = 0;
do {console.log(k);k++;
} while (k < 5);// for-in 循环
let obj = { a: 1, b: 2, c: 3 };
for (let key in obj) {console.log(key, obj[key]);
}// for-of 循环
let arr = [1, 2, 3, 4, 5];
for (let value of arr) {console.log(value);
}
10.2.5 函数
1 定义函数
在JavaScript中,定义一个函数的基本语法如下:
function functionName(parameters) {// 函数体// 执行的代码[return returnValue;]
}
- function 关键字用于声明一个函数。
- functionName 是函数的名字,必须在同一个页面中是唯一的,并且区分大小写。
- parameters 是可选的参数列表,多个参数之间用逗号分隔。
- 函数体是包含在大括号 {} 中的代码块,用于实现函数的功能。
- return 关键字是可选的,用于返回函数的值。如果没有 return 语句,函数默认返回 undefined。
示例:定义一个简单的函数,用于在页面上输出“你好”。
function sayHello() {document.write('你好');
}
2 函数调用
定义了函数之后,需要通过调用函数来执行其中的代码。调用函数的基本语法如下:
functionName(arguments);
functionName
是要调用的函数的名字。arguments
是传递给函数的实际参数,多个参数之间用逗号分隔。
示例:调用上面定义的 sayHello
函数。
sayHello();
3. 函数参数
函数参数分为形式参数(形参)和实际参数(实参):
- 形参:在定义函数时指定的参数,用于接收调用函数时传递的实际值。
- 实参:在调用函数时传递的实际值。
示例:定义一个带有参数的函数,用于计算两个数的和。
function addNumbers(num1, num2) {return num1 + num2;
}let result = addNumbers(5, 3);
console.log(result); // 输出 8
4 函数返回值
函数可以通过 return
语句返回一个值。返回值可以是任意类型的值,包括数字、字符串、对象、数组等。
示例:定义一个返回最大值的函数。
function max(a, b) {if (a > b) {return a;} else {return b;}
}let maxValue = max(10, 20);
console.log(maxValue); // 输出 20
5. 函数的作用域
- 在JavaScript中,变量的作用域决定了变量的可见性和生命周期。主要有两种作用域:
- 全局作用域:在函数外部声明的变量具有全局作用域,可以在整个页面中访问。
- 局部作用域:在函数内部声明的变量具有局部作用域,只能在函数内部访问。
示例:展示全局变量和局部变量的区别。
let globalVar = '我是全局变量';function myFunction() {let localVar = '我是局部变量';console.log(globalVar); // 输出 '我是全局变量'console.log(localVar); // 输出 '我是局部变量'
}myFunction();
console.log(globalVar); // 输出 '我是全局变量'
console.log(localVar); // 报错:localVar is not defined
10.3 JavaScript对象
10.3.1 对象基础
1 概述
在 JavaScript 中,对象是一种复杂的数据类型,它可以包含多个属性和方法。属性是与对象关联的值,而方法是在对象上执行的动作。对象可以用来表示现实世界中的实体,例如一个人、一辆车等。
示例:创建一个表示人的对象。
let person = {name: 'Alice',age: 30,greet: function() {console.log(`你好,${this.name}!`);}
};
在这个例子中,person 对象有两个属性 name 和 age,以及一个方法 greet。
2. 创建对象的方式
JavaScript 提供了多种创建对象的方式,包括对象字面量、构造函数、Object.create 方法等。
2.1 对象字面量
对象字面量是最简单和常用的创建对象的方式,通过一对大括号 {} 包含键值对来定义对象。
示例:
let person = {name: 'Alice',age: 30,greet: function() {console.log(`你好,${this.name}!`);}
};
2.2 构造函数
构造函数是一种特殊的函数,用于创建和初始化对象。构造函数的名称通常首字母大写,以区别于普通函数。
示例:
function Person(name, age) {this.name = name;this.age = age;this.greet = function() {console.log(`你好,${this.name}!`);};
}let alice = new Person('Alice', 30);
alice.greet(); // 输出 '你好,Alice!'
2.3 Object.create
方法
Object.create
方法用于创建一个新对象,并指定其原型对象。
示例:
let personPrototype = {greet: function() {console.log(`你好,${this.name}!`);}
};let alice = Object.create(personPrototype);
alice.name = 'Alice';
alice.age = 30;alice.greet(); // 输出 '你好,Alice!'
3. 访问和修改对象的属性
3.1 访问属性
可以通过点操作符 .
或方括号 []
来访问对象的属性。
示例:
let person = {name: 'Alice',age: 30
};console.log(person.name); // 输出 'Alice'
console.log(person['age']); // 输出 30
3.2 修改属性
同样可以通过点操作符 .
或方括号 []
来修改对象的属性。
示例:
let person = {name: 'Alice',age: 30
};person.name = 'Bob';
person['age'] = 31;console.log(person.name); // 输出 'Bob'
console.log(person.age); // 输出 31
3.3 添加属性
可以在对象中动态地添加新的属性。
示例:
let person = {name: 'Alice'
};person.age = 30;
person['job'] = 'Engineer';console.log(person); // 输出 { name: 'Alice', age: 30, job: 'Engineer' }
3.4 删除属性
可以使用 delete
关键字来删除对象的属性。
示例:
let person = {name: 'Alice',age: 30
};delete person.age;
console.log(person); // 输出 { name: 'Alice' }
4. 对象的方法
方法是对象中的函数。可以通过点操作符 .
或方括号 []
来调用对象的方法。
示例:
let person = {name: 'Alice',age: 30,greet: function() {console.log(`你好,${this.name}!`);}
};person.greet(); // 输出 '你好,Alice!'
person['greet'](); // 输出 '你好,Alice!'
10.3.2 常用对象
1 window对象
代表浏览器窗口,是所有 JavaScript 全局对象、函数和变量的父对象。
2 document对象
提供对文档的操作接口,可以用来获取和修改页面内容。
3 location对象
包含有关当前 URL 的信息,以及用于导航的方法。
4 navigator对象
提供了关于浏览器的信息。
5 screen对象
提供了有关用户屏幕的信息。
6 其他对象
Array 对象
Array 对象用于创建和操作数组。数组是存储多个值的有序集合。
常用方法:
- push(element, ..., elementN):向数组末尾添加一个或多个元素,并返回新的长度。
- pop():删除数组的最后一个元素,并返回该元素。
- shift():删除数组的第一个元素,并返回该元素。
- unshift(element, ..., elementN):向数组开头添加一个或多个元素,并返回新的长度。
- splice(start, deleteCount, item1, ..., itemN):从数组中添加或删除元素。
- slice(start, end):返回从开始到结束(不包括结束)的数组的一部分浅拷贝。
- map(callback, thisArg):创建一个新数组,其结果是该数组每个元素调用一个提供的函数。
- filter(callback, thisArg):创建一个新数组,包含通过测试的元素。
- reduce(callback, initialValue):对数组中的每个元素执行一个提供的函数,将其结果汇总为单个值。
- forEach(callback, thisArg):对数组中的每个元素执行一次提供的函数。
示例:
let numbers = [1, 2, 3, 4, 5];numbers.push(6);
console.log(numbers); // 输出 [1, 2, 3, 4, 5, 6]numbers.pop();
console.log(numbers); // 输出 [1, 2, 3, 4, 5]numbers.shift();
console.log(numbers); // 输出 [2, 3, 4, 5]numbers.unshift(1);
console.log(numbers); // 输出 [1, 2, 3, 4, 5]numbers.splice(1, 1, 2.5);
console.log(numbers); // 输出 [1, 2.5, 3, 4, 5]let part = numbers.slice(1, 3);
console.log(part); // 输出 [2.5, 3]let doubled = numbers.map(x => x * 2);
console.log(doubled); // 输出 [2, 5, 6, 8, 10]let even = numbers.filter(x => x % 2 === 0);
console.log(even); // 输出 [2, 4]let sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 输出 15numbers.forEach(x => console.log(x)); // 输出 1 2.5 3 4 5
String 对象
String 对象用于创建和操作字符串。字符串是不可变的字符序列。
常用方法:
- length:返回字符串的长度。
- charAt(index):返回指定位置的字符。
- charCodeAt(index):返回指定位置字符的 Unicode 编码。
- concat(str1, ..., strN):连接两个或多个字符串。
- indexOf(searchValue, fromIndex):返回指定值首次出现的位置。
- lastIndexOf(searchValue, fromIndex):返回指定值最后一次出现的位置。
- includes(searchValue, position):判断字符串是否包含指定的子字符串。
- startsWith(searchValue, position):判断字符串是否以指定的子字符串开头。
- endsWith(searchValue, length):判断字符串是否以指定的子字符串结尾。
- split(separator, limit):将字符串分割为数组。
- trim():去除字符串两端的空白字符。
- toLowerCase():将字符串转换为小写。
- toUpperCase():将字符串转换为大写。
- replace(searchValue, replaceValue):替换字符串中的指定子字符串。
- match(regexp):在字符串中执行正则表达式匹配。
示例
let str = 'Hello, World!';console.log(str.length); // 输出 13
console.log(str.charAt(0)); // 输出 'H'
console.log(str.charCodeAt(0)); // 输出 72let combined = str.concat(' How are you?');
console.log(combined); // 输出 'Hello, World! How are you?'console.log(str.indexOf('World')); // 输出 7
console.log(str.lastIndexOf('l')); // 输出 10console.log(str.includes('World')); // 输出 true
console.log(str.startsWith('Hello')); // 输出 true
console.log(str.endsWith('!')); // 输出 truelet words = str.split(', ');
console.log(words); // 输出 ['Hello', ' World!']console.log(str.trim()); // 输出 'Hello, World!'
console.log(str.toLowerCase()); // 输出 'hello, world!'
console.log(str.toUpperCase()); // 输出 'HELLO, WORLD!'let replaced = str.replace('World', 'JavaScript');
console.log(replaced); // 输出 'Hello, JavaScript!'let matched = str.match(/\w+/g);
console.log(matched); // 输出 ['Hello', 'World']
Number 对象
Number 对象用于创建和操作数字。Number 对象提供了许多静态属性和方法,用于处理数字。
常用方法:
- toString(radix):将数字转换为字符串,可以指定进制。
- toFixed(digits):将数字转换为字符串,保留指定的小数位数。
- toPrecision(precision):将数字转换为字符串,保留指定的有效数字。
- parseInt(string, radix):解析字符串并返回整数。
- parseFloat(string):解析字符串并返回浮点数。
- isNaN(value):判断值是否为 NaN。
- isFinite(value):判断值是否为有限的。
- isInteger(value):判断值是否为整数。
- parseFloat(string):解析字符串并返回浮点数。
示例:
let num = 123.456;console.log(num.toString()); // 输出 '123.456'
console.log(num.toString(16)); // 输出 '7b.7333333333333'console.log(num.toFixed(2)); // 输出 '123.46'
console.log(num.toPrecision(4)); // 输出 '123.5'console.log(Number.parseInt('123', 10)); // 输出 123
console.log(Number.parseFloat('123.456')); // 输出 123.456console.log(Number.isNaN('123')); // 输出 false
console.log(Number.isNaN(NaN)); // 输出 trueconsole.log(Number.isFinite(123)); // 输出 true
console.log(Number.isFinite(Infinity)); // 输出 falseconsole.log(Number.isInteger(123)); // 输出 true
console.log(Number.isInteger(123.456)); // 输出 false
Boolean
对象
Boolean
对象用于创建和操作布尔值。布尔值只有两个可能的值:true
和 false
。
常用方法:
Boolean(value)
:将值转换为布尔值。
示例:
console.log(Boolean(1)); // 输出 true
console.log(Boolean(0)); // 输出 false
console.log(Boolean('Hello')); // 输出 true
console.log(Boolean('')); // 输出 false
console.log(Boolean([])); // 输出 true
console.log(Boolean({})); // 输出 true
console.log(Boolean(null)); // 输出 false
console.log(Boolean(undefined)); // 输出 false
Date 对象
Date 对象用于创建和操作日期和时间。Date 对象提供了许多方法,用于获取和设置日期和时间。
常用方法:
- new Date():创建一个新的 Date 对象,表示当前日期和时间。
- new Date(dateString):创建一个新的 Date 对象,表示指定的日期字符串。
- new Date(year, month, day, hours, minutes, seconds, milliseconds):创建一个新的 Date 对象,表示指定的日期和时间。
- getFullYear():返回四位数的年份。
- getMonth():返回月份(0 表示 1 月,11 表示 12 月)。
- getDate():返回月份中的日期(1 到 31)。
- getDay():返回星期几(0 表示星期日,1 表示星期一,依此类推)。
- getHours():返回小时(0 到 23)。
- getMinutes():返回分钟(0 到 59)。
- getSeconds():返回秒(0 到 59)。
- getMilliseconds():返回毫秒(0 到 999)。
- getTime():返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。
- toISOString():返回 ISO 8601 格式的日期字符串。
- toLocaleDateString():返回本地格式的日期字符串。
- toLocaleTimeString():返回本地格式的时间字符串。
- setFullYear(year, month, day):设置年份、月份和日期。
- setMonth(month, day):设置月份和日期。
- setDate(date):设置日期。
- setHours(hours, minutes, seconds, milliseconds):设置小时、分钟、秒和毫秒。
- setMinutes(minutes, seconds, milliseconds):设置分钟、秒和毫秒。
- setSeconds(seconds, milliseconds):设置秒和毫秒。
- setMilliseconds(milliseconds):设置毫秒。
- setTime(time):设置自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。
示例:
let now = new Date();
console.log(now); // 输出当前日期和时间let date = new Date('2023-10-10');
console.log(date); // 输出 2023-10-10T00:00:00.000Zlet customDate = new Date(2023, 9, 10, 12, 30, 0, 0);
console.log(customDate); // 输出 2023-10-10T12:30:00.000Zconsole.log(now.getFullYear()); // 输出 2023
console.log(now.getMonth()); // 输出 9
console.log(now.getDate()); // 输出 10
console.log(now.getDay()); // 输出 2
console.log(now.getHours()); // 输出 12
console.log(now.getMinutes()); // 输出 30
console.log(now.getSeconds()); // 输出 0
console.log(now.getMilliseconds()); // 输出 0
console.log(now.getTime()); // 输出 1696938600000
console.log(now.toISOString()); // 输出 2023-10-10T12:30:00.000Z
console.log(now.toLocaleDateString()); // 输出 10/10/2023
console.log(now.toLocaleTimeString()); // 输出 12:30:00 PMnow.setFullYear(2024);
console.log(now.getFullYear()); // 输出 2024now.setMonth(10);
console.log(now.getMonth()); // 输出 10now.setDate(15);
console.log(now.getDate()); // 输出 15now.setHours(18, 30, 0, 0);
console.log(now.getHours()); // 输出 18
console.log(now.getMinutes()); // 输出 30
console.log(now.getSeconds()); // 输出 0
console.log(now.getMilliseconds()); // 输出 0now.setMilliseconds(500);
console.log(now.getMilliseconds()); // 输出 500now.setTime(1702176600000);
console.log(now); // 输出 2023-12-10T12:30:00.000Z
10.4 JavaScript事件
1. 事件的基本概念
事件是指在特定条件下执行的代码块,通常是由用户的交互行为触发的。在 JavaScript 中,事件可以是用户的鼠标点击、键盘按键、页面加载、表单提交等。当事件被触发时,JavaScript 会自动执行与该事件相关的代码块,从而实现特定的功能。
事件处理程序(Event Handler)是一段 JavaScript 代码,总是与页面中的特定部分以及一定的事件相关联。当与页面特定部分相关联的事件发生时,事件处理程序就会被调用。
2. 事件处理方式
JavaScript 提供了多种方式来处理事件,主要包括以下三种:
HTML 事件处理程序:直接在 HTML 元素中添加事件处理程序。
<button onclick="alert('Hello, World!')">Click Me</button>
2.DOM0 级事件处理程序:通过 JavaScript 为元素添加事件处理程序。
<button id="myButton">Click Me</button>
<script>document.getElementById('myButton').addEventListener('click', function() {alert('Hello, World!');});
</script>
注意:HTML 事件处理程序虽然简单易用,但由于其耦合性较高,不推荐在大型项目中使用。DOM0 级事件处理程序和 DOM2 级事件处理程序是更推荐的方式,尤其是 DOM2 级事件处理程序,因为它支持同一个事件绑定多个处理程序。
3. 事件对象
当事件被触发时,会生成一个事件对象(Event Object),该对象包含了与事件相关的信息。事件对象作为参数传递给事件处理程序函数。通过事件对象,可以获取事件的详细信息,如事件类型、事件目标、事件的坐标等。
常用属性:
- type:事件的类型,如 'click'、'mouseover' 等。
- target:事件的目标元素,即触发事件的元素。
- currentTarget:当前绑定事件处理程序的元素。
- bubbles:事件是否冒泡。
- cancelable:事件是否可以取消。
- defaultPrevented:是否调用了 preventDefault 方法。
- eventPhase:事件当前处于哪个阶段(捕获、目标、冒泡)。
- timeStamp:事件生成的时间戳。
- clientX 和 clientY:鼠标相对于视口的坐标。
- pageX 和 pageY:鼠标相对于页面的坐标。
常用方法:
- stopPropagation():阻止事件继续在 DOM 树中传播。
- stopImmediatePropagation():阻止事件继续在 DOM 树中传播,并阻止其他事件处理程序被调用。
- preventDefault():阻止事件的默认行为。
示例:
<button id="myButton">Click Me</button>
<script>document.getElementById('myButton').addEventListener('click', function(event) {console.log('Event Type:', event.type);console.log('Event Target:', event.target);console.log('Current Target:', event.currentTarget);console.log('Client X:', event.clientX);console.log('Client Y:', event.clientY);console.log('Page X:', event.pageX);console.log('Page Y:', event.pageY);event.preventDefault(); // 阻止默认行为event.stopPropagation(); // 阻止事件传播});
</script>
4. 事件流
事件流描述了页面中接受事件的顺序。在浏览器发展的初期,两大浏览器厂商 IE 和 Netscape 对事件流的解释出现了两种截然相反的定义:
- 事件捕获(Event Capturing):事件最早由不太具体的节点接收,而最具体的节点最后接收到事件。即事件从外向内传播。
- 事件冒泡(Event Bubbling):事件最开始由最具体的元素接收,然后逐级向上传播至最不具体的节点(文档)。即事件从内向外传播。
现代浏览器支持两种事件流,但默认情况下使用事件冒泡。可以通过 addEventListener 的第三个参数来指定事件处理程序是在捕获阶段还是冒泡阶段执行。
示例:
<div id="outer">Outer Div<div id="inner">Inner Div</div>
</div>
<script>document.getElementById('outer').addEventListener('click', function(event) {console.log('Outer Div Clicked (Capturing)');}, true); // 捕获阶段document.getElementById('inner').addEventListener('click', function(event) {console.log('Inner Div Clicked (Bubbling)');}); // 默认为冒泡阶段
</script>
5. 常见的事件类型
鼠标事件:
- click:用户单击主鼠标按钮或按下在聚焦时按下回车键时触发。
- dblclick:用户双击主鼠标按键触发。
- mousedown:用户按下鼠标任意按键时触发。
- mouseup:用户抬起鼠标任意按键时触发。
- mousemove:鼠标在元素上移动时触发。
- mouseover:鼠标进入元素时触发。
- mouseout:鼠标离开元素时触发。
- mouseenter:鼠标进入元素时触发,该事件不会冒泡。
- mouseleave:鼠标离开元素时触发,该事件不会冒泡。
键盘事件:
- keydown:按下键盘上任意键触发,如果按住不放,会重复触发此事件。
- keypress:按下键盘上一个字符键时触发。
- keyup:抬起键盘上任意键触发。
表单事件:
- focus:元素获得焦点时触发。
- blur:元素失去焦点时触发。
- change:表单元素的值发生变化并失去焦点时触发。
- input:表单元素的值发生变化时立即触发。
- submit:表单提交时触发。
- reset:表单重置时触发。
窗口事件:
- load:页面或某个元素加载完成后触发。
- unload:页面或某个元素卸载时触发。
- resize:窗口或某个元素的大小发生变化时触发。
- scroll:窗口或某个元素发生滚动时触发。
- beforeunload:窗口关闭前触发,可以阻止关闭窗口。
其他事件:
- error:发生错误时触发。
- contextmenu:用户右键点击时触发。
- copy、cut、paste:复制、剪切、粘贴事件。
- drag、dragstart、dragend、dragover、drop:拖放事件。
示例:
<input type="text" id="myInput">
<script>document.getElementById('myInput').addEventListener('input', function(event) {console.log('Input changed:', event.target.value);});window.addEventListener('resize', function(event) {console.log('Window resized:', window.innerWidth, 'x', window.innerHeight);});window.addEventListener('scroll', function(event) {console.log('Window scrolled:', window.scrollY);});
</script>
6. 事件委托
事件委托是一种优化事件处理的技术,通过将事件处理程序绑定到父元素上,利用事件冒泡的特性来处理子元素的事件。这样可以减少事件处理程序的数量,提高性能。
示例:
<ul id="list"><li>Item 1</li><li>Item 2</li><li>Item 3</li>
</ul>
<script>document.getElementById('list').addEventListener('click', function(event) {if (event.target.tagName === 'LI') {console.log('Clicked item:', event.target.textContent);}});
</script>
案例
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>onLoad事件</title></head><body onload="checkCookies()"><script type="text/javascript">function checkCookies () {if(navigator.cookieEnabled==true)alert("已启用Cookies");elsealert("未启用Cookies");}</script><p>提示框会告诉你,浏览器是否已启用Cookies。</p></body>
</html>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>onchange事件</title><script type="text/javascript">function myFunction(){var x=document.getElementById("fname");x.value=x.value.toUpperCase();}</script></head><body>请输入英文字符:<input type="text" id="fname" onchange="myFunction()"/><p>当您离开输入字段时,会触发将输入文本转换为大写的函数。</p></body>
</html>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>鼠标事件</title><script type="text/javascript">function mouseOver(obj){obj.style.color="blue";obj.innerHTML="把鼠标移开"}function mouseOut(obj){obj.style.color="red";obj.innerHTML="把鼠标移到上面"}function mouseDown(obj){obj.style.backgroundColor="blue";obj.innerHTML="请释放鼠标按钮";}function mouseUp(obj){obj.style.backgroundColor="red";obj.innerHTML="请按下鼠标按钮";}</script></head><body><div onmouseover="mouseOver(this)" onmouseout="mouseOut(this)" style="background-color: green;width: 120px;height: 20px;padding: 20px;color: #ffffff;">把鼠标移到上面</div><br /><div onmousedown="mouseDown(this)" onmouseup="mouseUp(this)" style="background-color: green;width: 120px;height: 20px;padding: 20px;color: #ffffff;">请按下鼠标按钮</div></body>
</html>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>键盘事件</title><script type="text/javascript">function keyDown(){alert("你按下了按键");if(event.ctrlKey){alert("你按下了Ctrl键");}}function keyPress(){alert("你按下了键,并且释放了按键");}</script></head><body onkeydown="keyDown()" onkeypress="keyPress()"></body>
</html>
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>图片轮播效果</title><style type="text/css">*{margin: 0;padding: 0;text-decoration: none;}body{padding: 20px;}#container{position: relative;width: 600px;height: 400px;border:1px solid #333;overflow:hidden;margin-left: auto;margin-right: auto;}#list{position: absolute;z-index: 1;width: 4200px;height: 400px;}#list img{float: left;width: 600px;height: 400px;}#buttons{position: absolute;left: 250px;bottom: 20px;z-index: 2;height: 10px;width: 100px;}#buttons span{float: left;margin-right: 5px;width: 10px;height: 10px;border: 1px solid #fff;border-radius: 50%;background: #333;cursor: pointer;}#buttons.on{background: orangered;}.arrow{position: absolute;top: 180px;z-index: 2;display: none;width: 40px;height: 40px;font-size: 36px;font-weight: bold;line-height: 39px;text-align: center;color: #fff;background-color: RGBA(0,0,0,.3);cursor: pointer;}.arrow:hover{background-color: RGBA(0,0,0,.7);}#container:hover.arrow{display: block;}#prev{left: 20px;}#next{right: 20px;}</style><script type="text/javascript">window.onload=function(){var container=document.getElementById('container');var list=document.getElementById('list');var buttons=document.getElementById('buttons').getElementsByTagName('span');var prev=document.getElementById('prev');var next=document.getElementById('next');var index=1;var timer;function animate(offset){var newLeft=parseInt(list.style.left)+offset;list.style.left=newLeft+'px';//无限滚动判断if(newLeft>-600){list.style.left=-3000+'px';}if(newLeft<-3000){list.style.left=-600+'px';}} function play(){// 重复执行的定时器timer=setInterval(function(){next.onclick();},2000)}function stop(){clearInterval(timer);}function buttonsShow(){// 将之前的小圆点的样式清楚for(var i=0;i<buttons.length;i++){if(buttons[i].className=="on"){buttons[i].className="";}}// 数组从0开始,index需要减1buttons[index-1].className="on";}prev.onclick=function(){index-=1;if(index<1){index=5}buttonsShow();animate(600);};next.onclick=function(){index+=1;if(index>5){index=1}animate(-600);buttonsShow();};for(var i=0;i<buttons.length;i++){(function(i){buttons[i].onclick=function(){var clickIndex=parseInt(this.getAttribute('index'));var offset=600*(index-clickIndex);animate(offset);index=clickIndex;buttonsShow();}})(i)}container.onmouseover=stop;container.onmouseout=play;play();}</script></head><body><div id="container"><div id="list" style="left: -600px;"><img src="img/p5.jpg" alt="5"/><img src="img/p1.jpg" alt="1"/><img src="img/p2.jpg" alt="2"/><img src="img/p3.jpg" alt="3"/><img src="img/p4.jpg" alt="4"/><img src="img/p5.jpg" alt="5"/><img src="img/p1.jpg" alt="5"/></div><div id="buttons"><span index="1" class="on"></span><span index="2"></span><span index="3"></span><span index="4"></span><span index="5"></span></div><a href="javascript:;" id="prev" class="arrow"><</a><a href="javascript:;" id="next" class="arrow">></a></div></body>
</html>