JavaScript中的Symbol是ES6推出的一种新的数据类型,它是一种基本数据类型,可以用来表示唯一的值。Symbol的主要作用就是为对象添加独一无二的属性名,避免属性名冲突的问题。
我们可以通过Symbol()函数来创建一个Symbol类型的值:
let s = Symbol();
Symbol()函数可以接受一个字符串作为参数,用以描述该Symbol类型的属性,但该参数并不是Symbol值的标识符。
let s1 = Symbol('foo'); let s2 = Symbol('bar');
可以使用相等运算符(===)来判断两个Symbol值是否相等:
console.log(s1 === s2); // false
Symbol值可以作为对象的属性名,通过Symbol()函数创建的Symbol值是唯一的,不会与其他属性名冲突。
let obj = { [s1]: 'Hello', [s2]: 'World' }; console.log(obj[s1]); // 'Hello'
在使用for...in循环、Object.keys()方法、JSON.stringify()方法时,Symbol属性不会被枚举出来,保证了对象属性的私有性。
for(let key in obj){ console.log(key); // 无输出 } console.log(Object.keys(obj)); // [] console.log(JSON.stringify(obj)); // {}
迭代器是一种提供了访问集合元素的方式的对象,它可以按照某种顺序依次访问集合中的每个元素。
在JavaScript中,可以通过Symbol.iterator来创建迭代器。
let arr = [1, 2, 3, 4, 5]; let iterator = arr[Symbol.iterator](); console.log(iterator.next()); // {value: 1, done: false}
在上面的代码中,通过Symbol.iterator方法获取了arr的迭代器对象iterator,并通过调用iterator的next()方法来访问集合中的每个元素。
除了数组以外,其他集合类型(如Set、Map等)也可以通过Symbol.iterator来创建迭代器对象。
我们可以通过实现Symbol.iterator方法来为自定义对象创建迭代器。
let obj = { data: [1, 2, 3, 4, 5], [Symbol.iterator]() { let index = 0; let data = this.data; return { next() { if(index < data.length){ return {value: data[index++], done: false}; } return {value: undefined, done: true}; } }; } }; for(let item of obj){ console.log(item); }
上面的代码中,我们为obj对象实现了Symbol.iterator方法,并通过next()方法返回集合中的每个元素,从而实现了自定义迭代器的功能。
本文详细讲解了JavaScript中的Symbol和迭代器的相关知识,包括Symbol的创建方法、Symbol与对象属性的关系、Symbol与迭代器的使用方法以及自定义迭代器的实现方法。希望对初学者有所帮助。
本文为翻滚的胖子原创文章,转载无需和我联系,但请注明来自猿教程iskeys.com