面试题答案
一键面试Symbol类型主要特性
- 唯一性:
- Symbol通过
Symbol()
函数创建,每次调用Symbol()
都会返回一个唯一的Symbol值,即使传入相同的描述字符串。例如:
let sym1 = Symbol('description'); let sym2 = Symbol('description'); console.log(sym1 === sym2); // false
- Symbol通过
- 不可变性:
- Symbol值一旦创建就不能被改变,这保证了其稳定性和安全性。例如,不能对一个Symbol值进行重新赋值改变其内部状态。
- 作为对象属性:
- 可以使用Symbol作为对象的属性,这样可以避免属性名冲突。因为Symbol的唯一性,不会与其他普通字符串属性名或其他Symbol属性名重复。例如:
let mySymbol = Symbol(); let obj = {}; obj[mySymbol] = 'value'; console.log(obj[mySymbol]); // 'value'
- 非字符串性:
- Symbol类型不是字符串类型,不能像字符串一样直接参与运算等操作。虽然可以通过
.toString()
方法转换为字符串,但它本质上与字符串不同。例如:
let sym = Symbol('test'); let result = sym + 'test'; // 报错,因为不能直接与字符串相加 let strSym = sym.toString(); // "Symbol(test)"
- Symbol类型不是字符串类型,不能像字符串一样直接参与运算等操作。虽然可以通过
创建Symbol的方式
- 使用Symbol()函数:
- 最基本的方式是直接调用
Symbol()
函数,例如:
let sym = Symbol(); console.log(sym); // Symbol()
- 最基本的方式是直接调用
- 传入描述字符串:
- 可以给
Symbol()
函数传入一个描述字符串,方便调试和区分不同的Symbol。例如:
let symWithDesc = Symbol('用于表示用户ID'); console.log(symWithDesc); // Symbol(用于表示用户ID)
- 可以给
- 使用Symbol.for()方法:
Symbol.for(key)
方法会在全局Symbol注册表中搜索是否有以给定key
注册的Symbol,如果有则返回该Symbol,否则新建一个并注册。例如:
let sym1 = Symbol.for('sharedSymbol'); let sym2 = Symbol.for('sharedSymbol'); console.log(sym1 === sym2); // true