概述

为了减少对象的属性名冲突,ES6引入新的原始数据类型Symbol,JS的第七种数据类型。

Symbol 能够保证每个属性的名字都是独一无二,这样就能从根本上防止属性名冲突。

Symbol 值能够通过Symbol函数生成,也就是说,对象的属性名现在可以有2种类型,一种就是原来的字符串,另一种就是新增的Symbol 类型。

let s = Symbol()
console.log(s) // Symbol()
  • Symbol函数前不使用new命令,因为生成的Symbol是一个原始类型的值,不是对象,那么,也就不能添加属性(类似于字符串的数据类型)

  • Symbol函数乐意接受一个字符串作为参数,表示Symbol实例的描述,主要是为了在控制台显示,或者转化为字符串为了区分(注意,相同参数返回值是不相同的!)

let s1 = Symbol('s1')
let s2 = Symbol('s2')
let s3 = Symbol('s2')
console.log(s1,s2) // Symbol(s1) Symbol(s2)
console.log(s1.toString(),s2.toString()) // Symbol(s1) Symbol(s2)
console.log(s2 == s3) // false
console.log(s2 === s3) // false

作为属性名的Symbol

Symbol值可以作为标识符用于对象的属性名,保证不会出现同名的属性。这对于一个对象有多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

let mySymbol = Symbol()
/** 第一种写法 */
let a1 = {}
a1[mySymbol] = 'holle!'
/**第二种写法 */
let a2 = {
[mySymbol]: 'holle!'
}
/**第三种写法 */
let a3 = {}
Object.defineProperty(a3, mySymbol, { value: 'holle!'}) console.log(a1[mySymbol]) // holle!
console.log(a2[mySymbol]) // holle!
console.log(a3[mySymbol]) // holle!

注意:Symbol值作为对象的属性名不能使用点运算符,点后面是字符串,不是Symbol类型!

同理。在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号中

Symbol定义常量

常量使用Symbol值的最大的好处就是,其他任何值都不可能有相同的值了。

let log = {}
log.levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn')
} console.log(log.levels.DEBUG, log.levels.INFO) // Symbol(debug) Symbol(info)

消除魔术字符串

魔术字符串是指,在代码中多次出现、与代码形成强耦合的某一个具体字符串或数值。风格良好的代码,应该尽量消除魔术字符串,而又含义清晰的变量代替。

/* 字符串Triangle就是一个魔术字符串。它多次出现,与代码形成“强耦合”,不利于将来的修改和维护。 */
function getArea(shape, options) {
let area = 0;
switch (shape) {
case 'Triangle': // 魔术字符串
area = .5 * options.width * options.height;
break; /* ... more code ... */
}
return area;
} getArea('Triangle', {
width: 100,
height: 100
}); // 魔术字符串

常用的消除魔术字符串的方法,就是把它写成一个变量。

const shapeType = {
triangle: 'Triangle'
}; function getArea(shape, options) {
let area = 0;
switch (shape) {
case shapeType.triangle:
area = .5 * options.width * options.height;
break;
}
return area;
} getArea(shapeType.triangle, {
width: 100,
height: 100
});

我们把Triangle写成shapeType对象的triangle属性,这样就消除了强耦合。

可以发现shapeType.triangle等于哪个值并不重要,只要确保不会跟其他shapeType属性的值冲突即可。

const shapeType = {
triangle: Symbol()
};

属性名的遍历

Symbol 属性遍历:Object.getOwnPropertySymbols 方法获取指定对象的所有Symbol 属性。

let keySymbolName = Symbol('name')
let keySymbolAge = Symbol('age')
var a = {
[keySymbolName]: 'houfee',
[keySymbolAge]: 24
}
let arr = Object.getOwnPropertySymbols(a)
console.log(arr); //  [Symbol(name), Symbol(age)]

ES6 之 第七种数据类型Symbol的更多相关文章

  1. 【面试题】JS第七种数据类型Symbol详解

    JS第七种数据类型Symbol详解 点击打开视频讲解更加详细 一.什么是Symbol? Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值.它是JavaScript中的第 七种 ...

  2. Symbol -- JavaScript 语言的第七种数据类型

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...

  3. ES6学习笔记(八)第七种类型Symbol

    1.概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种 ...

  4. 细说 JavaScript 七种数据类型

    在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...

  5. JavaScript 七种数据类型

    在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...

  6. JavaScript的七种数据类型

    我知道这个话题网上说法非常多,甚至还有分出什么"Array,Function"之类的阿猫阿狗的类型.今天来整理这个话题的时候,先贴一张MDN官方的说法: 这个分法是对的,也是目前来 ...

  7. JavaScript中七种数据类型·中·一

    Standing on Shoulders of Giants; 说到JavaScript里的类型很容易就让人想起 42和"42",分别是string型和number型,但是他们可 ...

  8. php 七种数据类型介绍

    PHP有7个数据类型.七个类型: 字符串, 整数, 浮动, 布尔, 数组, 对象, 资源. 字符串 字符串保持字符,如“一”.“abc”,“www.manongjc.com”等.PHP字符串是区分大小 ...

  9. 面试中经常问到的Redis七种数据类型,你都真正了解吗?

    前言 Redis不是一个简单的键值对存储,它实际上是一个支持各种类型数据结构的存储.在传统的键值存储中,是将字符串键关联到字符串值,但是在Redis中,这些值不仅限于简单的字符串,还可以支持更复杂的数 ...

随机推荐

  1. sourcetree的安装

    参考博文: SourceTree安装教程和GitLab配置详解 关于Atlassian无法注册的问题 SourceTree跳过Atlassian账号,免登陆,跳过初始设置 sourcetree跳过注册 ...

  2. 066、Java面向对象之以分步的方式实例化对象

    01.代码如下: package TIANPAN; class Book { // 定义一个新的类 String title; // 书的名字 double price; // 书的价格 public ...

  3. 项目上线后,遇到IE浏览器不显示大部分组件的问题

    document.addEventListener('touchmove',(evt)=>{ }) 以上是ES6 语法,箭头函数,当然在IE下是不行的啦. 所以改为:ES5语法 document ...

  4. Linux学习总结《shell脚本》知识点关键-用好“过滤器”

  5. EditText标签的使用

    前文: 介绍EditText的使用,这个是文本输入控件,用来输入文本内容 使用: EditText继承TextView所以TextView的东西EditText都可以使用 text:显示文本 text ...

  6. 统计返回的Decimal/long型数据转换问题

    mysql数据库在进行统计时候,返回的count()是个long型,sum()返回的是bigDecimal类型,前段需要的是int型故而需要进行转换. <select id="getD ...

  7. Centos7安装rabbitMQ3.6.0

    文章中的erlang和rabbitmq3.6.0 http://pan.baidu.com/s/1c2Nn64w ​ Centos7 系统操作 cd /etc/yum.repos.d/ mv Cent ...

  8. net GC 学习以及问题

    引用对象必要空间开销:对象指针.同步块索引 GC重要点: 每个应用程序包含一组根,每个根都是一个存储位置,其中包含指向引用类型对象的一个指针,该指针要么指向托管堆中的要给对象,要么为null.(这句话 ...

  9. 逆向-PE重定位表

    重定位表 ​ 当链接器生成一个PE文件时,会假设这个文件在执行时被装载到默认的基地址处(基地址+RVA就是VA).并把code和data的相关地址写入PE文件.如果像EXE一样首先加载就是它image ...

  10. Promise 与 await 组合使用

    看例子就行了,废话不多说!   async function checkStatus(name){   return new Promise((resolve,reject) => {      ...