TypeScript Symbols和迭代器

一、Symbols

1.介绍

自ECMScript2015起,symbol成为一种新的原生类型,就像number和string一样。symbol类型的值通过Symbol构造函数创建的。

Symbols是不可变且唯一的。

像字符串一样,symbols也可以被用作对象属性的键。

Symbols也可以与计算出的属性名声明结合来声明对象的属性和类成员。

let sym1 = Symbol();
let sym2 = Symbol("key"); // 可选的字符串key

let sym3 = Symbol('key');
console.info(sym3);
//Symbols是不可改变的唯一的
console.info(sym2===sym3);//返回false,Symbol的实例是唯一的

//像字符串一样,symbols也可以被用作对象属性的键。
let sym=Symbol();
let obj={
    [sym]:'value'
}
console.info(obj);
console.info(obj[sym]);
console.info(sym===sym1); //返回false,每次调用Symbol()都返回不同的实例

//Symbols也可以用来声明对象的属性和类成员
const getClassNameSymbol=Symbol();
class C{
    [getClassNameSymbol](){
        return "C";
    }
}
let c=new C();
let className=c[getClassNameSymbol]();
console.info(c);
console.log(className);

2.常用的系统Symbols

String类的

Symbol.match

方法,被String.prototype.match调用。正则表达式用来匹配字符串。

Symbol.replace

方法,被String.prototype.replace调用。正则表达式用来替换字符串中匹配的子串。

Symbol.search

方法,被String.prototype.search调用。正则表达式返回被匹配部分在字符串中的索引。

Symbol.split

方法,被String.prototype.split调用。正则表达式来用分割字符串。

其他

Symbol.hasInstance

方法,会被instanceof运算符调用。构造器对象用来识别一个对象是否是其实例。

Symbol.isConcatSpreadable

布尔值,表示当在一个对象上调用Array.prototype.concat时,这个对象的数组元素是否可展开。

Symbol.iterator

方法,被for-of语句调用。返回对象的默认迭代器。

Symbol.species

函数值,为一个构造函数。用来创建派生对象。

Symbol.toPrimitive

方法,被ToPrimitive抽象操作调用。把对象转换为相应的原始值。

Symbol.toStringTag

方法,被内置方法Object.prototype.toString调用。返回创建对象时默认的字符串描述。

Symbol.unscopables

对象,它自己拥有的属性会被with作用域排除在外。

二、迭代器

1.可迭代性

当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的。 一些内置的类型如ArrayMapSetStringInt32ArrayUint32Array等都已经实现了各自的Symbol.iterator。 对象上的 Symbol.iterator函数负责返回供迭代的值。

2.for---of语句

用于迭代对象的键对应的值。

在ES5或ES3中,迭代器只允许在Array类型上使用。在非函数值上使用for--in语句会编译异常。

//for--of 迭代对象的值的列表
let someArray = [1, 'string', false];
for (let entry of someArray) {
    console.log(entry);//1,string,false
}

//for---in 迭代对象的键的列表
for (var key in someArray) {
    console.log(key);//'0','1','2'
}

3.for---in语句

用于迭代对象的键的列表

for--in可以操作任何对象;它提供了查看对象属性的一种方法。

class Student {
    name: string;
    age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    show() {
        console.log(`hello ${this.name},my age is ${this.age}`);
    }
}
let stu = new Student('张三丰', 20);
console.info(stu);
for (var key in stu) {
    console.info(key);// 'name','age'
    console.info(stu[key]);// '张三丰' '20'
}

更多:

TypeScript Cannot find name 'Symbol'

TypeScript 高级类型整理

TypeScript 类型兼容性整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值