Symbol

一、概述

ES6之前JavaScript有六种数据类型,分别是Number、String 、Boolean、Undefined、Null和Object.在ES6中新引入了一种新的原始数据类型Symbol,它表示独一无二的值。

Symbol值通过Symbol函数生成。也就是说对象的属性名现在可以有两种类型:一种是字符串;另一种就是Symbol类型。只要属性值是Symbol类型,就是独一无二的,不会与其他属性名产生冲突。

var s1 = Symbol('foo');
var s2 = Symbol('bar');
s1   //  Symbol(foo)
s2  // Symbol(bar)

s1.toString()   //"Symbol(foo)" 
s2.toString()  // "Symbol(bar)"

上面代码中,s1和s2都是Symbol值。

(1)注意Symbol函数的只表示对当前Symbol值的描述,因此相同参数的Symbol函数返回值是不相等的。

// 没有参数的情况
let s1 = Symbol();
let s2 = Symbol();

s1 === s2 // false

// 有参数的情况
let s1 = Symbol('foo');
let s2 = Symbol('foo');

s1 === s2 // false

上面代码中,s1和s2都是Symbol函数的返回值,而且参数相同,但是它们是不相等的。

(2)Symbol 值不能与其他类型的值进行运算,会报错。

let sym = Symbol('My symbol');

"your symbol is " + sym
// TypeError: can't convert symbol to string

二、作为属性名的Symbol

let mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};

// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

上面代码通过方括号和Object.defineProperty,将属性名指定为Symbol值

注意,Symbol 值作为对象属性名时,不能用点运算符。

三、属性名的遍历

Symbol作为属性名,但该属性不会出现在for···infor···of循环中,因此也不会被Object.key()Object.getOwnPropertyName()JSON.string()返回.但是她不是私有属性,有一个Objecct.getOwnPropertySymbols方法可以获取Symbol属性名。

Objecct.getOwnPropertySymbols方法返回一个数组。

const obj = {};
let a = Symbol('a');
let b = Symbol('b');

obj[a] = 'Hello';
obj[b] = 'World';

const objectSymbols = Object.getOwnPropertySymbols(obj);

objectSymbols
// [Symbol(a), Symbol(b)]

四、Symbol.for()、Symbol.keyfor()

(1)Symbol.for方法可以让我们重新使用同一个Symbol值。它接受一个字符串作为参数,搜索有没有该参数作为名称的Symbol值。有,就返回这个Symbol值;没有就新建一个并返回。
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true

上面代码中,s1和s2都是 Symbol 值,但是它们都是同样参数的Symbol.for方法生成的,所以实际上是同一个值。

(2)Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

上面代码中,变量s2属于未登记的 Symbol 值,所以返回undefined。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象...
    赵然228阅读 4,208评论 2 10
  • 概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加...
    oWSQo阅读 3,529评论 1 3
  • Symbol:一种新的原始数据类型,表示独一无二的值。 引入Symbol的原因:ES5 的对象属性名都是字符串,这...
    Rose_yang阅读 2,688评论 0 0
  • 今天是农历腊月三十,是2016年的最后一天,即除夕。“除夕”, 据《吕氏春秋季冬记》中记载说:古人在新年的前一天...
    蔚霐阅读 2,999评论 0 1
  • 萧红的人生应该是在她16岁的时候正式启幕的,那是1927年,萧红小学毕业后,辍学在家。一年后,在祖父的支持下,她才...
    醉茶子阅读 3,733评论 0 4

友情链接更多精彩内容