前言

小伙伴们大家好。不知道大家有没有遇到这样一种情况:在我们日常开发中,有时候可能会用到一些别人提供的对象,并且业务需要想要在这个对象的基础上进行一些扩展,添加一些属性或方法等。这个时候如果我们不了解对象结构的情况下,冒然去扩展,很有可能就会跟对象原有的属性或方法发生冲突。因为在ES5中对象的属性名都是以字符串的形式命名的,这就很容易造成属性名的冲突。而我们接下来要分享的小知识便可以很好的解决这一问题。那就是ES6中新增的一种原始数据类型 - Symbol

原始数据类型Symbol

Symbol是ES6中新增的一种原始数据类型。用它来表示一个独一无二的值。就像我们以前学过的NaN一样,NaN和NaN总是不相等的。同样Symbol和Symbol也总是不相等的。接下来我们看一下Symbol的用法和特点

  • Symbol的用法

    • Symbol的用法很简单,Symbol值是通过Symbol函数生成的。函数可以传递一个字符串类型的参数作为Symbol值的描述

         let s1 = Symbol();let s2 = Symbol('hello');
      
  • Symbol的特点
    • Symbol的值是独一无二的,每个Symbol值都是不同的
    • Symbol值是通过Symbol函数生成的,Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述
    • Symbol函数如果传递一个对象作为参数,则会调用对象的toString方法将对象转换为字符串
    • Symbol值不能与其他类型值进行运算,否则会报错
    • Symbol 值可以显式转为字符串或布尔值,但是不能转换为数字
    • Symbol作为对象的属性名时需要用方括号[]包裹
    • Symbol值作为对象属性名时,不能用点运算符。需要用:对象名[Symbol变量]的形式访问
    • Symbol类型还可以定义一组常量,以保证这组常量的值都是不相等的
    • Symbol作为对象属性名时,不会出现在for…in、for…of中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回,但是可以通过Object.getOwnPropertySymbols()方法获取Symbol类型的属性名
//1. Symbol的值是独一无二的
//2. Symbol值是通过Symbol函数生成的
let s1 = Symbol();
let s2 = Symbol();
console.log(s1===s2); //false//3. Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述
let s3 = Symbol('description');
let s4 = Symbol('description');
s3 === s4 ;//false//4. 给Symbol函数传递一个对象作为参数
let s5 = Symbol([1,2,3])
console.log(s5); // Symbol(1,2,3)//5. Symbol值不能与其他类型值进行运算
let s6 = Symbol('hello')
console.log(s6 + " world");// TypeError: can't convert symbol to string//6. Symbol 值可以显式转为字符串或布尔值,但是不能转换为数字
let s7 = Symbol('1')
String(s7);// Symbol(1)
s7.toString();// Symbol(1)
typeof s7 ;// "string"
Boolean(s7) //true
Number(s7);// TypeError: can't convert symbol to number//7. Symbol作为对象的属性名时需要用方括号[]包裹
//8. Symbol值作为对象属性名时,不能用点运算符。需要用:对象名[Symbol变量]的形式访问
let s8 = Symbol('obj');
let obj = {[s8]: 'hello world'
}
console.log(obj.s8);//undefined 这种情况s8会被认为是字符串属性,所以获取不到
console.log(obj[s8]);//hello world//9. Symbol类型还可以定义一组常量,以保证这组常量的值都是不相等的
const log = {};
log.levels = {DEBUG: Symbol('debug'),INFO: Symbol('info'),WARN: Symbol('warn')
};
console.log(log.levels.DEBUG, 'debug message');
console.log(log.levels.INFO, 'info message');//10. Symbol作为对象属性名时,不会出现在for...in、for...of中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回,但是可以通过Object.getOwnPropertySymbols()方法获取Symbol类型的属性名
const obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
obj.c = 'javascript'Object.keys();// ['c']
Object.getOwnPropertySymbols(obj);//[Symbol(a), Symbol(b)]

Symbol的使用场景

了解了Symbol的一些特点后,借助这些特点就可以做一些事情了。比如

  • 扩展其它人提供的对象
  • 消除魔术字符串
  • 为对象定义一些非私有的、但又希望只用于内部的方法
  • 定义一组常量等等

总结

今天我们又学到了ES6中的一个新知识Symbol,相信小伙伴们也感受到了Symbol的强大之处。关于Symbol的使用和特点就分享到这里了。下一篇文章将继续探索Symbol中一些内置的值以及它们的作用。感谢小伙伴们的支持。

喜欢的小伙伴欢迎点赞留言加关注哦!

听说ES6中新增了能够与众不同的Symbol数据类型相关推荐

  1. ES6中新增字符串方法,字符串模板

    ES6中新增字符串方法,字符串模板 多了两个新方法 startsWith endsWith 返回的是一个Boolean值 let str='git://www.baidu.com/2123123';i ...

  2. ES6中新增数组遍历方法

    ES6中新增的方法 遍历方法: forEach(),fifter(),some(): array.forEach(function(currentValue,index,arr)) // curren ...

  3. ES6 rest参数,扩展运算符,Symbol数据类型,迭代器和生成器 【详解加案例 】(二)

    文章目录 1.ES6 rest 参数 2. ES6 扩展运算符 2.1 ES6 简介 2.2 应用 3. ES6 Symbol 数据类型 3.1 Symbol两种创建方式 3.2 Symbol注意事项 ...

  4. ES6中新增的字符串方法

    实例方法:includes(), startsWith(), endsWith() 传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6 又提供 ...

  5. es6中新增对象的特性和方法

    1. 对象简写 //曾经假如是这样的var name = 'xxx'var obj = {name : name, say : function(){alert(this.name)}}//对象简写后 ...

  6. 二,ES6中新增const关键字的使用方法

    之前用var声明变量,变量想怎么改就怎么改,这里const关键字也是声明变量的,不过声明的是常量,常量就是固定的一个值,不能改变, 例如:const name="唐僧": name ...

  7. 33 ES6中的类和对象

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.面向对象 面向对象的思维特点: a.抽取(抽象)对象共有的属性和行为组织(封装)成一个 ...

  8. 什么?ES6 中还有 Tail Calls!

    前言 先吐槽一件事,最近把原先的 TOP 域名更换到 CN 域名,并且用 Gatsby 重建个人站点,之前是用采用 HTTPS 部署的方式绕过阿里云的域名备案系统.更换 CN 域名后,这招不管用了,? ...

  9. ES6学习笔记(四):教你轻松搞懂ES6的新增语法

    文章目录 let const let.const.var的区别 解构赋值 数组解构 对象解构 箭头函数 剩余参数 总结 let ES6新增的用于声明变量的关键字 let声明的变量只在所处于的块级有效 ...

最新文章

  1. Linux - Red Hat 7.3 介绍安装
  2. [TensorRT] ERROR: Network must have at least one output
  3. 剑桥大学Raven系统
  4. React的组件生命周期
  5. jpa和hibernate_使用JPA和Hibernate有效删除数据
  6. java bom json,JSON字符串带BOM头ufeff
  7. Android设计模式之——观察者模式
  8. 13 张图带你学懂 Kubernetes Service(转载)
  9. android获取短信息,从其ID Android获取短信详细信息
  10. iphone-common-codes-ccteam源代码 CCNSArray.m
  11. Underscore.js (1.7.0)-集合(Collections)(25)
  12. 杭电多校HDU 6579 Operation (线性基 区间最大)题解
  13. paddle serving
  14. css滚动条设置图标,更改滚动条上下箭头图标
  15. 帆软之FineReport填报报表
  16. 【SCI】【计算机视觉】【图像处理】一二三四区期刊推荐(自用版本)
  17. 电脑香港,香港购物:在HK买笔记本电脑都要注意什么?
  18. 计算机网络-网络安全
  19. python求15的因数_python学习第15期
  20. IV与PSI的理解--深入浅出

热门文章

  1. Windows系统本地搭建DedeCMS网站教程
  2. 区块链可以减少社会不平等吗?
  3. Vinted运营干货分享:Vinted国内使用详细步骤参考
  4. 在 vscode 上刷力扣 Leetcode 可以这样来
  5. 个人邮箱|如何群发邮件?3秒教你搞定
  6. 数据重塑_Google是否会重塑电话
  7. vue工作日历考勤记录表
  8. 蓝牙架构(4)—— 2 蓝牙系统架构 (2.0 核心系统架构)
  9. 实现PPT演示的"非全屏播放"效果
  10. 北大AI公开课13讲全链接+最强干货盘点:视频+笔记+文字实录