基础
Symbol是ES6引入的一种新的原始数据类型,表示独一无二的值。在此之前JavaScript中有六种数据类型(Number, String, Boolean, undefined
, null
, Object),这是第七种;
创建方式:let sym = Symbol()
, 可以接收参数作为描述,一般为字符串;即使是传入相同的字符串,Symbol值本身都是独一无二的;
let s = Symbol("name");
let s1 = Symbol(3);
alert(typeof s); // symbol
alert(s); // trysomething.html:11 Uncaught TypeError: Cannot convert a Symbol value to a string
console.log(s); // Symbol(name)
console.log(s1); // Symbol(3)
可以通过String()
/toString()
/Boolean()
方法对其转换类型,但是不能直接将Symbol值用于运算(如字符拼接、数学计算等),也不能用Number()
转换为数值,会报错;
console.log(s1+2); //Uncaught TypeError: Cannot convert a Symbol value to a number
console.log(Number(s1)+2); //Uncaught TypeError: Cannot convert a Symbol value to a number
console.log(String(s1)+2); //Symbol(3)2
console.log(Boolean(s1)+2); //3
只要被创建且为更改为其他类型,所有Symbol值转换为Boolean值都是true
;
Symbol值作为对象的属性名,必须放在方括号之中,不能用点操作符;该属性是公开属性;
Symbol属性名的遍历
Object.getOwnPropertySymbols()
方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
Reflect.ownKeys()
方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
Symbol.for(), Symbol.keyFor()
Symbol.for()
接受一个字符串作为参数,如果已经有以该字符串命名的Symbol值就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。只有Symbol.for()
创建的值可以被登记于全局并供之后的Symbol.for()
搜索,而Symbol()
创建的值一定是独一无二的值;
let a = Symbol("time");
let b = Symbol.for("time");
let c = Symbol.for("time");
console.log(a === b); // false
console.log(c === b); // true
Symbol.keyFor()
方法返回一个已登记的 Symbol 类型值的key
。
内置的Symbol值
(感觉这部分需要用起来才能理解和记忆,先保留大概印象,需要时再去教程中复习)
ES6定义了11个内置的Symbol值,指向语言内部使用的方法;
- 对象的
Symbol.hasInstance
属性,指向一个内部方法,当其他对象调用instanceof
运算符,判断是否为该对象的实例时,会调用这个方法; - 对象的
Symbol.isConcatSpreadable
属性等于一个布尔值,表示该对象用于Array.prototype.concat()
时,是否可以展开。 - 对象的
Symbol.species
属性,指向一个构造函数。创建衍生对象时,会使用该属性。 - 对象的
Symbol.match
属性,指向一个函数。当执行str.match(myObject)
时,如果该属性存在,会调用它,返回该方法的返回值。 - 对象的
Symbol.replace
属性,指向一个方法,当该对象被String.prototype.replace
方法调用时,会返回该方法的返回值。 - 对象的
Symbol.search
属性,指向一个方法,当该对象被String.prototype.search
方法调用时,会返回该方法的返回值。 - 对象的
Symbol.split
属性,指向一个方法,当该对象被String.prototype.split
方法调用时,会返回该方法的返回值。 - 对象的
Symbol.iterator
属性,指向该对象的默认遍历器方法。 - 对象的
Symbol.toPrimitive
属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。 - 对象的
Symbol.toStringTag
属性,指向一个方法。在该对象上面调用Object.prototype.toString
方法时,如果这个属性存在,它的返回值会出现在toString
方法返回的字符串之中,表示对象的类型。也就是说,这个属性可以用来定制[object Object]
或[object Array]
中object
后面的那个字符串。 - 对象的
Symbol.unscopables
属性,指向一个对象。该对象指定了使用with
关键字时,哪些属性会被with
环境排除。