<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Symbol</title> </head> <body> <script> /*Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。*/ // let s = Symbol(); // console.log(typeof s);//symbol /*Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。*/ // let s1 = Symbol('foo'); // let s2 = Symbol('bar'); // console.log(s1.toString()) // "Symbol(foo)" // console.log(s2.toString()) // "Symbol(bar)" /*普通Symbol方法*/ // 没有参数的情况 // let s1 = Symbol(); // let s2 = Symbol(); // console.log(s1 === s2) // false // 有参数的情况 // let s1 = Symbol('foo'); // let s2 = Symbol('foo'); // console.log(s1 === s2) // false /*Symbol.for方法,调用Symbol.for("abc")30 次,每次都会返回同一个 Symbol 值,但是调用Symbol("abc")30 次,会返回 30 个不同的 Symbol 值*/ // let s1 = Symbol.for('foo'); // let s2 = Symbol.for('foo'); // console.log(s1 === s2) // true /*Symbol.keyFor方法返回一个已登记的 Symbol 类型值的key,Symbol.for为 Symbol 值登记的名字,是全局环境的,可以在不同的 iframe 或 service worker 中取到同一个值*/ // let s1 = Symbol.for("abc"); // console.log(Symbol.keyFor(s1)) // "abc" // let s2 = Symbol("abc"); // console.log(Symbol.keyFor(s2)) // undefined /*Symbol 值可以作为标识符,用于对象的属性名,Symbol 值作为对象属性名时,不能用点运算符,Symbol 值必须放在方括号之中*/ // let mySymbol = Symbol(); // // 第一种写法 // let a = {}; // a[mySymbol] = 'Hello!'; // // 第二种写法 // let a = { // [mySymbol]: 'Hello!' // }; // // 第三种写法 // let a = {}; // Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // // 以上写法都得到同样结果 // console.log(a[mySymbol]) // "Hello!" /*消除魔术字符串*/ // const obj = { // str1: Symbol(), // str2: Symbol() // }; // function getNum(arg, options) { // let num = 0; // switch (arg) { // case obj.str1: // num = options.w + options.h; // break; // case obj.str2: // num = options.w - options.h; // break; // } // return num; // } // console.log(getNum(obj.str1, { w: 200, h: 100 }));//300 // console.log(getNum(obj.str2, { w: 200, h: 100 }));//100 /*Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。*/ // const obj = {}; // let a = Symbol('a'); // let b = Symbol('b'); // obj[a] = 'Hello'; // obj[b] = 'World'; // const objectSymbols = Object.getOwnPropertySymbols(obj); // console.log(objectSymbols)// [Symbol(a), Symbol(b)] /*Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和 Symbol 键名*/ // let obj = { // [Symbol('abc')]: 1, // name: 2, // age: 3 // }; // console.log(Reflect.ownKeys(obj))//(3) ["name", "age", Symbol(abc)] </script> </body> </html>
备注:文中多数内容摘自阮一峰老师文章,仅供自我学习查阅。