在 ES8 标准中,新增了一种数据类型 Symbol,这种类型是唯一的、不可变的,可以作为对象属性的标识符,具有一定的安全性和隐私保护。
Symbol 的定义和使用
- 定义
Symbol 是一种原始数据类型,使用 Symbol 函数来定义一个 Symbol 类型的变量。
示例代码:
let s = Symbol(); console.log(typeof s); // symbol
通过调用 Symbol 函数,创建了一个 Symbol 类型的变量 s。
- 使用
Symbol 变量可以作为对象属性的标识符,也可以作为函数参数的标识符。Symbol 作为属性的标识符,可以保证属性名的唯一性,避免属性名冲突的问题。
示例代码:
let obj = {}; let s = Symbol(); obj[s] = 'hello'; console.log(obj[s]); // hello
在上述示例代码中,通过向 obj 对象添加属性 s,保证了属性名的唯一性,避免了属性名冲突的问题。
Symbol 的特性
Symbol 有一些特性,这些特性是其他数据类型所不具备的。下面分别介绍 Symbol 的四个特性。
1. 唯一性
Symbol 变量是唯一的,每一个 Symbol 变量都是独一无二的。即使变量名相同,它们之间也是不相等的。
示例代码:
let s1 = Symbol(); let s2 = Symbol(); console.log(s1 === s2); // false
在上述示例代码中,s1 和 s2 变量是通过 Symbol 函数创建的,它们之间是不相等的。
2. 无法遍历
Symbol 作为对象属性的标识符,是无法通过 for...in 循环遍历到的。
示例代码:
// javascriptcn.com 代码示例 let obj = {}; let s = Symbol(); obj[s] = 'hello'; for (let key in obj) { console.log(key); // 不会输出任何值 } console.log(Object.getOwnPropertyNames(obj)); // [] console.log(Object.getOwnPropertySymbols(obj)); // [Symbol()]
在上述示例代码中,obj 对象中添加了属性 s,但使用 for...in 循环无法遍历到 s 属性。使用 Object.getOwnPropertyNames 方法也无法获取到 s 属性信息,而 Object.getOwnPropertySymbols 方法可以获取到 s 属性。
3. 不可变性
Symbol 变量是不可变的,在定义之后无法修改。
示例代码:
let s = Symbol(); s = 'hello'; // TypeError: Cannot convert a Symbol value to a string
在上述示例代码中,尝试修改 s 变量的值会抛出 TypeError。
4. 私有属性
Symbol 作为对象属性的标识符,可以被看作是对象的私有属性,访问权限受限,具有一定的安全性和隐私保护。
示例代码:
let obj = {}; let s = Symbol(); obj[s] = 'hello'; console.log(obj[s]); // hello console.log(obj); // {}
在上述示例代码中,通过向 obj 对象添加属性 s,保证了属性名的唯一性,同时访问权限受限,具有一定的安全性和隐私保护。
总结
Symbol 是一种新的数据类型,具有独一无二、不可遍历、不可变、私有等特性,在对象属性的标识符中发挥了巨大作用,保证属性名的唯一性,避免属性名冲突的问题。在实际开发中,可以灵活应用 Symbol,为项目带来更好的代码质量和安全性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65347af47d4982a6eb90b4fc