天天看點

ES6-第十一天

Symbol

  1. Symbol.prototype.description
//建立 Symbol 的時候,可以添加一個描述。
	const sym = Symbol('hi');  //這裡的描述就是字元串hi
	//讀取這個描述需要将 Symbol 顯式轉為字元串
	const sym = Symbol('hello');
	sym.description // "hello"
           
  1. 作為屬性名的 Symbol
//每一個 Symbol 值都是不相等的,這意味着 Symbol 值可以作為辨別符,用于對象的屬性名,就能保證不會出現同名的屬性
	let mySymbol = Symbol();
	// 第一種寫法
	let a = {};
	a[mySymbol] = 'Hello!';
	// 第二種寫法
	let a = {
	  [mySymbol]: 'Hello!'
	};
	// 第三種寫法
	let a = {};
	Object.defineProperty(a, mySymbol, { value: 'Hello!' });
	// 以上寫法都得到同樣結果
	a[mySymbol] // "Hello!"
           
  1. 屬性名的周遊
//Symbol 作為屬性名,周遊對象的時候,該屬性不會出現在for...in、for...of循環中,也不會被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()傳回。
	//但它也不是私有屬性,有一個Object.getOwnPropertySymbols()方法,可以擷取指定對象的所有 Symbol 屬性名。該方法傳回一個數組,成員是目前對象的所有用作屬性名的 Symbol 值。
	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)]
           
  1. Symbol.for(),Symbol.keyFor()
//Symbol.for()與Symbol()這兩種寫法,都會生成新的 Symbol。它們的差別是,前者會被登記在全局環境中供搜尋,後者不會。Symbol.for()不會每次調用就傳回一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,如果不存在才會建立一個值。
	console.log(Symbol.for("bar") === Symbol.for("bar")// true
	console.log(Symbol("bar") === Symbol("bar")  // false
	
	//Symbol.keyFor()方法傳回一個已登記的 Symbol 類型值的key。
	let s1 = Symbol.for("hi");
	Symbol.keyFor(s1) // "hi"
	
	let s2 = Symbol("hi");
	Symbol.keyFor(s2) // undefined