前面我们了解了 基础类型、引用类型、元组类型的使用,本章我们来了解TypeScript中如何使用symbol类型,当然 symbol类型要是属于JavaScript,可能有很多同学还不知道symbol
symbol类型 是 ES6 引入的一种新的原始数据类型,用来表示唯一的、不可变的值。Symbol值通过Symbol()函数生成,每个Symbol值都是唯一的,可以用于对象的属性名,从而避免属性名冲突的问题。自ECMAScript 2015起,symbol成为了一种新的原生类型。
要创建一个Symbol值,可以使用Symbol构造函数,创建时可以穿一个唯一参数作为唯一标识。
注意:参数只能是number类型或string 类型
//正确使用
const mySymbol = Symbol();
const mySymbol =Symbol('我是唯一标识');
Symbol类型在JavaScript中是一种新的数据类型,它的主要用途是作为对象属性的唯一标识符。以下是一些Symbol类型的使用场景:
Symbol类型的值可以作为对象的属性名,这样可以确保属性的唯一性,避免属性名冲突的问题。
const obj = {};
const symbol1 = Symbol('foo');
const symbol2 = Symbol('foo');
obj[symbol1] = 'value1';
obj[symbol2] = 'value2';
console.log(obj[symbol1]); // 'value1'
console.log(obj[symbol2]); // 'value2'
//也可以这样使用
const symbol3= Symbol();
let objMap={
[symbol3]:'我是值'
}
console.log(objMap[symbol3]); // "我是值"
Symbol类型的值是唯一且不可变的,可以作为常量使用。在这种情况下,使用相同的Symbol值可以确保常量的唯一性。
const LOG_LEVEL = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
ERROR: Symbol('error')
};
function log(level) {
if (level === LOG_LEVEL.DEBUG) {
console.log('Debug message');
} else if (level === LOG_LEVEL.INFO) {
console.log('Info message');
} else if (level === LOG_LEVEL.ERROR) {
console.log('Error message');
}
}
log(LOG_LEVEL.INFO); // 'Info message'
Symbol类型的值不会被默认遍历到对象的属性列表中,这使得它可以用作私有属性或方法名,不会被外部访问到。
const obj = {};
const privateProperty = Symbol('private');
obj[privateProperty] = 'private value';
console.log(obj[privateProperty]); // 'private value'
console.log(obj.privateProperty); // undefined
需要注意的是,Symbol类型的值不是字符串,虽然可以给Symbol传递一个描述参数,但描述参数只是作为标识符的可读性提示,不会影响Symbol的唯一性。
使用symbol类型时有一些注意事项:
Symbol是一种原始数据类型,可以用作对象属性的唯一标识符。每个symbol都是唯一且不可变的,不同于字符串类型的属性名可以重复。
Symbol类型的变量不能通过直接访问来获取它们的值,因为它们没有固定的名称。相反,可以使用变量名和Symbol的描述符作为参数访问变量。例如:console.log(mySymbol)。
可以使用Symbol类型作为对象属性名。这样可以确保属性的唯一性。例如:const obj = {[mySymbol]: “value”}。
Symbol类型的变量可以作为对象的私有属性,因为它的值不会被意外修改或覆盖。
Symbol类型的变量在使用JSON.stringify()方法时会被忽略。这是因为JSON.stringify()默认情况下只序列化对象的可枚举属性,而Symbol类型的属性默认为不可枚举。
可以使用Object.getOwnPropertySymbols()方法来获取对象中所有的Symbol属性。
Symbol类型的变量可以作为迭代器的唯一键,例如Symbol.iterator可以用于实现自定义迭代器。