在这篇博文中,我们将通过实例来学习原始数据类型Symbol的基础知识。
ES6符号数据类型
符号是由ES6或ECMAScript 2015引入javascript的一种原始数据类型。Typescript也支持这个符号作为一个原始数据类型,就像String、number和Boolean。
- 符号是一种特殊的原始类型,它代表一个对象的唯一值或键。
- 它被用来识别具有Symbol对象的唯一对象。
- 符号变量总是返回新的唯一值
上述所有的例子都可以在javascript和typescript中运行。
初始化和创建
符号对象的创建方法如下。它为每个对象的创建创造了唯一的值。空符号是由Symbol()创建的,也可以向Symbol函数提供密钥,如下例所示
var symboleObj = Symbol();
console.log(symboleObj) //Symbol()
console.log(typeof symboleObj) //symbol
var symboleObj1 = Symbol('keyhere');
console.log(symboleObj1) //Symbol(keyhere)
符号的唯一性检查
创建的对象总是返回新的值。相同的符号有相同的键
let symboleObj1= Symbol("s1");
let symboleObj2 = Symbol("s1");
console.log(symboleObj1==symboleObj2) //false
钥匙作为对象中的一个符号
符号可以作为一个键存储在对象中。而且值可以像普通键一样被检索。Object.key和Object.getOwnPropertyNames不会得到符号键,这意味着键在for...in for...的迭代过程中是不可迭代的。要检索符号键,可以使用Object.getOwnPropertySymbols。
var symboleObj = Symbol();
let myObject = {
[symboleObj]: "myvalue",
"key1": "value1"
}
console.log(myObject) //Object Symbol(): "myvalue"
console.log(myObject[symboleObj]) //myvalue
console.log(Object.keys(myObject)) // return [ 'key1' ]
console.log(Object.getOwnPropertyNames(myObject)) // return [ 'key1' ]
console.log(Object.getOwnPropertySymbols(myObject)) // return [ Symbol() ]
如何将符号转换为字符串
toString()方法返回符号对象的字符串版本。也可以用String(symboleObj)转换为字符串。如果你使用new String(symboleObj) - 它会抛出 "未发现的类型错误。无法将符号值转换为字符串'。
var symboleObj = Symbol();
console.log(String(symboleObj)) //myvalue
console.log(symboleObj.toString()) //myvalue
如何将符号转换为布尔值
将符号对象传递给布尔类,总是返回真。也可以与!not操作符一起使用,返回false。
var symboleObj = Symbol(123);
console.log(new Boolean(symboleObj)) //true
console.log(!symboleObj) //false
方法的符号
for()方法接受输入字符串--一个描述,它在全局范围内搜索给定描述的符号并返回符号。
let test = Symbol.for('test');
console.log(test === test); // true
如何将符号转换为数字
对于Number,如果同样的代码用于Number,如new Number(symboleObj),会产生编译错误。不能将一个符号值转换为一个数字
预先内置的符号
Javascript和typescript定义的本地符号是语言的一部分。Symbol.iterator 例子这返回一个对象的迭代,可以用于for循环语法。下面是一个关于String对象的迭代的例子
interface IIterationString {
[Symbol.iterator](): IterableIterator;
}
class StringIteration implements IIterationString {
private strings = ['one', 'two', 'three'];
constructor() {}
*[Symbol.iterator]() {
for(let ss of this.strings) {
yield ss;
}
}
}
for(let elem of (new StringIteration())) {
console.log(elem); // returns one two three
}