typescript Symbol类型

Symbol在es6出现的新类型,ts中使用时需要先配置

1、配置tsconfig.json
	"lib": ["es6"],	需要dom时还要将"dom"添加进lib,如:console.log语句

2、特性
	(1)不能和其他值计算,如加键、字符串拼接等
	(2)可以调用.toString()返回字符串
	(3)本身作为true类型存在
	(4)类似for in遍历时,不会遍历symbol属性
		可通过Object.getOwnPropertySymbols(对象)/Reflect.ownKeys(obj)获取symbol属性
	
3、语法
	let x=Symbol();						即使再次调用也不会生成相同值
	let x=Symbol('传入值作为标识');		增加可读性,即使传入相同值也不会相等
	
	let x=Symbol.for('传入值作为标识');			当使用.for方法创建的标识值存在时会返回那个symbol,否则会创建	
	let x=Symbol.keyFor(Symbol.for方法创建的变量);	返回.for创建时传入的标识值
	
	作为对象/类属性
		let obj={
			[x]:'值'		 必须使用[]进行解析,调用时也只能obj[x]进行调用
		}
		class C={
			[x](){}
		}
	
	内置symbol属性
		(1)Symbol.hasInstance
			当使用instanceof时,之后的对象将会执行对象[Symbol.hasInstance]执行的方法
			如:
				let obj={
					[Symbol.hasInstance](otherObj){	参数为instanceof前比较的对象
						...
					}
				}
			  console.log(x instanceof obj)
			  
	 	(2)Symbol.isConcatSpreadable
	 		当为数组设置Symbol.isConcatSpreadable属性为false时,调用.concat方法不会拆开
	 		如:
	 			let arr=[1,2]
	 			arr[Symbol.isConcatSpreadable]=false;
	 			console.log([].concat(arr,[3,4])) 返回 [[1,2],3,4]
	 			
	 	(3)Symbol.species
	 		创建衍生对象的构造函数
	 	
	 	(4)Symbol.match
	 		当调用字符串的match方法时,会触发match中对象的该属性对应的方法
	 		同理还有:Symbol.search、Symbol.replace、Symbol.split
	 		如:
	 			let obj={
	 				[Symbol.match](string){
	 					...
	 				}
	 			}
	 			'xxx'.match(obj)
	 			
	 	(5)Symbol.iterator
	 		指向默认的遍历器方法
	 		let arr=[1,2,3];
	 		1、返回遍历器:
	 			const iterator=arr[Symbol.iterator]
	 		2、通过遍历器进行遍历:
	 			iterator.next();  会返回当前遍历的内容{value:值,done:是否遍历完成的布尔值}
	 			
	 	(6)Symbol.toPrimitive
	 		当对象被转换成原始类型时,调用Symbol.toPrimitive属性指定的方法
	 		如:
	 			let obj={
	 				[Symbol.toPrimitive](type){	type为被转换成的原始类型
	 					...
	 				}
	 			}
				obj++;	 type为number
		
		(7)Symbol.toStringTag
			当对象调用toString()方法时,返回的结果会附带Symbol.toStringTag对应的值
			如:
				let obj={
					[Symbol.toStringTag]:lion
					作为方法必须时get方法
					get [Symbol.toStringTag](){
						return 'lion'
					}
				}
				obj.toString();	打印[object lion]
		
		(8)Symbol.unscopables
			当使用with方法时,无法获取到的属性
				with(对象){
					直接属性名即可获取,等同于对象.属性名
				}
			Array.prototype[Symbol.unscopables]可查看数组中不能使用with访问的属性

猜你喜欢

转载自blog.csdn.net/weixin_43294560/article/details/114551602
今日推荐