一、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);
String类的
方法,被String.prototype.match调用。正则表达式用来匹配字符串。
方法,被String.prototype.replace调用。正则表达式用来替换字符串中匹配的子串。
方法,被String.prototype.search调用。正则表达式返回被匹配部分在字符串中的索引。
方法,被String.prototype.split调用。正则表达式来用分割字符串。
其他方法,会被instanceof运算符调用。构造器对象用来识别一个对象是否是其实例。
布尔值,表示当在一个对象上调用Array.prototype.concat时,这个对象的数组元素是否可展开。
方法,被for-of语句调用。返回对象的默认迭代器。
函数值,为一个构造函数。用来创建派生对象。
方法,被ToPrimitive抽象操作调用。把对象转换为相应的原始值。
方法,被内置方法Object.prototype.toString调用。返回创建对象时默认的字符串描述。
对象,它自己拥有的属性会被with作用域排除在外。
二、迭代器1.可迭代性
当一个对象实现了Symbol.iterator
属性时,我们认为它是可迭代的。 一些内置的类型如Array
,Map
,Set
,String
,Int32Array
,Uint32Array
等都已经实现了各自的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 类型兼容性整理