首页 > 其他分享 >Symbol类型的学习小结

Symbol类型的学习小结

时间:2022-08-14 18:02:51浏览次数:60  
标签:console log Symbol sym 学习 const 小结 symbol

symbol

ES6新增的一种原始类型,类似于字符串,表示独一无二的值(永不重复) 因为是基本类型所以不能用new关键字来调用,当然也不能添加属性

最佳实践:为了保证对象的属性名保持唯一, 也就是说对象的属性名有两种形式:String、Symbol

symbol初识

 

  • 生成:调用Symbol()函数可以直接生成一个symbol值,

 let sym = Symbol()
 ​
 console.log(sym) // Symbol()
 typeof sym // 'symbol'

 

  • 但为了方便区分,可以传入一个 字符串参数 作为对Symbol值的描述 所以即使拥有相同的参数,Symbol的返回值也是不相等的

 let s1 = Symbol("name1")
 let s2 = Symbol("name1")
 ​
 console.log(s1,s2)
 // Symbol(name1) Symbol(name1)
 ​
 // 描述相同的情况
 console.log(Symbol('s1') === Symbol('s1')); // false

也可以传入一个Object作为参数,生成symbol值的时候 会默认调用对象的toString()方法

 let obj = {}
 obj.toString = function(){ return "abc"} // 重写了obj本身的toString()
 ​
 const sym = Symbol(obj)
 console.log(sym) // Symbol(abc)

 

symbol的最佳实践

因为symbol的值永远不会重复,可以利用这一特性

将symbol作为对象的属性名,避免命名冲突

 const a = {};
 a[Symbol('symA')] = 'hello a';
 console.log(a); // {Symbol(): 'hello a'}
 ​
 // -----------------------------------------------
 const sym = Symbol('symB');
 const b = {
   [sym]: 'hello b',
 };
 console.log(b[sym]); // hello b
 ​
 // -----------------------------------------------
 const c = {};
 const symC = Symbol();
 Object.defineProperty(c, symC, { value: 'hello c' });
 console.log(c[symC]); // hello c
 ​
 // 也可以作为函数名

 

注意:作为属性名的时候不能使用“.”点运算符,否则会被认为读取的是字符串

symbol特性不可遍历

定义了symbol作为属性名,可以直接访问到

但是对于 forin、forof、Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()都无法直接直接获取到symbol的值

 let person = {
   name: 'zz',
   age: 12,
   [Symbol('rank')]: '优秀',
   [Symbol('rank')]: '有钱',
 };
 ​
 // 遍历属性名(获取不到 )
 for (const key in person) {
   console.log(key);
 }
 ​
 // 遍历属性值(报错)
 // Uncaught TypeError: person is not iterable
 // for (const iterator of person) {
 //  console.log(iterator);
 // }
 ​
 console.log(Object.keys(person));
 // ['name', 'age'] 获取不到
 ​
 console.log(JSON.stringify(person));
 // {"name":"zz","age":12}
 ​
 console.log(Object.getOwnPropertyNames(person));
 // ['name', 'age'] 获取不到
 ​

 

访问的方法:Object.getOwnPropertySymbols()返回一个symbol数组

 const arrSym = Object.getOwnPropertySymbols(person);
 // [Symbol(rank), Symbol(rank)]
 ​
 // 遍历数组的值
 for (let item of arrSym) {
   console.log(item); // 获取到了symbol的key
   console.log(person[item]); // 读symbol的value
 }

 

Reflect.ownKeys()返回所有类型的键名

 console.log(Reflect.ownKeys(person));
 // ['name', 'age', Symbol(rank), Symbol(rank)]

 

 

 

symbol的方法

symbol.prototype.description

方便的获取到symbol的描述参数

 sym.description // 'abc'
 ​
 // 在没有description()的时候,只能显式转换为字符串

 

symbol值的转换

一句换总结:不能转换为Number(不能参与运算),可以转换为 String、Boolean

 const sym = Symbol('symName');
 // 1. Number
 let n = Number(sym);
 // Uncaught TypeError: Cannot convert a Symbol value to a number
 console.log('this is hhh' + sym); // 模板字符串也打咩
 // Uncaught TypeError: Cannot convert a Symbol value to a string
 ​
 // 2. String
 let s = String(sym);
 console.log(s.toString());
 console.log(s);
 // Symbol(symName)
 ​
 // 3. Boolean
 console.log(Boolean(sym)); // true
 console.log(!sym); // false
 

 

 

 

 

标签:console,log,Symbol,sym,学习,const,小结,symbol
From: https://www.cnblogs.com/ecat-octopus/p/16585920.html

相关文章

  • vue学习之------组件命名
    1、短横线命名法使用时必须严格按照短横线名称进行使用。 2、驼峰命名法使用时,可以转成短横线,也能直接使用驼峰命名 ......
  • 【Spring5学习笔记】Bean管理:
    Bean管理:(1)Bean管理指的是两个操作(2)Spring创建对象(3)Spring注入属性Bean管理操作有两种方式:1、基于xml配置文件方式(1)在Spring配置文件中,使用bean标签,标签里添加对应的属......
  • 三次握手和四次挥手小结
    肯取势者可为人先,能谋势者必有所成三次握手1.注意状态的变化:有ClOSED、LISTEN、SYN-SEND、SYN-RECV及ESTABLISHED状态2.存在SYN报文和ACK报文,seq的值由各端自己确认,a......
  • Django中读取数据的一些学习
    Django中读取数据的一些学习关于元组的读取​ 当我们在写数据库架构时,我们需要考虑数据库内存,而经常的操作是,比如对于gender,固定值一般为男、女,但是一直写男女中文字符过......
  • docker swarm容器编排学习笔记
    1、介绍DockerSwarm 和DockerCompose一样,都是Docker官方容器编排项目不同点:DockerCompose是一个在单个服务器或主机上创建多个容器的工具,DockerSwarm则可以......
  • 学习python-周总结08
    周总结一、操作系统的发展史三大核心硬件CPU:计算机中真正干活的人内存:给CPU准备需要运行的代码硬盘:永远存储将来可能要被运行的代码注意:CPU是整个计算机执行效率......
  • Java学习 (20) Java数组篇(04)Arrays类&冒泡排序&稀疏数组
    目录Arrays类语法实例冒泡排序语法实例具体讲解视频(狂神说Java)稀疏数组语法实例具体讲解视频(狂神说Java)Arrays类教组的工具类java.util.Arrays由于数组对象本身并没有......
  • HCIA学习笔记十五:VLAN虚拟局域网
    一、VLAN的产生原因• 缺少转发控制手段的以太网1)交换机是可以分割冲突的,它的一个端口是一个冲突域,但是所有端口是在一个广播域里面。所以当前这个环境里面,它就是一个......
  • 机器学习(李宏毅)——终身学习笔记
    LifeLongLearning问题背景Lifelonglearning通常写为LLL,别名:ContinuousLearning、NeverEndigLearning以及Incremental(递增的、渐进的)Learning。难点:本来学完tas......
  • Java学习笔记之—java内存结构
    java内存结构之前一直是在学习c++,所以对c++的内存结构比较了解。但是目前由于工作需要从事Java开发,而自己对这方面的知识比较欠缺,所以从网络上阅读查看别人的学习总结,希望......