在 ES6 中,添加了新的原始数据类型 Symbol。它是唯一的且不可改变的,主要用途是为对象添加非字符串类型的键。而在 ES7 中,Symbol增加了更多的特性,本文将指导读者如何正确使用 Symbol,并为大家呈现示例代码。
Symbol 的基本使用
Symbol 是唯一的, Symbol() 方法可以传入一个可选的字符串作为参数,该参数只是 Symbol 的描述。使用示例如下:
const mySymbol = Symbol(); const mySymbolWithDescription = Symbol('I am a symbol');
Symbol 是不可变的,且对比两个 Symbol 也不相等。因此两个不同的 Symbol 总是不相等的,下面是代码示例:
const mySymbol1 = Symbol('foo'); const mySymbol2 = Symbol('foo'); console.log(mySymbol1 === mySymbol2); // 输出 false
Symbol 的使用场景
Symbol 最常用的场景是用作对象属性的键。相较于字符串类型的键并没有任何内在的区别。由于 Symbol 是唯一的,不会和在其他地方使用的键冲突,可以在 ES6 中的特定场景中防止其他代码可能会使用相同的字符串属性的默认行为。
const obj = { [Symbol('my_key')]: 1 };
Symbol 方法使用
Symbol 增加了许多新的方法,这些方法可以帮助开发者更好的控制 Symbol 的行为,接下来我们将逐个介绍这些方法。
Symbol.for 和 Symbol.keyFor
Symbol.for
静态方法返回一个已经注册过的 Symbol(即使用同一个参数创建的Symbol),这可以确保在不同的代码文件中调用相同的 Symbol.for
时得到相同的 Symbol。示例代码:
const sym1 = Symbol.for('foo'); const sym2 = Symbol.for('foo'); console.log(sym1 === sym2); // true
Symbol.keyFor
方法返回通过Symbol.for
方法创建的Symbol的描述,但如果不是通过这种方式创建的Symbol,则返回'undefined'。示例代码:
const sym = Symbol.for('foo'); const symDescription = Symbol.keyFor(sym); console.log(symDescription); // 输出 foo
Symbol.hasInstance
该方法确定一个构造函数的原型是否存在于一个实例对象的原型链中。 示例代码:
class MyClass { [Symbol.hasInstance](obj) { return Array.isArray(obj); } } console.log([] instanceof new MyClass()); // true
Symbol.isConcatSpreadable
该方法用于标识对象是否可以使用数组连接运算符(Array.prototype.concat()
)连接。如果在对象的属性中显式设置为 false
,则不会连接。
const array1 = ['one', 'two']; const array2 = ['three']; array2[Symbol.isConcatSpreadable] = false; console.log(array1.concat(array2)); // ["one", "two", Array(1)]
Symbol.species
该方法用于定义派生对象的默认构造函数。下面是示例代码:
-- -------------------- ---- ------- ----- ------- ------- ----- - ------ --- ------------------ - ------ ------ - - ----- - - --- ---------- ----- - - ------- -- --- ------------- ---------- --------- -- ----- ------------- ---------- ------- -- ----
结论
Symbol 是 ES6 和 ES7 新增的一种数据类型,可以为对象添加非字符串类型的键。相较于字符串类型的键并没有任何内在的区别。Symbol 的重要作用是在特定场景中防止其他代码可能会使用相同的字符串属性的默认行为。同时,Symbol 也可以使用许多方法,同时我们也学习了如何使用这些方法。正确的使用 Symbol 可以提高代码的质量,避免出现一些潜在的Bug,使得代码更稳定。
参考
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6732e76e0bc820c5823f6fb6