什么是symbol?
在JavaScipt中有两种类型的数据类型:基本数据类型和复杂数据类型:
基本数据类型包含字符串(String)
、数字(Number)
、布尔(Boolean)
、空(Null)
、未定义(Undefined)
,symbol
;
复杂数据类型(对象类型)包含对象(Object)
,数组(Array)
,函数(function)
以及两个特殊的类型正则(Reg)
和日期(Date)
;
而symbol
是js中的第7种基本数据类型,是es6中新增加的一种基本数据类型,它被用来表示一个独一无二的值。
symbol的使用
在js中你可这样创建一个symbol:
const a = Symbol();
console.log(a); //Symbol()
const a1 = Symbol(123);
console.log(a1); //Symbol(123)
检测数据类型:
console.log(typeof (a, a1)); //symbol
下面我把相同的值赋给不同的symbol:
const a = Symbol(1);
const b = Symbol(1);
console.log(a, b);//Symbol(1) Symbol(1)
//判断是否相等
console.log(a == b); //false
尽管它们的值是一样的,但是打印出来的判断结果却是false
,它们在栈内存中看起来是这样的,这正是它的特性:一个Symbol类型的变量只是为了标记一块唯一的内存而存在的;
Symbol的主要作用
因为Symbol独一无二的特性,所以使用symbol给对象命名,可以保证对象属性不重名;
使用symbol作为对象的属性名:
const name = Symbol();
const age = Symbol();
let xiaoming = {
[name]: '小明',
[age]: 18,
}
console.log(xiaoming); //Symbol(): "小明";Symbol(): 18
Symbol的内置属性值
Symbol.hasInstance
:其它对象使用instanceof运算符的时候会使用该属性名指向的内部方法。
Symbol.isConcatSpreadable
:可以直接定义为对象属性或继承而来,它是布尔类型。它可以控制数组或类似数组(array-like)的对象的行为:
1.对于数组对象,默认情况下,用于concat时,会按数组元素展开然后进行连接(数组元素作为新数组的元素)。重置Symbol.isConcatSpreadable可以改变默认行为。
2.对于类似数组的对象,用于concat时,该对象整体作为新数组的元素,重置Symbol.isConcatSpreadable可改变默认行为。
Symbol.species
:species 访问器属性允许子类覆盖对象的默认构造函数。
Symbol.match
:指定了匹配的是正则表达式而不是字符串。String.prototype.match() 方法会调用此函数。此函数还用于标识对象是否具有正则表达式的行为。
比String.prototype.startsWith()String.prototype.endsWith() 和 String.prototype.includes() 这些方法会检查其第一个参数是否是正则表达式,是正则表达式就抛出一个TypeError。现在,如果 match symbol设置false(或者一个 假值),就表示该对象不打算用作正则表达式对象。
Symbol.replace
:这个属性指定了当一个字符串替换所匹配字符串时所调用的方法。
Symbol.search
:指定了一个搜索方法,这个方法接受用户输入的正则表达式,返回该正则表达式在字符串中匹配到的下标,这个方法由以下的方法来调用 String.prototype.search()。
Symbol.split
:指向 一个正则表达式的索引处分割字符串的方法。
Symbol.iterator
:为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。
Symbol.toPrimitive
:是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
Symbol.toStringTag
:是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 Object.prototype.toString() 方法会去读取这个标签并把它包含在自己的返回值里。
Symbol.unscopables
:指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。