标签:es6 obj description Symbol 数据类型 let console symbol log
文章结构
创建symbol的方式
获取symbol的描述信息
注意事项
不能与其他数据类型进行运算
值是唯一的?分情况!
不能用for-in遍历
可以使用Reflect.ownkeys来获取定义的对象的所有键名,从而来遍历对象
应用场景
创建symbol方式
1 let s = Symbol(); 2 console.log(s,typeof s);//Symbol() 'symbol' 3 4 //传递一个字符串表示名,实际上s1和s2还是随机的,唯一的 5 let s1 = Symbol('zhangsan'); 6 let s2 = Symbol('zhangsqan'); 7 console.log(s1 === s2);//false 8 //第二种symbol.for创建们可以通过后面的标识符查询到,可以与后面的标识符一一对应 9 let s3 = Symbol.for('zhangsan'); 10 let s4 = Symbol.for('zhangsan'); 11 console.log(s3 === s4);//true
获取symbol的描述信息
1 let s = Symbol('zhangsan'); 2 console.log(s.description); // zhangsan
注意事项
不能与其他数据类型进行运算
1 let s5 = Symbol.for('1'); 2 s5 = s5 + 1;// Cannot convert a Symbol value to a number
值是唯一的?分情况!
1 let s1 = Symbol('zhangsan'); 2 let s2 = Symbol('zhangsan'); 3 let s3 = Symbol.for('zhangsan'); 4 let s4 = Symbol.for('zhangsan'); 5 /* 和 Symbol() 不同的是,用 Symbol.for() 方法创建的的 6 symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 7 并不是每次都会创建一个新的 symbol,它会首先检查给定的 8 key 是否已经在注册表中了。假如是,则会直接返回上次存储 9 的那个。否则,它会再新建一个。 */ 10 console.log(s1 === s2); // false 11 console.log(s3 === s4); // true
不能用for-in遍历
1 let obj = {}; 2 obj[Symbol("1")] = 1; 3 obj[Symbol("2")] = 2; 4 for (const key in obj) { 5 if (Object.hasOwnProperty.call(obj, key)) { 6 console.log(key); // 无输出,遍历不到 7 const element = obj[key]; 8 console.log(element); // 无输出,遍历不到 9 } 10 }
可以使用Reflect.ownKeys来获取定义的对象的所有键名,从而来遍历对象
1 let obj = {}; 2 obj[Symbol("1")] = 1; 3 obj[Symbol("2")] = 2; 4 obj.a = 3; 5 const result = Reflect.ownKeys(obj); 6 console.log(result); // [ 'a', Symbol(1), Symbol(2) ] 7 for (const index of result) { 8 console.log(obj[index]); // 3 1 2 9 }
应用场景
1 // 当我们需要向一个对象中添加方法时,如果我们不知道对象内部是怎么样的,如果直接添加可能会有命名冲突 2 let obj = { 3 up() { 4 console.log("xiangshang"); 5 }, 6 down() { 7 console.log("xiangxia"); 8 }, 9 }; 10 11 let symobj = { 12 up: Symbol(), 13 down: Symbol(), 14 }; 15 16 obj[symobj.up] = function() { 17 console.log("我是新添加的up方法"); 18 }; 19 20 obj[symobj.down] = function() { 21 console.log("我是新添加的down方法"); 22 }; 23 24 console.log(obj); 25 /* { 26 up: [Function: up], 27 down: [Function: down], 28 [Symbol()]: [Function (anonymous)], 29 [Symbol()]: [Function (anonymous)] 30 } */ 31 obj[symobj.down](); // 我是新添加的down方法
标签:es6,obj,description,Symbol,数据类型,let,console,symbol,log 来源: https://www.cnblogs.com/lzx-cm/p/16628256.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。