ECMAScript6之Symbol————呱呱二号

{
//学习Symbol
}
{
//1、Symbol叙述
/*
* ES5 的对象属性名都是字符串,这容易造成属性名的冲突。
* 比如,你使用了一个他人提供的对象,但又想为这个对象
* 添加新的方法(mixin 模式),新方法的名字就有可能与
* 现有方法产生冲突。如果有一种机制,保证每个属性的名字
* 都是独一无二的就好了,这样就从根本上防止属性名的冲突。
* 这就是 ES6 引入Symbol的原因。
*/
let s = Symbol();
typeof s;

//可以接受一个字符串作为参赛,表示Symbol实例的描述
let s1 = Symbol('fruit');
let s2 = Symbol('fish');

s1; //Symbol(fruit)
s2; //Symbol(fish)

s1.toString(); //"Symbol(fruit)"
s2.toString(); //"Symbol(fish)"

//Symbol如果不添加描述,在控制台打印出来的s1,s2都是Symbol();
//不利于区分,估产生了传递参数,描述Symbol
}
{
//2、作为属性名的Symbol
let mySymbol = Symbol();
//第一种写法
let a = {};
a[mySymbol] = '水果a';
//第二种写法
let b = {
[mySymbol]: '水果b'
};
//第三种写法
let c = {};
Object.defineProperty(
c,
mySymbol,
{
value:'水果c',
writable: false,
configurable: false,
}
);
console.log(a[mySymbol],'a');
console.log(b[mySymbol],'b');
console.log(c[mySymbol],'c');
//mySymbol必须放在中括号中,否则表示mySymbol表示的是字符串而已
console.log(a.mySymbol,'注意,Symbol 值作为对象属性名时,不能用点运算符。赋值的时候也不可以'); //不允许这样访问的
}
{
//3、属性名的遍历
// Symbol 作为属性名,该属性不会出现在for...in、for...of循环中,
// 也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
// 但是,它也不是私有属性,有一个Object.getOwnPropertySymbols方法,
// 可以获取指定对象的所有 Symbol 属性名。
let aSymbol = Symbol('a');
let bSymbol = Symbol('b');
let obj = {
[aSymbol]: 'a',
[bSymbol]: 'b',
c: 'c',
d: 'd'
};
console.log(obj);
//不会遍历obj中*Symbol属性
for(let value in obj){
console.log(value);
}
//不过可以通过Object.getOwnPropertySymbols方法返回一个数组,
//成员是当前对象所有用作属性名的Symbol值
const objSymbols = Object.getOwnPropertySymbols(obj)
console.log(objSymbols);
//获取所有非Symbol的对象属性
const objNotSymbolKeys = Object.getOwnPropertyNames(obj);
console.log(objNotSymbolKeys);
//如果想要获取对象全部属性的名称,则使用ES6中新的API Reflect中的ownKeys()
const objAllKeys = Reflect.ownKeys(obj);
console.log(objAllKeys);
}

{
//4、Symbol.for(),Symbol.keyFor()

//Symbol.for()找回带描述的Symbol类型
//Symbol.keyFor()找回当前Symbol的描述

// 有时,我们希望重新使用同一Symbol值,Symbol.for()方法可以做到这一点,
// 他接受一个字符串作为参数,然后搜索有没有以该参数作为名称Symbol值。
// 作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回
// 一个以该字符串炜名称的Symbol值
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

// Symbol.for()与Symbol()这两种写法,都会产生新的Symbol,
// 他们的区别是,前者会被登记在全局环境中供搜索,后者不会
// Symbol.for() 不会每次都调用就返回一个新的Symbol类型的值,
// 而是先检查给定的key是否存在,如果不存在才会建一个值。
// 比如,如果你调用Symbol.for("cat")30 次,每次都会返回
// 同一个 Symbol 值,但是调用Symbol("cat")30 次,会
// 返回 30 个不同的 Symbol 值。
// Symbol.keyFor(s1); // bar
Symbol.for("bar") === Symbol.for("bar");
Symbol("bar") === Symbol("bar");

console.log(Symbol.keyFor(s1));
console.log(Symbol.for('foo'));
}
{
//5、Symbol内置的Smybol值
//Symbol.hasInstance
//Symbol.isConcatSpreadable
//Symbol.species
//Symbol.match
//Symbol.replace
//Symbol.search
//Symbol.split
//Symbol.iterator
//Symbol.toPrimitive
//Symbol.toStringTag
//Symbol.unscopables
}
posted @ 2018-01-03 16:31  呱呱二号  阅读(176)  评论(0编辑  收藏  举报