symbol和bigInt都是JS中的两种特殊数据类型,都是ES6中提出的数据类型
symbol
symbol是一中原始的数据类型,表示的唯一的、不可变的数据值,每一个 Symbol 值都是唯一的,这意味着每次创建一个新的 Symbol,它都是不同于其他 Symbol 的一个新值。
const sym = Symbol('mySymbol');
symbol使用场景
1、唯一的属性键盘
当你需要给对象添加属性,但又担心这些属性名可能会与其他代码中的属性名冲突的时候,可以使用symbol确保属性名的唯一性。
const mySymbol = Symbol('myUniqueKey');
const obj = {};
obj[mySymbol] = 'Hello, Symbol!';
console.log(obj[mySymbol]); // 输出:'Hello, Symbol!'
2、私有属性
在JS中,没有像其他语言(比如JAVA)那样的内置私有属性支持,因此可以使用Symbol来模拟私有属性。通过在自己的类内部创建并引用Symbol,确保这些属性不会被外部代码访问。
const mySymbol = Symbol('myProp');
class MyClass {
constructor(){
this[mySymbol] = '属性值';
}
getMyProp() {
return this[mySymbol];
}
}
const getMyPropFn = new MyClass();
console.log(getMyPropFn.getMyProp());
console.log(getMyPropFn[mySymbol]);
注意:上面的代码示例并不是真正的私有属性,因为mySymbol仍然可以被外部代码访问,但如果外部代码不知道这个Symbol
的引用,就无法访问该属性。
3、常量集合
可以使用Symbol防止由于拼写错误或重复定义导致的错误。
const TYPE_A = Symbol('TYPE_A');
const TYPE_B = Symbol('TYPE_B');
const TYPE_C = Symbol('TYPE_C');
// 使用常量作为对象属性键
const obj = {
[TYPE_A]: 'Value for type A',
[TYPE_B]: 'Value for type B',
// ...
};
console.log(obj[TYPE_A]); // 输出:'Value for type A'
BigInt的使用场景
由于BigInt是ES2020中引入的新特性,因此在一些较旧的浏览器或环境中可能不受支持。在使用BigInt之前,请确保目标环境支持该特性。你可以使用typeof BigInt === 'function'
来检查BigInt是否可用。
1、大整数运算
2、唯一标识符
// 假设有一个生成随机大整数的函数
function generateRandomBigInt() {
let result = BigInt(0);
const characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
const charactersLength = characters.length;
for (let i = 0; i < 16; i++) {
result = (result << 5n) + BigInt(characters.charCodeAt(Math.floor(Math.random() * charactersLength)));
}
return result.toString(16); // 转换为16进制字符串
}
const uniqueId = generateRandomBigInt();
console.log(uniqueId); // 输出类似 "27ae85e7d6f0d15b" 的随机16进制字符串
3、加密和安全
在加密和安全相关的应用中,BigInt常用于处理大整数和模幂运算等。