学习TypeScrip13(symbol类型)

本文详细介绍了JavaScript中的Symbol类型,包括其创建、唯一性、作为对象属性、不可遍历、获取symbol属性、迭代器功能以及各种内置方法的应用,还提到了TypeScript中的泛型。
摘要由CSDN通过智能技术生成

1. Symbol

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

  • 参数

可以传递参做为唯一标识 只支持 string 和 number类型的参数

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

2. Symbol的值是唯一的

const s1 = Symbol();
const s2 = Symbol();
// s1 === s2 =>false

3. 用作对象属性的键

let sym = Symbol();

let obj = {
	[sym]: 'value',
};

console.log(obj[sym]); // "value"

4. 使用symbol定义的属性,是不能通过如下方式遍历拿到的

  • for in 遍历
  • Object.keys 遍历
  • getOwnPropertyNames
  • JSON.stringfy
const symbol1 = Symbol('666');
const symbol2 = Symbol('777');
const obj1 = {
	[symbol1]: '小满',
	[symbol2]: '二蛋',
	age: 19,
	sex: '女',
};
// 1 for in 遍历
for (const key in obj1) {
	// 注意在console看key,是不是没有遍历到symbol1
	console.log(key);
}
// 2 Object.keys 遍历
Object.keys(obj1);
console.log(Object.keys(obj1));
// 3 getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj1));
// 4 JSON.stringfy
console.log(JSON.stringify(obj1));	

5. 如何获取symbol定义的属性

  • Object.getOwnPropertySymbols拿到具体的symbol 属性,对象中有几个就会拿到几个
  • Reflect.ownKeys可以拿到对象的所有属性
// 1 拿到具体的symbol 属性,对象中有几个就会拿到几个
Object.getOwnPropertySymbols(obj1);
console.log(Object.getOwnPropertySymbols(obj1));
// 2 es6 的 Reflect 拿到对象的所有属性
Reflect.ownKeys(obj1);
console.log(Reflect.ownKeys(obj1));

6. Symbol.iterator迭代器和其语法糖for of

支持遍历大部分类型迭代器 arr nodeList argumetns set map 等

var arr = [1, 2, 3, 4];
let iterator = arr[Symbol.iterator]();

console.log(iterator.next()); //{ value: 1, done: false }
console.log(iterator.next()); //{ value: 2, done: false }
console.log(iterator.next()); //{ value: 3, done: false }
console.log(iterator.next()); //{ value: 4, done: false }
console.log(iterator.next()); //{ value: undefined, done: true }

我们平时开发中不会手动调用iterator,他是有语法糖的就是for of,记住 for of 是不能循环对象的因为对象没有iterator

for (let value of map) {
	console.log(value);
}

数组解构的原理其实也是调用迭代器的

var [a, b, c] = [1, 2, 3];

var x = [...xxxx];

那我们可以自己实现一个迭代器让对象支持for of

const obj = {
	max: 5,
	current: 0,
	[Symbol.iterator]() {
		return {
			max: this.max,
			current: this.current,
			next() {
				if (this.current == this.max) {
					return {
						value: undefined,
						done: true,
					};
				} else {
					return {
						value: this.current++,
						done: false,
					};
				}
			},
		};
	},
};
console.log([...obj]);

for (let val of obj) {
	console.log(val);
}

7. Symbol内置属性

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

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

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

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

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

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

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

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

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

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

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

学习TypeScript14(泛型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值