数据类型Symbol
文章目录
- 前言
- 概述
- 方法
- 内置的symbol值
- Symbol.hasInstance
- Symbol.match
前言
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。为了保证属性名的独一无二ES6 引入了一种新的Symbol
概述
Symbol
值通过Symbol()
函数生成。
可以接受一个字符串作为参数,表示对 Symbol 实例的描述。
即使描述一样 但symbol并不会一样
let s=Symbol()
console.log(s);
//输出Symbol()let r=Symbol('123')
console.log(r);
//输出Symbol(123)let a1=Symbol('11')
let a2=Symbol('11')
console.log(a1===a2);
//输出false
描述只是让人容易区分,并其可以转换为字符串,(内部为对应描述的值)
let st=Symbol('11111')
console.log(String(st));
//输出Symbol(11111)
方法
前面提到的描述值可以通过Symbol().description
获取
如下
let st=Symbol('11111')
console.log( st.description);
//输出11111
symbol用于属性名
使用【】包围
let a=Symbol(111)
const obj={}
obj[a]='123456789'
obj.a='qwesaf'
console.log(obj.a);
console.log(obj[a]);
如上,通过obj.a
访问时,由于.运算符默认解析为字符串,也就有了属性名为a(String类型)
的属性
而通过symbol定义的属性其属性名为a(Symbol值)
a在此指代的是对应的Symbol
遍历类型为Symbol的属性名
Symbol 值作为属性名,遍历对象的时候,该属性不会出现在for…in、for…of循环中,
通过Object.getOwnPropertySymbols()
可以获取所有的symbol值,返回类型为数组
let a=Symbol(111)
let b=Symbol(222)
const obj={}
obj[a]='123456789'
obj[b]='7777'
let arr= Object.getOwnPropertySymbols(obj)
console.log(arr);
//输出[ Symbol(111), Symbol(222) ]
内置的symbol值
ES6 提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。
Symbol.hasInstance
对象的Symbol.hasInstance
属性,指向一个内部方法。当其他对象使用instanceof
运算符,判断是否为该对象的实例时,会调用这个方法。
class classa{[Symbol.hasInstance](f) {return f instanceof Array;}
}console.log([1,2,3] instanceof new classa());
其中instanceof
之前的值会被后面的类的对应内部方法接收,此处被f
接收
Symbol.match
对象的Symbol.match属性,指向一个函数。当执行str.match(myObject)时,如果该属性存在,会调用它,返回该方法的返回值。
class classa{[Symbol.match](s) {return (`match调用,参数是${s}`)}
}console.log('abc'.match(new classa()));
如上 match的参数是被调用的对象