随着 ECMAScript(以下简称 ES)版本的不断更新迭代,Symbol 作为 ES6 新增的一种数据类型,已经成为了 ES 中非常重要的一部分,本文将对 Symbol 详细进行解读。
什么是 Symbol?
Symbol 是 ES6 引入的一种新的基本数据类型,表示独一无二的值,可以作为对象属性的标识符使用。与字符串不同,Symbol 值是不可变的。如果您希望对象中的某个属性确实是唯一的,那么 Symbol 就是一个非常好的选择。
创建 Symbol 的方式非常简单,只需调用 Symbol 函数,而且没有参数,看下面这个例子:
let sym = Symbol(); console.log(typeof sym); // "symbol"
Symbol 唯一性
创建 Symbol 时,如果什么都不传入,Symbol 的值就是唯一的,即使创建多个没有参数的 Symbol,它们的值也会不同。
let s1 = Symbol(); let s2 = Symbol(); console.log(s1 === s2); // false console.log(s1); // Symbol() console.log(s2); // Symbol()
可以看到在上面的代码中,虽然 s1 和 s2 都是没有参数的 Symbol,但是它们的值是不同的,这就是 Symbol 的唯一性。
Symbol 对象
Symbol 类型的值只是使用 Symbol() 创建的基本类型。在 ES6 中,也可以使用 Symbol 构造函数创建 Symbol 对象。Symbol 对象是 Symbol() 函数的实例,它们包含 Symbol 值的显式包装器,其中的属性和方法可以被使用来操作 Symbol 值。
let s1 = Symbol(); let s2 = new Symbol(); console.log(typeof s1); // "symbol" console.log(typeof s2); // 报错
在上面的例子中,用 new 关键字创建 Symbol 对象会抛出 TypeError 异常。
Symbol 作为属性键
由于 Symbol 的唯一性和不变性,它非常适合作为对象属性的标识符使用,在使用 Symbol 作为属性键后,该属性不会出现在对象的枚举中。
下面的例子演示了如何使用 Symbol 作为属性键的方法:
let a = {}; let s = Symbol("key"); a[s] = "hello world"; console.log(Object.getOwnPropertyNames(a)); // [] console.log(Object.getOwnPropertySymbols(a)); // [ Symbol(key) ] console.log(a[s]); // "hello world"
在上面的代码中,使用了 Symbol("key") 创建了一个 Symbol,然后它被用作对象 a 的属性名。在使用 Object.getOwnPropertySymbols 方法时,该属性将会被列出来。
而使用 Object.getOwnPropertyNames 方法时,并不会输出这个属性,因为它被认为是一种特殊的类型,不能被列举。
预定义 Symbol
ES6 中定义了一些内置的 Symbol 值和函数,它们具有特殊的含义和用途。
Symbol.iterator
这个 Symbol 值是一个对象的属性,它定义了它的默认迭代器,它被原生的类型(如 Array, String 等)实现,因此可以通过 for...of 循环遍历这些类型的对象。
下面是一个使用 Symbol.iterator 实现遍历自定义对象的例子:
// javascriptcn.com 代码示例 let myObj = { [Symbol.iterator]: function* () { yield 1; yield 2; yield 3; } } for (let val of myObj) { console.log(val); }
上面的代码中,使用 Symbol.iterator 创建了一个自定义对象的迭代器,然后使用 for...of 循环来遍历该对象。
Symbol.toStringTag
这个 Symbol 值是一个对象的属性,它定义了在 toString() 方法中的标记字符串,用于标识对象类型。
下面是一个有 Symbol.toStringTag 属性的自定义对象的例子:
let myObj = { [Symbol.toStringTag]: "MyObject" } console.log(myObj.toString()); // "[object MyObject]"
上面的代码中,使用 Symbol.toStringTag 属性定义了自定义对象的标记字符串,当调用该对象的 toString() 方法时,将会输出该标记字符串。
总结
本文详细解读了 Symbol 的特性和用法,可以发现 Symbol 可以在对象中作为标识符使用,并保证值的唯一性和不变性。此外,ES6 还定义了一些内置的 Symbol 值和函数,它们提供了丰富的功能和方便的操作。掌握了 Symbol 的知识,可以让我们更加灵活地处理对象,并优化我们的代码。
以上内容详细解读了 ECMAScript 2019 之 Symbol 新特性,希望这篇文章对读者有所帮助,有助于更好的理解和应用 Symbol 的相关知识点。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652e42147d4982a6ebf4e31d