Typecript:原始数据类型Symbol的基础知识介绍

86 阅读2分钟

在这篇博文中,我们将通过实例来学习原始数据类型Symbol的基础知识。

ES6符号数据类型

符号是由ES6或ECMAScript 2015引入javascript的一种原始数据类型。Typescript也支持这个符号作为一个原始数据类型,就像String、number和Boolean。

  • 符号是一种特殊的原始类型,它代表一个对象的唯一值或键。
  • 它被用来识别具有Symbol对象的唯一对象。
  • 符号变量总是返回新的唯一值

上述所有的例子都可以在javascripttypescript中运行。

初始化和创建

符号对象的创建方法如下。它为每个对象的创建创造了唯一的值。空符号是由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
}