编程笔记 html5&css&js 071 JavaScrip Symbol 数据类型
一、Symbol 数据类型
-
唯一性:
每个通过Symbol()
函数生成的 Symbol 值都是独一无二的,即使它们具有相同的描述符。这意味着即使两个符号使用相同的字符串作为描述,它们也是不同的。let s1 = Symbol('description'); let s2 = Symbol('description'); console.log(s1 === s2); // 输出:false
-
隐式转换阻止:
Symbol 类型不能与其他任何类型的值进行相等性比较,也不能被转换为其他类型。 -
不可变性:
一旦创建了一个 Symbol,就无法改变这个值,也无法重新赋值。 -
不可枚举性:
当用作对象属性时,默认情况下,Symbol 属性是不可枚举的,这意味着它们不会出现在for...in
循环、Object.keys()
、Object.getOwnPropertyNames()
等返回的对象属性列表中。 -
描述符:
创建 Symbol 时可以传入一个可选的描述字符串,用于调试目的,但不影响其唯一性。let s3 = Symbol('unique identifier'); console.log(s3.description); // 在标准 JavaScript 中输出:'unique identifier'
注意:在最新的规范中,
Symbol.prototype.description
已不再是一个标准属性,而是需要通过toString()
方法间接获取描述信息。 -
内置 Symbol 值:
JavaScript 提供了一些内置的 Symbol 值,例如Symbol.iterator
(用于定义迭代器)、Symbol.hasInstance
(自定义 instanceof 操作符的行为)、Symbol.toPrimitive
(自定义对象到原始值的转换行为)等等。 -
作为对象属性:
Symbol 可以安全地用作对象属性名来避免与已有属性冲突。let myKey = Symbol(); let obj = {}; obj[myKey] = 'secret value'; console.log(obj[myKey]); // 输出: 'secret value' for(let key in obj) { console.log(key); // 不会输出 myKey,因为它是 Symbol 类型且默认不可枚举 }
若要访问 Symbol 类型的属性,通常使用
Object.getOwnPropertySymbols()
方法。
二、 示例
// 创建一个带有 Symbol 键的简单对象
let id = Symbol('id');
let user = {
name: 'Alice',
[id]: 12345 // 使用 Symbol 作为键存储用户 ID
};
console.log(user[id]); // 输出: 12345
// 获取对象的所有 Symbol 属性
let symbols = Object.getOwnPropertySymbols(user);
console.log(symbols); // 输出: [Symbol(id)]
// 内置 Symbol 示例 - 自定义 instanceof 行为
class MyClass {}
MyClass[Symbol.hasInstance] = function(inst) {
return inst && inst.isMyClass;
};
let instance = { isMyClass: true };
console.log(instance instanceof MyClass); // 根据自定义规则判断是否为 MyClass 实例
小结
总结来说,Symbol 类型在 JavaScript 中主要用于实现私有属性、解决命名冲突以及扩展内置对象行为等方面,提供了更多元化的编程方式和更强的封装能力。