跳到主要内容

迭代器、Symbol 和类型数组

扩展运算符

const objectA = { a: 1, b: 2, c: 3 };
const objectB = { a: 3, d: 5, e: 6 };

const combinedObject = { ...objectB, ...objectA };
// Object.assign(combinedObject, objectA, objectB);
console.log(combinedObject);

扩展运算符允许将一个对象的所有可枚举属性复制到另一个对象中。在上面的示例中,combinedObject 将包含 objectBobjectA 的所有属性。如果属性名重复,后面的对象属性会覆盖前面的。

Symbol

const uniqueSymbol = Symbol();
console.log(Object.getPrototypeOf(uniqueSymbol));

Symbol 是一种基本数据类型,用于创建唯一的标识符。每个 Symbol 都是唯一的,常用于对象属性的键,避免属性名冲突。

迭代器

迭代器是一种有序、连续、基于拉取的消耗数据的组织方式。

const array = [1, 2, 3, 4];
console.log(array);

// 访问数组上的 Symbol.iterator 方法
const iterator = array[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

实现迭代器

function createIterator(items) {
let currentIndex = 0;
return {
next: function () {
if (currentIndex < items.length) {
return { value: items[currentIndex++], done: false };
} else {
return { value: undefined, done: true };
}
},
};
}

const iteratorInstance = createIterator([1, 2, 3, 4]);
console.log(iteratorInstance.next());
console.log(iteratorInstance.next());
console.log(iteratorInstance.next());
console.log(iteratorInstance.next());
console.log(iteratorInstance.next());

上述代码展示了如何手动创建一个迭代器。createIterator 函数返回一个具有 next 方法的对象,每次调用 next 都会返回序列中的下一个值,直到所有值被迭代完毕。

TypeArray

TypeArray 用于处理二进制数据的类型数组,但它不是类数组。

// 八进制数据
const int8Array = new Int8Array(8);
int8Array[0] = 100;
console.log(int8Array);

原型

声明这种数据的原型是 TypedArray

TypedArray 提供了一组视图,用于不同类型的二进制数据处理,如 Int8ArrayUint8ArrayFloat32Array 等。

for...of

for...of 循环调用 [Symbol.iterator] 接口,进行迭代,一次迭代全部的内容。

const array = [1, 2, 3, 4];

for (const element of array) {
console.log(element); // 1 2 3 4
}

给对象添加迭代器

const iterableObject = {
a: [2],
b: [3],
c: [1],
[Symbol.iterator]() {
const combinedArray = [...this.a, ...this.b, ...this.c];
let index = 0;
const length = combinedArray.length;
return {
next() {
if (index < length) {
return { value: combinedArray[index++], done: false };
} else {
return { value: undefined, done: true };
}
},
};
},
};

for (const value of iterableObject) {
console.log(value); // 2 3 1
}

通过在对象上实现 [Symbol.iterator] 方法,可以使该对象支持 for...of 循环,实现自定义的迭代行为。

for...in

for...in 循环用于遍历对象的可枚举属性,或数组的索引。

const array = [1, 2, 3, 4];

for (const index in array) {
console.log(index); // 0 1 2 3
}
const object = {
a: 1,
b: 2,
c: 3,
};

for (const key in object) {
console.log(key); // a b c
}

需要注意的是,for...in 循环会遍历对象及其原型链上的可枚举属性,因此在使用时应结合 hasOwnProperty 方法进行过滤,以避免遍历到不必要的属性。