目录
JavaScript 内置构造函数
在 JavaScript 编程领域,数据类型构成了程序构建的基础框架。JavaScript 主要涵盖 6 种数据类型,大体可分为两类:
- 基本数据类型:包括字符串、数值、布尔、undefined、null。这些基本数据类型具备简单、不可变的特性,直接存储于栈内存中,在实际使用时,简洁高效,为程序的基础数据处理提供了便利。
- 引用类型:即对象。对象作为一种复杂的数据结构,存储在堆内存中,通过引用进行访问。这种存储和访问方式为数据的组织与操作赋予了更大的灵活性,使得开发者能够构建出更为复杂和强大的程序逻辑。
在实际的 JavaScript 编程过程中,我们常常会遇到一些看似特殊的现象。例如,当定义一个普通字符串并访问其length属性时:
// 普通字符串
const str = 'andy'
console.log(str.length) // 4
这表明,即使是像字符串这样的基本数据类型,也拥有部分类似对象的行为。事实上,JavaScript 为字符串、数值、布尔等基本类型提供了专门的构造函数,通过这些构造函数创建的对象被称作包装类型。借助包装类型,基本数据类型得以临时拥有对象的属性和方法,极大地拓展了自身的功能。这也意味着,在 JavaScript 中,几乎所有的数据都能够通过构造函数来创建。
1. Object
Object作为 JavaScript 中最为基础的构造函数之一,为开发者提供了众多强大的工具,用于对象的操作与管理。其中,有三个常用的静态方法特别值得深入学习。
1.1 Object.keys
- 作用:Object.keys静态方法的作用是获取对象中所有的属性名(键)。在需要遍历对象属性、进行数据统计或筛选时,这个方法非常实用。比如,在分析一个包含用户信息的对象时,可以通过Object.keys快速获取所有的属性名,进而了解对象的结构。
- 语法:
const o = { name: '佩奇', age: 6 }
// 获得对象的所有键,并且返回是一个数组
const arr = Object.keys(o)
console.log(arr) // ['name', 'age']
- 注意:该方法返回的是一个包含所有属性名的数组,数组元素的顺序与对象中属性的定义顺序一致。这一特性在需要按照特定顺序处理属性时尤为重要。
1.2 Object.values
除了Object.keys,Object.values也是一个常用的静态方法。
- 作用:Object.values方法返回一个包含对象所有属性值的数组。当我们只关注对象的值,而不关心属性名时,这个方法能派上大用场。例如,在统计一个包含成绩的对象中的所有成绩总和时,Object.values可以快速获取所有成绩值。
- 语法示例:
const obj = { a: 1, b: 2, c: 3 };
const values = Object.values(obj);
console.log(values); // [1, 2, 3]
1.3 Object.entries
- 作用:Object.entries方法返回一个包含对象可枚举属性的键值对数组。每个键值对都是一个包含两个元素的数组,第一个元素是属性名,第二个元素是属性值。在需要同时处理对象的属性名和属性值时,这个方法提供了极大的便利。比如,在将对象数据转换为特定格式的数组时,Object.entries能简化操作流程。
- 语法示例:
const obj = { a: 1, b: 2, c: 3 };
const entries = Object.entries(obj);
console.log(entries); // [['a', 1], ['b', 2], ['c', 3]]
2. Array
数组是 JavaScript 中常用的数据结构之一,用于存储和管理一组有序的数据。JavaScript 为Array构造函数提供了丰富的实例方法,这些方法可以帮助我们高效地操作数组。
2.1 数组常见实例方法 - 核心方法
方法 |
作用 |
说明 |
forEach |
遍历数组 |
不返回数组,常用于查找遍历数组元素,对每个元素执行指定的回调函数。比如,在查找数组中所有大于 10 的元素时,可以使用forEach遍历数组并进行判断。 |
filter |
过滤数组 |
返回新数组,返回的是筛选满足条件的数组元素,通过回调函数判断元素是否符合条件。例如,从一个包含多个数字的数组中筛选出所有偶数,filter就能轻松实现。 |
map |
迭代数组 |
返回新数组,返回的是处理之后的数组元素,对每个元素进行处理并返回新值。比如,将数组中的每个元素都乘以 2,map方法可以简洁地完成这个操作。 |
reduce |
累加器 |
返回累计处理的结果,常用于求和、计算乘积、合并对象等场景,通过回调函数对数组元素进行累加或其他累计操作。在计算数组中所有元素的乘积时,reduce方法可以发挥重要作用。 |
2.2 reduce
- 作用:reduce方法是数组操作中非常强大的一个方法,它可以返回累计处理的结果,常用于求和、计算乘积、合并对象等场景。比如,在计算购物车中所有商品的总价时,reduce方法可以快速实现。
- 基本语法:
arr.reduce(function() {}, 起始值)
arr.reduce(function(上一次值, 当前值) {}, 初始值)
const arr = [1, 2, 3, 4]
- 参数:如果有起始值,则把初始值累加到计算过程中。起始值的存在可以改变计算的起始点和结果。例如,在计算数组元素之和时,若起始值为 10,最终结果会比没有起始值时大 10。
- reduce 执行过程:
- 如果没有起始值,则上一次值以数组的第一个数组元素的值。
- 每一次循环,把返回值做为下一次循环的上一次值。
- 如果有起始值,则起始值做为上一次值。
代码示例:
// 1. 没有初始值
const arr = [1, 5, 8]
const total = arr.reduce(function (prev, current) {
return prev + current
})
console.log(total)
// 2. 有初始值
const total = arr.reduce(function (prev, current) {
return prev + current
}, 10)
console.log(total)
// 3. 箭头函数的写法
const total = arr.reduce((prev, current) => prev + current, 10)
console.log(total)
无初始值时执行过程:
上一次值 |
当前值 |
返回值(第一次循环) |
1 |
5 |
6 |
6 |
8 |
14 |
有初始值时执行过程:
上一次值 |
当前值 |
返回值(第一次循环) |
10 |
1 |
11 |
11 |
5 |
16 |
16 |
8 |
24 |
2.3 其他实用实例方法
除了上述核心方法,Array还有很多其他实用的实例方法,这些方法在日常编程中也经常用到。
- push:向数组末尾添加一个或多个元素,并返回新的数组长度。例如:
let arr = [1, 2, 3];
let newLength = arr.push(4);
console.log(arr); // [1, 2, 3, 4]
console.log(newLength); // 4
- pop:移除数组末尾的一个元素,并返回该元素。例如:
let arr = [1, 2, 3];
let removedElement = arr.pop();
console.log(arr); // [1, 2]
console.log(removedElement); // 3
- shift:移除数组的第一个元素,并返回该元素。例如:
let arr = [1, 2, 3];
let removedElement = arr.shift();
console.log(arr); // [2, 3]
console.log(removedElement); // 1
- unshift:向数组开头添加一个或多个元素,并返回新的数组长度。例如:
let arr = [2, 3];
let newLength = arr.unshift(1);
console.log(arr); // [1, 2, 3]
console.log(newLength); // 3
- splice:用于添加或删除数组中的元素。可以实现删除元素、插入元素、替换元素等操作。例如,删除元素:
let arr = [1, 2, 3, 4, 5];
// 从索引2开始,删除2个元素
let removedElements = arr.splice(2, 2);
console.log(arr); // [1, 2, 5]
console.log(removedElements); // [3, 4]
插入元素:
let arr = [1, 2, 5];
// 从索引2开始,删除0个元素,插入3和4
arr.splice(2, 0, 3, 4);
console.log(arr); // [1, 2, 3, 4, 5]
替换元素:
let arr = [1, 2, 5];
// 从索引2开始,删除1个元素,插入3和4
arr.splice(2, 1, 3, 4);
console.log(arr); // [1, 2, 3, 4]
3. String 构造函数
String构造函数用于创建字符串对象。在大多数情况下,我们直接使用字符串字面量来定义字符串,因为这种方式简洁明了。然而,在处理一些复杂的字符串操作时,String构造函数提供的方法和功能就显得尤为重要。例如:
const str = new String("Hello World");
String对象拥有许多常用方法,这些方法可以帮助我们对字符串进行各种处理。
- toUpperCase:将字符串转换为大写。例如:
let str = "hello world";
let upperStr = str.toUpperCase();
console.log(upperStr); // HELLO WORLD
- toLowerCase:将字符串转换为小写。例如:
let str = "HELLO WORLD";
let lowerStr = str.toLowerCase();
console.log(lowerStr); // hello world
- charAt:返回字符串中指定位置的字符。例如:
let str = "hello world";
let char = str.charAt(4);
console.log(char); // o
- substring:返回字符串的子串。例如:
let str = "hello world";
// 从索引2开始,到索引5(不包含)
let subStr = str.substring(2, 5);
console.log(subStr); // llo
4. Number 构造函数
Number构造函数用于创建数字对象,它为我们提供了丰富的方法,用于数字的处理和转换操作。例如:
const num = new Number(42);
Number对象的常见方法如下:
- toFixed:将数字四舍五入为指定的小数位数。例如:
let num = 19.99;
let fixedNum = num.toFixed(1);
console.log(fixedNum); // 20.0
- toString:将数字转换为字符串。例如:
let num = 123;
let str = num.toString();
console.log(typeof str); // string
5. Boolean 构造函数
Boolean构造函数用于创建布尔值对象(true或false)。在实际编程中,我们通常使用字面量来定义布尔值,因为它更加简洁直观。然而,在某些复杂的逻辑操作中,Boolean构造函数可以为我们提供更多的灵活性。例如:
const isActive = new Boolean(true);
Boolean对象主要用于逻辑操作中的条件判断。比如:
let isDone = new Boolean(false);
if (isDone) {
console.log('任务已完成');
} else {
console.log('任务未完成');
}
6. 集合对象的构造函数
6.1 Set 构造函数
Set是 JavaScript 中的集合对象,它用于存储唯一的值,值可以是任何类型,包括基本数据类型和对象。这使得Set在需要确保数据唯一性的场景中非常有用。例如:
const set = new Set([1, 2, 3, 4, 4]);
console.log(set); // Set(4) { 1, 2, 3, 4 }
Set对象提供了一些常用方法,用于操作集合中的元素。
- add:向集合中添加一个新值。例如:
let set = new Set([1, 2, 3]);
set.add(4);
console.log(set); // Set(4) { 1, 2, 3, 4 }
- has:检查集合中是否包含某个值。例如:
let set = new Set([1, 2, 3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false
- delete:从集合中移除指定值。例如:
let set = new Set([1, 2, 3]);
set.delete(2);
console.log(set); // Set(2) { 1, 3 }
6.2 Map 构造函数
Map是一个键值对集合,它的键和值可以是任意类型。与普通对象相比,Map提供了更灵活的键值对管理方式,并且可以更好地处理复杂的数据结构。例如:
const map = new Map();
map.set("name", "John");
map.set("age", 30);
Map对象的常用方法如下:
- set:向Map中添加键值对。例如:
let map = new Map();
map.set("city", "New York");
console.log(map); // Map(1) { 'city' => 'New York' }
- get:获取指定键对应的值。例如:
let map = new Map([["name", "John"], ["age", 30]]);
console.log(map.get("name")); // John
- has:检查是否存在指定的键。例如:
let map = new Map([["name", "John"], ["age", 30]]);
console.log(map.has("age")); // true
console.log(map.has("city")); // false
6.3 WeakSet 和 WeakMap 构造函数
WeakSet和WeakMap是Set和Map的弱引用版本,它们主要用于存储对象引用。与Set和Map不同的是,WeakSet和WeakMap不会阻止垃圾回收器回收这些对象,这使得它们在处理大量临时对象时非常有用。例如:
let obj = { name: "John" };
const weakSet = new WeakSet();
weakSet.add(obj);
const weakMap = new WeakMap();
weakMap.set(obj, "metadata");
由于是弱引用,当对象没有其他强引用时,垃圾回收器可能会随时回收该对象,WeakSet和WeakMap中关于该对象的引用也会随之消失。
7. 错误处理的构造函数
7.1 Error 构造函数
Error构造函数用于创建错误对象,并在代码中抛出错误。通过抛出错误,我们可以在程序出现异常时及时捕获并处理,从而提高程序的稳定性和可靠性。同时,Error构造函数可以为错误提供详细的消息,以便于调试和排查问题。例如:
const error = new Error("Something went wrong");
throw error;
Error有一些常用子类,每个子类都用于表示特定类型的错误。
- TypeError:表示类型错误。例如:
let num = "123";
// 这里会抛出TypeError,因为字符串不能直接进行数学运算
let result = num + 1;
- RangeError:表示数值超出允许范围。例如:
// 创建一个长度为负数的数组,会抛出RangeError
let arr = new Array(-1);
- ReferenceError:表示引用错误,当引用一个不存在的变量时会抛出。例如:
console.log(nonExistentVariable); // 抛出ReferenceError
8. 其他常用构造函数
8.1 Date 构造函数
Date构造函数用于处理日期和时间。通过Date构造函数,我们可以创建表示特定日期和时间的对象,并对日期和时间进行各种操作。例如:
const now = new Date();
console.log(now); // 输出当前日期和时间