第8章:方法(Methods)
一、导读
1.1 本章学习目标
第8章讲解 JavaScript 的标准方法。理解内置方法的行为和陷阱是编写可靠代码的基础。
1.2 为什么第八章如此重要
JavaScript 的内置方法有很多不直观的行为。理解这些方法才能真正使用它们。
1.3 核心问题引导
Array 方法有哪些陷阱?
Function 的 call/apply/bind 有什么区别?
String 方法如何处理 Unicode?
Number 方法有哪些注意事项?
二、核心概念详解
8.1 Array 方法
javascript
// 注意:sort 默认按字符串排序
[10, 2, 30].sort(); // [10, 2, 30](不是 [2, 10, 30])
[10, 2, 30].sort((a, b) => a - b); // [2, 10, 30]
// splice vs slice
var a = [1, 2, 3, 4, 5];
a.splice(1, 2); // [2, 3](修改原数组)
a; // [1, 4, 5]
a.slice(1, 3); // [4, 5](不修改原数组)
// forEach 不能 break
a.forEach(function(item) {
if (item === 3) return; // 只是跳过当前迭代
// 不能 break
});
// 使用 for...of 可以 break
for (var item of a) {
if (item === 3) break;
}8.2 Function 方法
javascript
function greet(greeting, punctuation) {
return greeting + ", " + this.name + punctuation;
}
var person = {name: "Alice"};
// call:逐个传参
greet.call(person, "Hello", "!"); // "Hello, Alice!"
// apply:数组传参
greet.apply(person, ["Hi", "!!"]); // "Hi, Alice!!"
// bind:返回新函数
var boundGreet = greet.bind(person);
boundGreet("Hey", "..."); // "Hey, Alice..."8.3 String 方法
javascript
var s = "Hello, World!";
s.charAt(0); // "H"
s.charCodeAt(0); // 72
s.indexOf("World"); // 7
s.slice(0, 5); // "Hello"
s.substring(0, 5); // "Hello"
s.toUpperCase(); // "HELLO, WORLD!"
s.trim(); // 去除两端空白
s.replace("World", "JS"); // "Hello, JS!"
s.split(", "); // ["Hello", "World!"]
s.match(/World/); // ["World"]
s.search(/World/); // 7三、实战案例
8.1 安全的数组操作
javascript
// 安全的数组删除
function removeAt(arr, index) {
if (index < 0 || index >= arr.length) return arr;
return arr.slice(0, index).concat(arr.slice(index + 1));
}
// 安全的数组查找
function findIndex(arr, predicate) {
for (var i = 0; i < arr.length; i++) {
if (predicate(arr[i], i, arr)) return i;
}
return -1;
}四、本章小结
理解 JavaScript 内置方法的行为和陷阱。注意 sort 的默认排序、splice 和 slice 的区别、forEach 不能 break。
五、思考与练习
sort 的默认排序有什么问题?
splice 和 slice 有什么区别?
call/apply/bind 如何选择?
forEach 为什么不能 break?
如何处理 Unicode 字符?